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.
| Step | Method | Endpoint |
|---|---|---|
| 0. List available services | GET | /service-carts |
| 1. Get Service Configuration and Catalog information | GET | /service-carts/{service} |
| 2. Get Business Classification Data | GET | /business-classifications |
| 3. Create order | POST | /orders |
| 4. Submit order | POST | /orders/{order_uuid}/submit |
| 5. Get order information (optional) | GET | /orders/{order_uuid} |
| 6. Complete the post-checkout questionnaire | GET, 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": []
}
]
}
| Field | Description |
|---|---|
slug | Value to send as {service} in step 1 and as service when creating the order. |
name, description | Display name and summary of the service. |
allows_addons | true when the order can be updated with PATCH {baseUrl}/orders/{order_uuid} after creation. |
standalone | false 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_services | For 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
documentinput 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 toAction Requireduntil 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_changedevent is sent:Created→In Progress, orCreated→Action Requiredwhen 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 parameter | Description |
|---|---|
questionnaire | Optional. post-checkout returns only the fields of this questionnaire, leaving out fields of other questionnaires such as s-corp. |
is_filled | Optional. 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
PATCHreplaces the storedmanagers_datalist andregistered_agentobject, 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 requirestitle,full_name,address,city,state, andzip.address_complementandis_companyare optional. The list as a whole must meet the requirements for the entity type, described in the field'soptions.message:- LLC: at least 1
Member, plus at least 1Managerwhenbusiness_data.managed_byismanagers. - C Corp / S Corp: at least 1
Director, 1President, 1Treasurerand 1Secretary. - Nonprofit: at least 1
President, 1Treasurerand 1Secretary, plus at least 3Directors in some states (at least 1 elsewhere).options.messagelists the states.
- LLC: at least 1
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 requiresname,email,address,city,state, andzip;phoneis optional.stateis never inferred from the formation state.- Creation fields stay editable. Fields sent on order creation (for example
business_data.typeorbusiness_data.name) can still be corrected in the samePATCH, with the same validation.
Differences for the formation service
- Manager titles:
managers_data.*.titleaccepts onlyMemberandManagerfor LLCs, andPresident,Vice President,Secretary,Treasurer,OfficerandDirectorfor corporations and nonprofits.Managing Member,Authorized Person,Governing PersonandOwnerare not accepted. - Registered agent: when the Registered Agent product is part of the order — as an add-on or included in the package —
registered_agentis 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,zipanddescription.- At least one
managers_datarecord. - LLC:
business_data.managed_by. C Corp / S Corp:business_data.number_of_sharesandbusiness_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-checkoutfor the products in the order (for examplemember_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 parameter | Description |
|---|---|
questionnaire | Optional. Returns only the fields of this questionnaire: s-corp, or post-checkout for the regular post-checkout questionnaire. |
is_filled | Optional. 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"
}
]
}
}
| Field | Rules |
|---|---|
scorp_data.ein | Business 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.shareholders | All owners/shareholders of the business, 1 to 8 items. |
scorp_data.shareholders.*.full_name | Required. |
scorp_data.shareholders.*.ownership_percent | Required. Number greater than 0 and up to 100. |
scorp_data.shareholders.*.ssn | Required. 123-45-6789 or 123456789. |
scorp_data.shareholders.*.address | Required. Up to 75 characters. |
scorp_data.shareholders.*.city | Required. Up to 50 characters. |
scorp_data.shareholders.*.state | Required. Two-letter US state code. |
scorp_data.shareholders.*.zip | Required. 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 leavesAction Required. If you are subscribed to webhooks, anorder_status_changedevent is sent. GET {baseUrl}/orders/{order_uuid}returns the answer underscorp_data, in the same shape you sent it.ssnis 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.