> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.easyfiling.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

#  EasyFiling Partner Formation API

# EasyFiling Partner Formation API

This guide explains how partner platforms can submit company formation requests to EasyFiling.

The partner platform collects the customer and company details, sends the request to EasyFiling, and then checks order progress through the API. EasyFiling handles the internal review, filing work, and final formation documents.

## Base URL

Use the base API URL provided by EasyFiling.

```text
Production: https://api.example.com/api
Sandbox:    https://sandbox-api.example.com/api
```

Replace the example domains with the URL shared by EasyFiling.

## Authentication

Every request must include the partner credentials provided by EasyFiling.

```http
X-Partner-Client-Id: pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X-Partner-Secret: your_partner_secret
Content-Type: application/json
Accept: application/json
```

The client secret is shown only once when credentials are created. Store it securely. If it is lost or exposed, ask EasyFiling to regenerate it.

## Endpoints

| Method | Endpoint | Purpose |
| ---- |
| `POST` | `/v1/partner/formation/quotes` | Calculate estimated formation pricing |
| `POST` | `/v1/partner/formation/orders` | Submit a formation order |
| `GET` | `/v1/partner/formation/orders/{externalOrderId}` | Check order status and progress |

## 1. Get Formation Quote

Use this endpoint before creating an order to show or verify formation pricing.

```http
POST /api/v1/partner/formation/quotes
```

### Request Body

```json
{
  "company_state_id": "uuid-of-company-state",
  "company_plan_id": "uuid-of-company-plan",
  "company_structure_id": "uuid-of-company-structure"
}
```

### Successful Response

```json
{
  "status": true,
  "message": "Formation quote generated successfully.",
  "data": {
    "currency": "USD",
    "state_fee": 100,
    "plan_fee": 199,
    "total": 299,
    "line_items": [
      {
        "code": "state_fee",
        "name": "Wyoming State Fee",
        "amount": 100
      },
      {
        "code": "company_plan",
        "name": "Basic Plan",
        "amount": 199
      }
    ]
  }
}
```

## 2. Submit Formation Order

Use this endpoint to create the EasyFiling company formation request.

```http
POST /api/v1/partner/formation/orders
```

### Important Behavior

* `external_order_id` must be unique per partner.
* If the same `external_order_id` is sent again, EasyFiling returns the existing order instead of creating a duplicate.
* Formation documents are not uploaded by the partner API. EasyFiling prepares and uploads final documents internally.

### Request Body

```json
{
  "external_order_id": "partner-order-10001",
  "external_customer_id": "partner-customer-501",
  "customer": {
    "name": "Jane Founder",
    "email": "jane@example.com",
    "calling_code": "+1",
    "phone": "5551234567"
  },
  "personal_info": {
    "calling_code": "+1",
    "phone": "5551234567",
    "city": "Austin",
    "region": "Texas",
    "postal_code": "78701"
  },
  "company": {
    "name": "Example Ventures LLC",
    "calling_code": "+1",
    "phone": "5551234567",
    "email": "company@example.com",
    "website": "https://example.com",
    "address": "100 Main Street, Austin, TX 78701",
    "description": "Software consulting company",
    "industry_id": "uuid-of-industry",
    "company_structure_id": "uuid-of-company-structure",
    "company_designator_id": "uuid-of-company-designator",
    "company_state_id": "uuid-of-company-state",
    "company_plan_id": "uuid-of-company-plan",
    "registration_type": "new_register",
    "protect_privacy": true,
    "operating_address": "100 Main Street, Austin, TX 78701"
  },
  "officer_detail": [
    {
      "name": "Jane Founder",
      "officer_level_id": "uuid-of-officer-level",
      "ownership": "100",
      "address": "100 Main Street, Austin, TX 78701",
      "responsible": true
    }
  ],
  "payment_detail": {
    "payment_id": "partner-payment-90001",
    "payment_mode": "partner_platform",
    "paid_amount": 299
  }
}
```

### Required Fields

Top level:

* `external_order_id`
* `customer.name`
* `customer.email`

Company:

* `company.name`
* `company.email`
* `company.company_structure_id`
* `company.company_designator_id`
* `company.company_state_id`
* `company.company_plan_id`

Optional but recommended:

* `external_customer_id`
* `customer.phone`
* `customer.calling_code`
* `company.phone`
* `company.address`
* `company.description`
* `company.industry_id`
* `officer_detail`
* `payment_detail.payment_id`
* `payment_detail.paid_amount`

### Successful Response

```json
{
  "status": true,
  "message": "Partner formation order submitted successfully.",
  "data": {
    "id": "easyfiling-partner-order-uuid",
    "external_order_id": "partner-order-10001",
    "external_customer_id": "partner-customer-501",
    "status": "submitted",
    "idempotent": false,
    "submitted_at": "2026-07-18T06:30:00.000000Z",
    "quote": {
      "currency": "USD",
      "state_fee": 100,
      "plan_fee": 199,
      "total": 299
    },
    "company": {
      "id": "easyfiling-company-uuid",
      "name": "Example Ventures LLC",
      "email": "company@example.com",
      "status": "active",
      "formation_date": null,
      "source": "partner_api",
      "progress": [],
      "documents": []
    }
  }
}
```

### Duplicate Submission Response

If the same `external_order_id` is submitted again, the existing order is returned.

```json
{
  "status": true,
  "message": "Partner formation order already exists.",
  "data": {
    "external_order_id": "partner-order-10001",
    "status": "submitted",
    "idempotent": true,
    "company": {
      "id": "easyfiling-company-uuid",
      "name": "Example Ventures LLC"
    }
  }
}
```

## 3. Check Formation Order Status

Use this endpoint to fetch the current EasyFiling order state.

```http
GET /api/v1/partner/formation/orders/{externalOrderId}
```

Example:

```http
GET /api/v1/partner/formation/orders/partner-order-10001
```

### Successful Response

```json
{
  "status": true,
  "message": "Partner formation order fetched successfully.",
  "data": {
    "id": "easyfiling-partner-order-uuid",
    "external_order_id": "partner-order-10001",
    "external_customer_id": "partner-customer-501",
    "status": "submitted",
    "submitted_at": "2026-07-18T06:30:00.000000Z",
    "quote": {
      "currency": "USD",
      "state_fee": 100,
      "plan_fee": 199,
      "total": 299
    },
    "company": {
      "id": "easyfiling-company-uuid",
      "name": "Example Ventures LLC",
      "email": "company@example.com",
      "status": "active",
      "formation_date": "2026-07-20",
      "source": "partner_api",
      "progress": [
        {
          "id": "progress-status-uuid",
          "status": "completed",
          "step": "Company Formation"
        }
      ],
      "documents": [
        {
          "id": "document-uuid",
          "type": "Article Of Organization",
          "status": "completed",
          "file_name": "uploaded-file-name.pdf",
          "url": "https://secure-file-url.example.com/document.pdf"
        }
      ]
    }
  }
}
```

## Error Responses

### Missing or Invalid Credentials

```json
{
  "success": false,
  "message": "Partner credentials are required."
}
```

or:

```json
{
  "success": false,
  "message": "Invalid partner credentials."
}
```

HTTP status: `401`

### Validation Error

```json
{
  "message": "The company.company state id field is required.",
  "errors": {
    "company.company_state_id": [
      "The company.company state id field is required."
    ]
  }
}
```

HTTP status: `422`

### Order Not Found

```json
{
  "status": false,
  "message": "Partner formation order not found."
}
```

HTTP status: `404`

## cURL Examples

### Quote

```bash
curl -X POST "https://api.example.com/api/v1/partner/formation/quotes" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Partner-Client-Id: pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "X-Partner-Secret: your_partner_secret" \
  -d '{
    "company_state_id": "uuid-of-company-state",
    "company_plan_id": "uuid-of-company-plan",
    "company_structure_id": "uuid-of-company-structure"
  }'
```

### Create Order

```bash
curl -X POST "https://api.example.com/api/v1/partner/formation/orders" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Partner-Client-Id: pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "X-Partner-Secret: your_partner_secret" \
  -d '{
    "external_order_id": "partner-order-10001",
    "external_customer_id": "partner-customer-501",
    "customer": {
      "name": "Jane Founder",
      "email": "jane@example.com",
      "calling_code": "+1",
      "phone": "5551234567"
    },
    "company": {
      "name": "Example Ventures LLC",
      "calling_code": "+1",
      "phone": "5551234567",
      "email": "company@example.com",
      "description": "Software consulting company",
      "company_structure_id": "uuid-of-company-structure",
      "company_designator_id": "uuid-of-company-designator",
      "company_state_id": "uuid-of-company-state",
      "company_plan_id": "uuid-of-company-plan",
      "registration_type": "new_register",
      "protect_privacy": true
    },
    "officer_detail": [
      {
        "name": "Jane Founder",
        "ownership": "100",
        "responsible": true
      }
    ],
    "payment_detail": {
      "payment_id": "partner-payment-90001",
      "payment_mode": "partner_platform",
      "paid_amount": 299
    }
  }'
```

### Check Status

```bash
curl -X GET "https://api.example.com/api/v1/partner/formation/orders/partner-order-10001" \
  -H "Accept: application/json" \
  -H "X-Partner-Client-Id: pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "X-Partner-Secret: your_partner_secret"
```

## JavaScript Example

```js
const baseUrl = "https://api.example.com/api";

const headers = {
  "Accept": "application/json",
  "Content-Type": "application/json",
  "X-Partner-Client-Id": process.env.EASYFILING_CLIENT_ID,
  "X-Partner-Secret": process.env.EASYFILING_CLIENT_SECRET
};

async function createFormationOrder(orderPayload) {
  const response = await fetch(`${baseUrl}/v1/partner/formation/orders`, {
    method: "POST",
    headers,
    body: JSON.stringify(orderPayload)
  });

  const body = await response.json();

  if (!response.ok || body.status === false) {
    throw new Error(body.message || "EasyFiling formation request failed");
  }

  return body.data;
}
```

## Integration Notes

* Store `external_order_id` in your system. It is used for idempotency and status checks.
* Do not expose partner credentials in frontend code. API calls should be made from your backend.
* Treat `company.id` from EasyFiling as the EasyFiling company reference.
* Poll the status endpoint when you need updates.
* Final formation documents are prepared and uploaded by EasyFiling. Partners should not upload formation documents through this API.
* If you need a new secret, ask EasyFiling to regenerate it. The old secret stops working after regeneration.

