Skip to main content

Incorporation Service Example

An Incorporation order bundles together several services into a single order to create a business (LLC, S-Corp, C-Corp, Non-Profit). This type of order lets you add additional services to the order after the order is created, such as Initial Report, EIN, Registered Agent, etc. The next list summarizes the steps to submit an Incorporation order for a business.

This flow applies to every package service — a service with standalone: false in List available services, such as incorporation-package or formation. The examples use incorporation-package; replace the slug with the one enabled for your account. Differences specific to formation are called out in each step.

StepMethodEndpoint
0. List available servicesGET/service-carts
1. Get Service Configuration and Catalog informationGET/service-carts/{service}
2. Get Business Classification DataGET/business-classifications
3. Create orderPOST/orders
4. Submit orderPOST/orders/{order_uuid}/submit
5. Get order information (optional)GET/orders/{order_uuid}
6. Complete the post-checkout questionnaireGET, PATCH/orders/{order_uuid}/post-checkout, /orders/{order_uuid}
7. Receive and respond Information Requests and Order Rejections over Webhooks
Answer the S Corp Election questionnaire (if purchased)GET, PATCH/orders/{order_uuid}/post-checkout, /orders/{order_uuid}

0. List available services​

Start by listing the services enabled for your API user. Only these slugs can be used in the next steps — requesting the configuration of, or creating an order for, any other service returns 422 Unprocessable Content with "service": "Service is not available for this user".

GET {baseUrl}/service-carts
Authorization: Bearer {token}
{
"success": true,
"data": [
{
"slug": "incorporation-package",
"name": "Incorporation Package",
"description": "Service that bundles together multiple products to create an incorporation",
"allows_addons": true,
"standalone": false,
"nested_services": []
},
{
"slug": "formation",
"name": "Formation",
"description": "Business formation with registered agent, same-day processing and optional S Corp election",
"allows_addons": true,
"standalone": false,
"nested_services": []
},
{
"slug": "ein",
"name": "EIN",
"description": "Service to create an EIN",
"allows_addons": false,
"standalone": true,
"nested_services": []
}
]
}
FieldDescription
slugValue to send as {service} in step 1 and as service when creating the order.
name, descriptionDisplay name and summary of the service.
allows_addonstrue when the order can be updated with PATCH {baseUrl}/orders/{order_uuid} after creation.
standalonefalse for package services, which follow this page (create → submit → post-checkout). true for services that are complete in a single POST {baseUrl}/orders — see Standalone Service Example.
nested_servicesFor bundles, the slugs of the services ordered together with it. Empty otherwise.

The list above is illustrative — your response contains only the services in your partner agreement. If a service you expect is missing, contact [email protected].

1. Get Service Configuration and Catalog information​

Calling this endpoint will return the service configuration and catalog information for the Incorporation order. Important information includes:

  • input_fields: The input fields that are required to create the Incorporation order. You can build your Front end dynamically based on this information.
  • catalog: The list of products that are available for the Incorporation order.
GET {baseUrl}/service-carts/incorporation-package?state=DE&business_type=LLC
Authorization: Bearer {token}

state and business_type are optional — pass them to resolve any state- or entity-specific eligibility rules on the bundle's nested products up front.

Abbreviated success payload:

{
"success": true,
"data": {
"name": "Incorporation Package",
"slug": "incorporation-package",
"description": "Service that bundles together multiple products to create an incorporation",
"input_fields": [
{
"name": "Business Name",
"key": "business_data.name",
"type": "string",
"description": "Business name",
"questionnaire_copy": "What is your business's legal name?",
"validation_rules": [
"string",
"max:100"
],
"default_value": null,
"options": null,
"is_sensitive": false,
"required": true
},
{
"name": "Business Type",
"key": "business_data.type",
"type": "enum",
"description": "Type of the business",
"questionnaire_copy": "What type of business entity is this? (e.g., LLC, Corporation)",
"validation_rules": [
"string",
"in:LLC,C Corporation,S Corporation,Nonprofit,Basic LLC,Partnership,Sole Proprietorship"
],
"default_value": null,
"options": {
"values": [
"LLC",
"C Corporation",
"S Corporation",
"Nonprofit"
]
},
"is_sensitive": false,
"required": true
},
{
"name": "Business Formation Date",
"key": "business_data.formation_date",
"type": "date",
"description": "Date of business formation",
"questionnaire_copy": "What is your business formation date?",
"validation_rules": [
"date_format:Y-m-d",
"before_or_equal:today"
],
"default_value": null,
"options": null,
"is_sensitive": false,
"required": true
},
{
"name": "Business Formation State",
"key": "business_data.formation_state",
"type": "enum",
"description": "State where the business was formed",
"questionnaire_copy": "What is your business formation state?",
"validation_rules": [
"string",
"size:2",
"exists:states,abbr"
],
"default_value": null,
"options": {
"message": "US postal service standard two letter state code. Example: CA, NY, etc."
},
"is_sensitive": false,
"required": true
},
...
],
"catalog": [
{
"sku": "SF_1178_SG_0",
"name": "Incorporation Basic",
"item_type": "product",
"has_gov_fee": true,
"price": 199,
"package": true,
"package_items": [
"Employer Identification Number (EIN)",
"Operating Agreement",
"Standard Processing",
"Statement of Organizer",
"Banking Resolution",
"Organizational Minutes"
],
"conditions": {
"must_not_be_added_with": ["SF_1014_SG_0", "SF_1031_SG_0"]
}
}
]
}
}

sku, package_items, and conditions are illustrative — always build against the live catalog for the target state and business type.

2. Get Business Classification Data​

Calling this endpoint will return the business classification data for the Incorporation order. You will required to provide a naics code from this list to create the order data in the next step.

GET {baseUrl}/business-classifications?q=agriculture
Authorization: Bearer {token}
{
"success": true,
"data": [
{
"id": 1,
"naics": "111111",
"description": "Agriculture, forestry, fishing and hunting",
"cd_code": "07324d4e-3f71-48f0-a846-723e029c94e7"
}
]
}

Pass the q query parameter to search by NAICS code or description; omit it to return the full classification list. Use the matching naics value as business_data.category on order creation.

Note: If you already have a standard NAICS code, you can skip this step, but we reccommend you use this endpoint.

3. Create order​

Calling this endpoint will create the Incorporation order in draft status (status = "Created"). In this status the order is just a placeholder and does not represent a valid order that need to be processed by Swyftfilings. If you are subscribed to webhooks, an order_status_changed event is sent with old_status: null and new_status: "Created". Once you submit the order, its status moves to In Progress and another order_status_changed event is sent (Created → In Progress), or to Action Required while post-checkout data is still missing.

Make sure to store the order uuid returned in the response to use it in the next steps.

POST {baseUrl}/orders
Authorization: Bearer {token}
Content-Type: application/json
{
"service": "incorporation-package",
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "5551234567",
"consent_sms": false,
"business_data": {
"name": "Acme Holdings LLC",
"type": "LLC",
"formation_state": "DE",
"category": "541211",
"address": "8 The Green",
"city": "Dover",
"state": "DE",
"zip": "19901",
"managed_by": "managers"
},
"managers_data": [
{
"title": "Managing Member",
"full_name": "Jane Doe",
"address": "8 The Green",
"city": "Dover",
"state": "DE",
"zip": "19901",
"address_complement": "",
"is_company": false
}
],
"custom_field_1": "PO-12345",
"custom_field_2": "cust-98765"
}

Post-checkout business_data fields (address, city, state, zip, managed_by, designator, …) are optional at creation; you can send them now or later through the post-checkout questionnaire. Any you do send are validated with the same validation_rules the post-checkout endpoint lists. For example, state must be a two-letter US state code and zip must be five digits, other than 00000. An invalid value returns 422 Unprocessable Content with the field under errors, and no order is created.

custom_field_1, custom_field_2, and custom_field_3 are optional, partner-defined correlation values — send any subset of them, or omit all three. Each partner assigns their own meaning to a slot (e.g. your own order ID or customer ID); Swyftfilings does not interpret them. They are echoed back on Get order information and can be used to search your orders.

Abbreviated response:

{
"success": true,
"data": {
"message": "Order created successfully",
"order_uuid": "99ff4d16-4e61-499d-8e97-769de1bcca6b"
}
}

📝 Note: A required document input field is never sent in this body — files are uploaded separately via Upload order documents. A missing required document does not block order creation; the order instead moves to Action Required until the document is uploaded.

Duplicate order — 422 Unprocessable Content

If your account has an idempotency slot configured (see Search Orders), submitting the same custom_field_1/2/3 value again for the same service and state is rejected instead of creating a second order. For most services the "state" component is business_data.formation_state; for Foreign Qualification it's state_of_foreign_qualification instead — see Foreign Qualification.

{
"success": false,
"message": "Validation failed",
"errors": { "custom_field_1": ["An order with this custom_field_1 already exists for this service and state."] }
}

4. Submit order​

Submitting the order selects the products from the catalog returned in step 1 and starts processing. Until it is submitted, the order stays Created and Swyftfilings does not work on it.

POST {baseUrl}/orders/99ff4d16-4e61-499d-8e97-769de1bcca6b/submit
Authorization: Bearer {token}
Content-Type: application/json
{
"skus": ["SF_1250_SG_0", "SF_1222_SG_0"]
}

skus must contain exactly one product of type package ("package": true in the catalog), plus any add-ons you want to include. The SKUs above are illustrative — always use the live catalog for the state and business type of the order.

Abbreviated response:

{
"success": true,
"data": {
"message": "Order submitted successfully",
"order_uuid": "99ff4d16-4e61-499d-8e97-769de1bcca6b"
}
}

A missing package or more than one package returns 422 Unprocessable Content with an error on sku (At least one product of type package is required / More than one product of type package is not allowed: ...).

⚠️ Important: Submitting triggers order processing. From this point Swyftfilings starts working on the order and you receive updates via Webhook according to your integration setup. If you are subscribed to webhooks, an order_status_changed event is sent: Created → In Progress, or Created → Action Required when the post-checkout questionnaire still needs data.

5. Get order information (optional)​

Calling this endpoint will return the order information. You can use this information to display the order details to the user or you internal systems.

GET {baseUrl}/orders/99ff4d16-4e61-499d-8e97-769de1bcca6b
Authorization: Bearer {token}

Abbreviated response:

{
"success": true,
"data": {
"id": 1,
"uuid": "99ff4d16-4e61-499d-8e97-769de1bcca6b",
"service": "incorporation-package",
"status": "In Progress",
"business_data": {
"name": "Acme Holdings LLC",
"type": "LLC",
"formation_state": "DE"
},
"managers_data": [],
"order_items": [
{ "submitted_at": "2026-07-01", "type": "sale", "items": ["SF_1178_SG_0"] }
],
"additional_order_services": [],
"required_actions": {
"rejections": [],
"questionnaires": [],
"alerts": []
},
"documents": [],
"custom_field_1": "PO-12345",
"custom_field_2": "cust-98765",
"custom_field_3": null
}
}

status is the rolled-up value your integration tracks: Created (the order has not been submitted yet), In Progress, Action Required, On Hold, Completed, or Cancelled. An order stays Created until it is submitted, even if it has an open required action. required_actions surfaces any open rejections or questionnaires — see Respond to Order Rejections, Complete the post-checkout questionnaire and Answer the S Corp Election questionnaire. custom_field_1/2/3 echo back whatever you sent at order creation (null for any slot you didn't send). additional_order_services is always [] for this service — it only lists services SwyftFilings staff add to a Foreign Qualification order.

6. Complete the post-checkout questionnaire​

Some of the data needed to file the business is collected after the order is submitted: business description and address, designator, management structure, managers/officers, shares or voting members depending on the entity type, and registered agent details when Swyftfilings is not the registered agent. This is the post-checkout questionnaire, and you answer it entirely through the API — no customer portal is needed.

When the questionnaire is received​

The questionnaire is received on the webhook when the order is submitted. While required data is still missing, the order reports status: "Action Required" and GET {baseUrl}/orders/{order_uuid} lists it under required_actions.questionnaires:

{
"success": true,
"data": {
"id": 1,
"uuid": "99ff4d16-4e61-499d-8e97-769de1bcca6b",
"service": "incorporation-package",
"status": "Action Required",
...
},
"required_actions": {
"rejections": [],
"questionnaires": [
{
"questionnaire_name": "Post checkout",
"status": "Not started",
"message": "Check /orders/{order_uuid}/post-checkout EP to get required data.",
"slug": "post-checkout"
}
],
"alerts": []
}
}

status is Not started until at least one post-checkout field has a value (including values sent on order creation), then Started. The entry disappears once the questionnaire is completed.

1. Get the pending fields​

GET {baseUrl}/orders/{order_uuid}/post-checkout?questionnaire=post-checkout&is_filled=false
Authorization: Bearer {token}
Query parameterDescription
questionnaireOptional. post-checkout returns only the fields of this questionnaire, leaving out fields of other questionnaires such as s-corp.
is_filledOptional. false returns only fields that have no value yet, true only fields already filled. Omit it to get every field.

The fields are resolved for the order: they depend on the business type, the formation state and the products submitted. Each field has the same shape as the input_fields of step 1, plus is_filled and questionnaire. Abbreviated response for an LLC ordered through formation:

{
"success": true,
"data": {
"order_uuid": "99ff4d16-4e61-499d-8e97-769de1bcca6b",
"input_fields": [
{
"name": "Business Description",
"key": "business_data.description",
"type": "string",
"description": "Description of the business activity",
"questionnaire_copy": "Briefly describe what your business does",
"validation_rules": ["string"],
"default_value": null,
"options": null,
"is_sensitive": false,
"is_filled": false,
"questionnaire": "post-checkout"
},
{
"name": "Manager Title",
"key": "managers_data.*.title",
"type": "enum",
"description": "Title of the manager or member",
"questionnaire_copy": "What is this person's title?",
"validation_rules": ["string", "in:Member,Manager", "required_with:managers_data"],
"default_value": null,
"options": { "values": ["Member", "Manager"] },
"is_sensitive": false,
"is_filled": false,
"questionnaire": "post-checkout"
}
]
}
}

Field metadata above is illustrative — build your form from the live response. Before the order is submitted this endpoint returns an empty input_fields list, because the fields depend on the products submitted.

2. Send the answers​

Send the pending fields with PATCH {baseUrl}/orders/{order_uuid}, using the same nested shape as on order creation. You can send everything in one request or spread it over several.

PATCH {baseUrl}/orders/99ff4d16-4e61-499d-8e97-769de1bcca6b
Authorization: Bearer {token}
Content-Type: application/json
{
"business_data": {
"description": "Bookkeeping and tax preparation services",
"address": "8 The Green",
"city": "Dover",
"state": "DE",
"zip": "19901",
"designator": "LLC",
"managed_by": "managers"
},
"managers_data": [
{
"title": "Member",
"full_name": "Jane Doe",
"address": "8 The Green",
"city": "Dover",
"state": "DE",
"zip": "19901"
},
{
"title": "Manager",
"full_name": "John Doe",
"address": "8 The Green",
"city": "Dover",
"state": "DE",
"zip": "19901"
}
]
}

Any invalid field returns 422 Unprocessable Content and nothing is saved. Rules to keep in mind:

  • Records are replaced, not merged. Each PATCH replaces the stored managers_data list and registered_agent object, so every record you send must be complete. You don't need to send either field in an update that doesn't change it.
  • managers_data: each item requires title, full_name, address, city, state, and zip. address_complement and is_company are optional. The list as a whole must meet the requirements for the entity type, described in the field's options.message:
    • LLC: at least 1 Member, plus at least 1 Manager when business_data.managed_by is managers.
    • C Corp / S Corp: at least 1 Director, 1 President, 1 Treasurer and 1 Secretary.
    • Nonprofit: at least 1 President, 1 Treasurer and 1 Secretary, plus at least 3 Directors in some states (at least 1 elsewhere). options.message lists the states.
  • registered_agent: only requested when the order uses its own registered agent — it is not listed when Swyftfilings is the registered agent. When requested, the object requires name, email, address, city, state, and zip; phone is optional. state is never inferred from the formation state.
  • Creation fields stay editable. Fields sent on order creation (for example business_data.type or business_data.name) can still be corrected in the same PATCH, with the same validation.

Differences for the formation service​

  • Manager titles: managers_data.*.title accepts only Member and Manager for LLCs, and President, Vice President, Secretary, Treasurer, Officer and Director for corporations and nonprofits. Managing Member, Authorized Person, Governing Person and Owner are not accepted.
  • Registered agent: when the Registered Agent product is part of the order — as an add-on or included in the package — registered_agent is never requested and is not needed to complete the questionnaire.

3. After the questionnaire information is sent​

The questionnaire is marked as completed automatically on the PATCH that leaves the order with all the data it requires:

  • business_data.name, address, city, state, zip and description.
  • At least one managers_data record.
  • LLC: business_data.managed_by. C Corp / S Corp: business_data.number_of_shares and business_data.par_value. Nonprofit: business_data.voting_members.
  • registered_agent, when it is requested.
  • Any other required field listed by GET {baseUrl}/orders/{order_uuid}/post-checkout for the products in the order (for example member_final_judgment, when it is listed).

We recommend sending every field returned with is_filled: false — optional fields such as business_data.address_complement keep is_filled: false until you send a value, so an empty list is not required to complete the questionnaire.

Once completed, the questionnaire is removed from required_actions.questionnaires, the order leaves Action Required status (unless another required action is open) and, if you are subscribed to webhooks, an order_status_changed event is sent. If Swyftfilings later needs corrections to this data, it raises a rejection, which you answer as described in Respond to Order Rejections.

7. Receive and respond Information Request over Webhooks​

After the order is submitted, you may receive information requests and Order Rejections from the Agent, while fulfiling the order. These requests need to be replied with the correct or added information.

🧪 Testing in Sandbox? You don't have to wait on real fulfillment to test these transitions — see Self-Service Order Status Change to cancel, complete, or open a rejection on your own test orders.

Answer the S Corp Election questionnaire through the API​

When the order includes the S Corp Election and your package collects its questionnaire through the API, you answer it with PATCH {baseUrl}/orders/{order_uuid}. No customer portal is needed. Swyftfilings uses the answer to prepare IRS Form 2553 (see the S Corp election flow).

When the questionnaire event is received​

The questionnaire event is sent once the business formation is approved. If the order also includes the EIN application, it opens once the EIN signature has been received. From then until it is answered, the order reports status: "Action Required" and GET {baseUrl}/orders/{order_uuid} lists it under required_actions.questionnaires:

"required_actions": {
"rejections": [],
"questionnaires": [
{
"questionnaire_name": "S-Corp Election",
"status": "Not started",
"message": "Get the required fields from GET /orders/{order_uuid}/post-checkout?questionnaire=s-corp and send them through PATCH /orders/{order_uuid}.",
"slug": "s-corp"
}
],
"alerts": []
}

A questionnaire entry with a slug is answered through the post-checkout fields tagged with that slug, as described below. If the entry has no slug, follow its message instead.

1. Get the questionnaire fields​

GET {baseUrl}/orders/{order_uuid}/post-checkout?questionnaire=s-corp
Authorization: Bearer {token}
Query parameterDescription
questionnaireOptional. Returns only the fields of this questionnaire: s-corp, or post-checkout for the regular post-checkout questionnaire.
is_filledOptional. false returns only fields still pending, true only fields already filled. Can be combined with questionnaire.

Every input field includes questionnaire (the slug it belongs to) and is_filled. Abbreviated response:

{
"success": true,
"data": {
"order_uuid": "99ff4d16-4e61-499d-8e97-769de1bcca6b",
"input_fields": [
{
"name": "Federal Tax ID (EIN)",
"key": "scorp_data.ein",
"type": "string",
"description": "Federal Tax ID (EIN) of the business. Not required when Swyft already obtained it (is_filled = true)",
"questionnaire_copy": "Enter your Federal Tax ID (EIN)",
"validation_rules": ["string", "regex:/^\\d{2}-?\\d{7}$/"],
"default_value": null,
"options": null,
"is_sensitive": true,
"is_filled": false,
"questionnaire": "s-corp"
},
{
"name": "Social Security Number",
"key": "scorp_data.shareholders.*.ssn",
"type": "string",
"description": "Social Security Number of the owner/shareholder",
"questionnaire_copy": "Social Security Number",
"validation_rules": ["string", "regex:/^\\d{3}-?\\d{2}-?\\d{4}$/", "required_with:scorp_data.shareholders"],
"default_value": null,
"options": null,
"is_sensitive": true,
"is_filled": false,
"questionnaire": "s-corp"
}
]
}
}

The scorp_data.* fields are listed only while the questionnaire is open. Before it opens and after it is answered, ?questionnaire=s-corp returns an empty input_fields list.

2. Send the answer​

PATCH {baseUrl}/orders/{order_uuid}
Authorization: Bearer {token}
Content-Type: application/json
{
"scorp_data": {
"ein": "12-3456789",
"shareholders": [
{
"full_name": "Jane Doe",
"ownership_percent": 60,
"ssn": "123-45-6789",
"address": "1 Main St",
"city": "Dover",
"state": "DE",
"zip": "19901"
},
{
"full_name": "John Doe",
"ownership_percent": 40,
"ssn": "987-65-4321",
"address": "2 Main St",
"city": "Phoenix",
"state": "AZ",
"zip": "85001"
}
]
}
}
FieldRules
scorp_data.einBusiness EIN, 12-3456789 or 123456789. Required unless Swyftfilings already obtained it (the field is returned with is_filled: true); omit it to keep the stored EIN.
scorp_data.shareholdersAll owners/shareholders of the business, 1 to 8 items.
scorp_data.shareholders.*.full_nameRequired.
scorp_data.shareholders.*.ownership_percentRequired. Number greater than 0 and up to 100.
scorp_data.shareholders.*.ssnRequired. 123-45-6789 or 123456789.
scorp_data.shareholders.*.addressRequired. Up to 75 characters.
scorp_data.shareholders.*.cityRequired. Up to 50 characters.
scorp_data.shareholders.*.stateRequired. Two-letter US state code.
scorp_data.shareholders.*.zipRequired. US ZIP code.

Ownership percentages are not required to add up to 100. Sending scorp_data while the questionnaire is not open (before it opens, when the S Corp Election was not purchased, or after it was answered) returns 422 Unprocessable Content with an error on scorp_data. Any invalid or missing field also returns 422 and nothing is saved.

3. After the questionnaire is answered​

  • The questionnaire is removed from required_actions.questionnaires, and the order leaves Action Required. If you are subscribed to webhooks, an order_status_changed event is sent.
  • GET {baseUrl}/orders/{order_uuid} returns the answer under scorp_data, in the same shape you sent it. ssn is returned in full, so treat the response as sensitive data:
"scorp_data": {
"ein": "12-3456789",
"shareholders": [
{
"full_name": "Jane Doe",
"ownership_percent": 60,
"ssn": "123-45-6789",
"address": "1 Main St",
"city": "Dover",
"state": "DE",
"zip": "19901"
}
]
}
  • The questionnaire can only be answered once. If the answer needs corrections later, Swyftfilings raises a rejection, which you answer as described in Respond to Order Rejections.