List companies now returns a company submitted through the SDK as soon as it is created, not only after you confirm payment.Check your integration
- Expect
formationSubmissionStatusofAWAITING_PAYMENTorCANCELLEDin the list.AWAITING_PAYMENTis waiting on your payment confirmation.CANCELLEDwas withdrawn by doola before payment, so its order is void.
- Companies created with Create a company are unchanged.
If you read
services for companies submitted through the SDK, expect Formation at NotStarted / WaitingForCompanyOnboard until you call POST /v1/partner/companies/{companyId}/payment-confirmed, then InProgress. See Initial state.No action needed- Companies created with Create a company are unchanged. Their
Formationstill starts atInProgress/WaitingForRaToSucceed.
The deprecated
naicsCode field is gone from company creation and company responses. Classify every company with industry.Check your integration- Send
industryon every create. A Create a company request without it returns400 E_VALIDATION_FAILED, withE_INDUSTRY_INVALIDonfields.industry.code, whether or not the body still carriesnaicsCode. AnaicsCodesent alongsideindustryis ignored, and the request succeeds. - Read
industryfrom company responses. Create a company and Get a company no longer returnnaicsCode. E_NAICS_INVALIDis no longer returned. Drop any handling for it.
- List NAICS codes still returns
naicsCodeon each entry, so you can map a code you already hold to anindustry. See Choosing an industry.
Indiana and Illinois reject a formation whose business or mailing address is the registered agent’s address.
- Send the founder’s address for
INandIL. Useprovider: customerwith the founder’s own US address on both thebusinessandmailingentries. See Addresses. - Requests that use
registeredAgentthere still return201. doola raises the new required actionFORMATION_FOUNDER_ADDRESS_REQUIRED, announced by the newcompany_founder_address_requiredwebhook, and holds the formation atPENDINGuntil you send the address. See Founder address needed. - Resolve it through the resolution endpoint with an
addressesarray. The action closes asresolvedat once and the formation continues. - The embedded SDK asks for the founder’s address in those states.
ChangeFormationWebhooksEINRequired actions
Docs corrected, no API change: naicsCode still works, and what else to check
The API did not change. Some pages described behaviour it doesn’t have, and now match what it does.Check your integration
naicsCodestill works. This corrects the 2026-06-26 entry, which said it would stop working after 2026-09-21. A create request with noindustrystill succeeds when it carries a validnaicsCode, and an invalid one returnsE_NAICS_INVALIDonfields.naicsCode. Keep sendingindustry: the removal ofnaicsCodewill be announced here before it happens. See Choosing an industry. Superseded on 2026-10-27:naicsCodewas removed; see the 2026-10-27 entry.- Two validation errors are reported on the field, never top-level. An over-long
descriptionand invalid pagination both return400 E_VALIDATION_FAILED, withE_DESCRIPTION_INVALIDonfields.description.code(this corrects the 2026-09-03 entry) andE_PAGINATION_INVALIDonfields.page.codeorfields.size.code. See Errors. company_filing_date_updatedis never sent, though the event catalog lists it. The filing date first arrives withcompany_formation_completed; to catch later corrections, re-readformationFilingDatein your reconciliation sweep.- A deactivated tenant gets
E_TENANT_SUSPENDEDon Partner Portal reads and writes. Deactivation also revokes every API key, so API-key calls return401 E_AUTH_INVALID. - The IRS EIN letter doesn’t go to the
mailingaddress. When the founder signs an SS-4, it names doola’s Registered Agent address for the letter. When doola applies online, it retrieves the letter digitally. See Addresses. - Online EIN is for LLCs only. Don’t show founders the 1 to 2 business day online timeline for a C-Corp. See When signing applies.
- On create, the order of
nameOptionsis the preference. Anypositionyou send is ignored there. A name-options resolution still honoursposition.
- Member names:
legalFirstNameandlegalLastNameare required for a person,contactFullNamefor an entity member, andownershipPercentmust be above 0 with at most 2 decimal places. See Member. - API keys: your team creates, revokes and deletes every key after the first one per environment in the Partner Portal. A portal sign-in can’t replace an API key for creating customers and companies, confirming payment, or creating signing and SDK sessions.
- SS-4 reset reminders start again when you create the new signing session, not at the reset itself.
- Annual report floors also apply to a Nevada corporation when doola holds no authorized share count or par value.
partnerReferenceon payment confirmation is only written to doola’s logs. It isn’t stored on the company or returned.- Bank accounts: the Partner Portal has no banking feature. Founders open a US bank account with a bank of their choice.
error.requestId and the x-request-id response header keep their names and still carry the same id, but the value is now 32 lowercase hex characters (for example 4bf92f3577b34da6a3ce929d0e0e4736) instead of a 27-character id. If you store it, make sure your column or validation accepts the new length and format.It identifies the request’s trace and is not guaranteed to be unique per call, so use it for correlation only. An x-request-id header you send is no longer echoed back; keep your own id on your side if you need one. Quote the id doola returns when you contact support. See Request IDs.Get a customer and List customers now return
externalCustomerId: your own user id, as you sent it when minting the customer’s SDK session. It is null for a customer never minted with one, and for a customer another partner owns that you reach through one of your companies. Create a customer returns the same field.To check that a company belongs to your signed-in user, compare its owner’s externalCustomerId with your user’s id, and compare emails only when it is null. See Take payment.Required actions carry
awaitingResponse. It is true while doola is waiting for a resolution (created, delivered or delivery_failed) and false from submitted until the action closes. Use it instead of re-deriving the rule from status. See Statuses.A delivery outcome no longer changes status after a submission. A webhook retry that succeeds or fails after a resolution was submitted is still recorded in the action’s history, but the action keeps reading submitted.SDK companies. For a company formed through the embedded SDK, the founder can submit new names from the app, so an action can reach submitted without your call. Your own submission is still accepted and replaces the founder’s names.The sandbox playground endpoints now refuse a company that cannot reach a formation milestone, and leave it unchanged:
AWAITING_PAYMENTanswers422 E_FORMATION_AWAITING_PAYMENT. Confirm the payment withPOST /v1/partner/companies/{companyId}/payment-confirmed, wait forcompany_formation_submitted, then call the playground.CANCELLEDanswers409 E_COMPANY_CANCELLED.
COMPLETED, and the later payment confirmation was then accepted without moving the company to PENDING. Paid companies complete and fire the same webhooks as before.These pages now describe what the API actually does. Nothing in the API itself changed.
document_*events carrydoolaCompanyIdanddocumentType, notdocumentIdordocumentCreatedAt. On each event, list the company’s documents and dedupe on the documentid. This also corrects the 2026-07-13 and 2026-07-14 entries.- There is no
partner_webhook_disableddelivery. When an event exhausts its retries, your endpoint is disabled without a notification, and events raised while it is disabled are not queued. Watch the Partner Portal’s Events page, and run a reconciliation sweep after re-enabling. The event still appears inGET /v1/partner/webhook/eventsand on the portal’s Webhook Events tab, but it is never delivered. - Redirects are not retried. A
3xxanswer fails that delivery. Point your webhook URL at the final host. - Unsigned deliveries.
X-Doola-Signatureis only sent once you have generated a signing secret, so reject requests without one. - Voided signing links. A link voided by a newer session no longer opens the document, and it does not answer
410 E_SIGNATURE_URL_EXPIRED. That410covers expired and tampered links only. - Responsible party.
emailis required andaddressis optional, as the API reference already showed. Send the address anyway when you have it: doola’s online EIN application needs its phone number. - Online EIN needs the responsible party’s SSN, a phone number on the responsible party’s address, and a business address in the US. See When signing applies.
CANCELLEDis listed among theformationSubmissionStatusvalues: an SDK formation that doola withdrew at your request before its payment was confirmed.
You now receive
company_formation_completed for every formation. Until now, a formation doola filed through its automated filing flow recorded the filing date but sent no company_formation_completed, and its formationSubmissionStatus stayed SUBMITTED. Both now happen the moment the state filing is recorded, whichever way doola filed the formation.formationSubmissionStatus reaches COMPLETED. It moves from SUBMITTED to COMPLETED when the state filing is recorded. This supersedes the 2026-06-24 entry, which said the field never reaches a completed value. Companies that were already filed are being updated to COMPLETED as part of this change. The API reference now lists COMPLETED, and AWAITING_PAYMENT for companies submitted through the SDK that are waiting on your payment confirmation.Missed company_formation_completed events are not re-sent. For a company you are still tracking as in progress, run your reconciliation sweep: its Formation service already reads Completed. If your code treats an unknown formationSubmissionStatus value as an error, make it accept COMPLETED.Webhook events are no longer enabled per partner. Every partner receives every event doola publishes, and a new event reaches you as soon as it ships rather than waiting to be switched on for your tenant.You may start receiving events you have not seen before. If your handler rejects or errors on an unrecognised
eventName, make it ignore unknown values. The full set is listed under Webhooks; these are the ones most likely to be new to you:company_name_options_requiredandsignature_ss4_reset, both required actionssignature_form8821_requiredcompany_annual_report_submitteddocument_operatingagreement_uploaded
GET /v1/partner/webhook/events no longer returns subscribed. Each entry is now eventName and description only. The flag reported whether your tenant was enabled for that event, which is no longer a thing that varies, so drop any logic that filters the catalogue on it.Signing, retries, auto-disable and the delivery log are unchanged, and switching delivery off entirely is still the webhook status control in the Partner Portal.You can now file a company’s annual report through the API. You collect the answers and the fee from your customer, and doola files the report with the state. See Annual Report Filing.
Every path sits under
/v1/partner/companies/{companyId}/compliance.- Nothing is charged through this API.
priceInCentsis the state fee doola settles with you outside it. - Three new webhook events:
company_annual_report_submittedwhen doola starts filing,company_annual_report_completedwhen the state has the report, anddocument_annualreport_uploadedwhen the filed report is ready to download.
The
ssn field accepts an ITIN. On responsibleParty, members and executiveMembers, ssn takes a valid SSN or ITIN, as nine ASCII digits or the full NNN-NN-NNNN format.Malformed values are rejected. A value that is neither a valid SSN nor a valid ITIN, including a masked value such as ***-**-1234, answers 400 E_VALIDATION_FAILED and creates nothing.Only a valid SSN waives signing. An ITIN-only company requires an SS-4, plus a Form 8821 when it requests the expedited EIN. Expedited EIN eligibility follows the same rule: a company qualifies when no one on it supplies a valid SSN, so ITIN-only companies are eligible. This supersedes the “non-US founder” wording in earlier entries.Create customer only merges onto an existing customer when that customer is yours. Previously any registered email returned
200 OK with created: false and the existing customer’s record — including one owned by a different partner.An email that belongs to another tenant’s customer, to a legacy customer with no tenant, or to a non-customer principal such as a dashboard user is now rejected with 409 E_EMAIL_IN_USE, and nothing about that record is returned.What changes for you. If you relied on 200 / created: false to look up a customer by email, that only works for your own customers now; a 409 means the address is taken by someone outside your tenant and there is nothing for you to fetch. Creating a customer you have not created before is unaffected.Related: GET /v1/partner/customers/{customerId} now returns 404 E_NOT_FOUND for a customer another tenant owns, and POST /v1/partner/companies returns 404 E_CUSTOMER_NOT_FOUND for a doolaCustomerId outside your tenant.description on Create company is now capped at 50 characters, down from 250. Over the cap the request is rejected with 400 E_VALIDATION_FAILED. Its fields.description has code E_DESCRIPTION_INVALID and message “Description is too long, must be at most 50 characters”. Corrected on 2026-10-13: this entry first gave E_DESCRIPTION_INVALID as the top-level code; see the 2026-10-13 entry.The cap matches the IRS EIN application’s business-activity field, which rejects anything longer.doola can now ask you for a Form 8821 signature on a company that was never required to sign one at formation, most often a US founder whose EIN could not be obtained online. It arrives as a new required action,
FORMATION_SIGNATURE_FORM8821_REQUIRED, announced by a new webhook event, signature_form8821_required, and is resolved the way a Form 8821 is signed at formation: create a signature session with documentType: "FORM8821" and present the link. See Form 8821 signature needed.Two contract notes. signatureRequirements can now carry a FORM8821 entry for a US founder (previously always empty), so do not read a non-empty array as proof of a non-US founder. And the signature-session endpoint accepts FORM8821 for any company with this action open; without one, eligibility is unchanged. No existing payload field changed.Generating and rotating your webhook signing secret is now self-serve, under Settings → Webhook URL in the Partner Portal. It no longer requires emailing doola. The secret is still shown once, and a rotation invalidates the previous secret immediately, so deploy the new value before you rotate. Generating one requires an active API key on the tenant.The webhooks guide also gains a Reconciliation section: which field to read in place of each event you may have missed, and a sweep to run on a schedule and after an incident on your side. Nothing about delivery, retries, or any payload changed — this documents recovery paths that already existed.
When doola needs something from you before a company’s formation can continue — most often because the state rejected every company name you submitted — it now raises a required action on the company instead of reaching out over Slack or email.Two new webhook events announce one:
company_name_options_required and signature_ss4_reset. Both carry a requiredActionId, an actionCode, and a reason written for your user to read. New endpoints let you list every open action across your companies in one call, read a single action with its full history, and submit new company name options to resolve it.Nothing changes for a formation that never hits one, and no existing payload field changed. See Required actions.A new read-only endpoint,
GET /v1/partner/companies/{companyId}/compliance/calendar, returns a company’s tracked compliance obligations. Today it returns the annual report with its nextDueDate, lastFiledDate, and a derived status (UPCOMING, OVERDUE, NOT_YET_DUE, or UNSUPPORTED_STATE).The obligation is always returned — for an unsupported state or a company that is too new, the status carries the reason and the dates are null. Reading the calendar never triggers a filing or recomputation. See Compliance calendar.The expedited EIN no longer requires enablement on your account. Send
requestedServices: [{ "service": "EinCreation", "variant": "Expedite" }] on create company endpoint to request it. Expedited processing remains an additional fee, billed per company formed with it.Everything else is unchanged: expedited EIN is still available only for a non-US founder (400 E_EXPEDITED_EIN_NOT_ELIGIBLE otherwise, before anything is created), and the founder still signs a Form 8821 alongside the SS-4.Create company and Retrieve company now return
formationFilingNumber — the filing number the state assigned when the formation was filed. It is null until the formation is filed and is populated alongside formationFilingDate; see Reading progress.In the sandbox playground, formation/complete sets a fixed test value (PLAYGROUND-FILING).A new webhook event,
document_operatingagreement_uploaded, fires when an LLC company’s Operating Agreement is ready to download. doola now generates the Operating Agreement for partner companies shortly after the Articles of Organization are processed, so the event typically arrives soon after document_aoo_uploaded.The payload is the standard document_* shape (doolaCompanyId, documentType: "OperatingAgreement"); list the company’s documents to find and download it. Corrected on 2026-10-01: this entry first listed documentId and documentCreatedAt, which the event does not carry; see the 2026-10-01 entry. All partner tenants are subscribed automatically; see Webhooks.Previously doola did not generate an Operating Agreement for partner companies. The sandbox playground’s formation/complete now also lists the event in triggeredEvents for an LLC test company.A new webhook event,
document_corporatebylaws_uploaded, fires when a CCorp company’s Corporate Bylaws are ready to download. doola generates the Bylaws shortly after the Articles of Organization are processed, so the event typically arrives soon after document_aoo_uploaded.The payload is the standard document_* shape (doolaCompanyId, documentType: "CorporateBylaws"); list the company’s documents to find and download it. Corrected on 2026-10-01: this entry first listed documentId and documentCreatedAt, which the event does not carry; see the 2026-10-01 entry. All partner tenants are subscribed automatically; see Webhooks.Previously the Bylaws appeared in the documents list without any event. The sandbox playground’s formation/complete now also lists the event in triggeredEvents for a CCorp test company.Sandbox now includes a playground that drives a test company through the two milestones you cannot control in the real world: the state confirming the formation, and the IRS issuing the EIN.
POST /v1/partner/playground/companies/{companyId}/formation/completesets the filing date, uploads the Articles of Organization, firescompany_formation_completedanddocument_aoo_uploaded, and advances the Formation service toCompleted.POST /v1/partner/playground/companies/{companyId}/eincreation/completesets a test EIN, uploads the EIN letter, firescompany_ein_issuedanddocument_einletter_uploaded, and advances the EinCreation service toCompleted.
A non-US founder who requests an expedited EIN now signs a Form 8821 (Tax Information Authorization) in addition to the SS-4, letting doola retrieve the EIN letter directly from the IRS. It uses the same signing flow as the SS-4.
signatureRequirementson Create company and Retrieve company now includes a pendingFORM8821entry alongsideSS4for a non-US + expedited-EIN company. Standard-EIN and US companies are unchanged.POST /v1/partner/companies/{companyId}/signaturesacceptsdocumentType: "FORM8821".- Three new webhook events mirror the SS-4 set:
signature_form8821_completed,document_form8821_uploaded, andsignature_form8821_reminder_due(day 1, 3, 7).
Partners with the expedited EIN feature can now request prioritized EIN processing for non-US founders. Add
requestedServices: [{ "service": "EinCreation", "variant": "Expedite" }] to the create-company request; the company’s EinCreation service then carries variant: "Expedite" on the create and retrieve responses.Both gates run before anything is created: Expedited EIN must be part of your partner agreement (403 E_FEATURE_NOT_ENABLED otherwise) and the founder must be non-US (400 E_EXPEDITED_EIN_NOT_ELIGIBLE otherwise). A rejected request creates no company and releases your Idempotency-Key.Omitting requestedServices keeps standard processing, so existing integrations are unaffected. See the new Expedited EIN guide.A new webhook event,
company_ein_issued, fires the first time a company’s EIN is recorded. Fetch the company to read the ein field. A later correction to the EIN value does not re-fire it.It complements document_einletter_uploaded, which fires separately once the IRS confirmation letter is downloadable. All partner tenants are subscribed automatically; see Webhooks.Create-company now accepts an
industry field for precise NAICS classification. The response now echoes both naicsCode and industry.naicsCode is deprecated. It keeps working until its removal is announced in this changelog, so existing integrations are unaffected. Corrected on 2026-10-13: this entry first said naicsCode would stop working after 2026-09-21; see the 2026-10-13 entry. When both fields are sent, industry takes precedence. Superseded on 2026-10-27: naicsCode was removed; see the 2026-10-27 entry.Upgrade: switch the create payload from naicsCode to industry, sourcing the value from the NAICS reference list. See Choosing an industry.You can now form US companies for non-US founders through the Partner API. When no member, executive member, or responsible party has a US tax ID, the founder signs an SS-4 before the IRS issues the EIN.
- Create company and Retrieve company now return
signatureRequirements: a pendingSS4entry for a non-US founder, or an empty list for a US founder. POST /v1/partner/companies/{companyId}/signaturesreturns a fresh, whitelabeled signing link (expires in two hours) to embed or send to the founder.- Three new webhook events:
signature_ss4_completed,document_ss4_uploaded, andsignature_ss4_reminder_due(day 1, 3, 7). You own the reminder cadence.
Don’t use
formationSubmissionStatus to check whether a formation is finished. This field only tracks whether doola has received the formation request. Its values are PENDING, SUBMITTED, and FAILED, and it never reaches a “completed” state, so polling it for completion will wait forever. Superseded on 2026-09-27: formationSubmissionStatus now reaches COMPLETED when the state filing is recorded; see the 2026-09-27 entry.To know when a formation is actually done (filed with the state, EIN issued, documents available), read the per-service statuses on Company services, subscribe to the company_formation_completed webhook, or check the ein and document fields on the company. The Company formation guide now spells this out in its Status lifecycle section.Creating a customer with an email that already belongs to a non-customer principal (for example a partner-dashboard user) now returns
409 E_EMAIL_IN_USE instead of 500. One email cannot be both a dashboard user and a customer, so this is a client-side conflict you can handle — use a different email.A failed create no longer locks its
Idempotency-Key. If a create returns a 4xx (validation or pre-check) or a transient 5xx, the key is released — fix the request and retry with the same key instead of generating a new one.Successful creates are still replayed for the same key, and reusing a key from an already-successful create with a different body still returns 409 E_IDEMPOTENCY_KEY_REUSED.The create-company endpoint now supports C-Corp formation. Set
entityType to CCorp and provide executiveMembers (President, Secretary, Treasurer, and Director) and ccorpValuation (authorized shares and par value per share) in place of members.entityType defaults to LLC, so existing LLC integrations are unaffected.First release of the doola Partner API developer docs and reference.
- Customers — create, retrieve, and list customers.
- Companies — submit a formation, retrieve a company, and list companies.
- Documents — list a company’s documents and fetch a download URL.
- Reference data — countries, US states, NAICS codes, and state filing fees.
- Guides for authentication, the formation lifecycle, webhooks, and errors.
- Interactive API reference generated directly from the live API.