Skip to main content
Follow updates with the RSS feed, or filter by tag.
ChangeFormation
List companies now returns SDK companies before payment, and cancelled ones
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 formationSubmissionStatus of AWAITING_PAYMENT or CANCELLED in the list. AWAITING_PAYMENT is waiting on your payment confirmation. CANCELLED was withdrawn by doola before payment, so its order is void.
No action needed
ChangeFormation
SDK formations stay NotStarted until you confirm payment
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 Formation still starts at InProgress / WaitingForRaToSucceed.
BreakingFormation
Breaking: create company requires industry, and naicsCode is removed
The deprecated naicsCode field is gone from company creation and company responses. Classify every company with industry.Check your integration
  • Send industry on every create. A Create a company request without it returns 400 E_VALIDATION_FAILED, with E_INDUSTRY_INVALID on fields.industry.code, whether or not the body still carries naicsCode. A naicsCode sent alongside industry is ignored, and the request succeeds.
  • Read industry from company responses. Create a company and Get a company no longer return naicsCode.
  • E_NAICS_INVALID is no longer returned. Drop any handling for it.
No action needed
NewFormationRequired actionsWebhooks
New: founder address for Indiana and Illinois
Indiana and Illinois reject a formation whose business or mailing address is the registered agent’s address.
  • Send the founder’s address for IN and IL. Use provider: customer with the founder’s own US address on both the business and mailing entries. See Addresses.
  • Requests that use registeredAgent there still return 201. doola raises the new required action FORMATION_FOUNDER_ADDRESS_REQUIRED, announced by the new company_founder_address_required webhook, and holds the formation at PENDING until you send the address. See Founder address needed.
  • Resolve it through the resolution endpoint with an addresses array. The action closes as resolved at 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
  • naicsCode still works. This corrects the 2026-06-26 entry, which said it would stop working after 2026-09-21. A create request with no industry still succeeds when it carries a valid naicsCode, and an invalid one returns E_NAICS_INVALID on fields.naicsCode. Keep sending industry: the removal of naicsCode will be announced here before it happens. See Choosing an industry. Superseded on 2026-10-27: naicsCode was removed; see the 2026-10-27 entry.
  • Two validation errors are reported on the field, never top-level. An over-long description and invalid pagination both return 400 E_VALIDATION_FAILED, with E_DESCRIPTION_INVALID on fields.description.code (this corrects the 2026-09-03 entry) and E_PAGINATION_INVALID on fields.page.code or fields.size.code. See Errors.
  • company_filing_date_updated is never sent, though the event catalog lists it. The filing date first arrives with company_formation_completed; to catch later corrections, re-read formationFilingDate in your reconciliation sweep.
  • A deactivated tenant gets E_TENANT_SUSPENDED on Partner Portal reads and writes. Deactivation also revokes every API key, so API-key calls return 401 E_AUTH_INVALID.
  • The IRS EIN letter doesn’t go to the mailing address. 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 nameOptions is the preference. Any position you send is ignored there. A name-options resolution still honours position.
Clarified, no action needed
  • Member names: legalFirstName and legalLastName are required for a person, contactFullName for an entity member, and ownershipPercent must 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.
  • partnerReference on 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.
Change
Request IDs are now 32 hex characters
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.
NewCustomers
Customers now return externalCustomerId
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.
Change
Required actions: awaitingResponse, and stable status after a submission
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.
Change
Sandbox playground: unpaid and cancelled companies are refused
The sandbox playground endpoints now refuse a company that cannot reach a formation milestone, and leave it unchanged:
  • AWAITING_PAYMENT answers 422 E_FORMATION_AWAITING_PAYMENT. Confirm the payment with POST /v1/partner/companies/{companyId}/payment-confirmed, wait for company_formation_submitted, then call the playground.
  • CANCELLED answers 409 E_COMPANY_CANCELLED.
Until now, completing the formation of an unpaid SDK company marked it 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.
ChangeWebhooks
Documentation corrections: webhook payloads, delivery and signing links
These pages now describe what the API actually does. Nothing in the API itself changed.
  • document_* events carry doolaCompanyId and documentType, not documentId or documentCreatedAt. On each event, list the company’s documents and dedupe on the document id. This also corrects the 2026-07-13 and 2026-07-14 entries.
  • There is no partner_webhook_disabled delivery. 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 in GET /v1/partner/webhook/events and on the portal’s Webhook Events tab, but it is never delivered.
  • Redirects are not retried. A 3xx answer fails that delivery. Point your webhook URL at the final host.
  • Unsigned deliveries. X-Doola-Signature is 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. That 410 covers expired and tampered links only.
  • Responsible party. email is required and address is 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.
  • CANCELLED is listed among the formationSubmissionStatus values: an SDK formation that doola withdrew at your request before its payment was confirmed.
ChangeWebhooksFormation
Every formation now completes: COMPLETED status and the completed webhook
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.
WebhooksBreaking
All partners now receive every webhook event
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_required and signature_ss4_reset, both required actions
  • signature_form8821_required
  • company_annual_report_submitted
  • document_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.
NewCompliance
New: Annual Report Filing
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. priceInCents is the state fee doola settles with you outside it.
  • Three new webhook events: company_annual_report_submitted when doola starts filing, company_annual_report_completed when the state has the report, and document_annualreport_uploaded when the filed report is ready to download.
ChangeFormationEIN
SSN and ITIN validation
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.
BreakingCustomers
Breaking: creating a customer with another tenant's email now returns 409
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.
ChangeFormation
Minor change: company description capped at 50 characters
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.
NewRequired actionsEIN
New required action: Form 8821 signature needed
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.
NewWebhooks
Self-serve webhook signing secret, and how to reconcile a missed delivery
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.
NewRequired actions
New feature: required actions
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.
NewCompliance
New endpoint: company compliance calendar
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.
ChangeEIN
Expedited EIN available to every partner
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.
NewFormation
Formation filing number on company responses
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).
NewWebhooks
New webhook: document_operatingagreement_uploaded
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.
NewWebhooks
New webhook: document_corporatebylaws_uploaded
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.
NewSandbox
Sandbox playground: complete formation and EIN on demand
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/complete sets the filing date, uploads the Articles of Organization, fires company_formation_completed and document_aoo_uploaded, and advances the Formation service to Completed.
  • POST /v1/partner/playground/companies/{companyId}/eincreation/complete sets a test EIN, uploads the EIN letter, fires company_ein_issued and document_einletter_uploaded, and advances the EinCreation service to Completed.
Each endpoint runs the same operations production uses, so webhooks are signed, subscription-filtered, retried, and logged exactly like real deliveries. The endpoints exist only in sandbox. See the new Sandbox playground guide.
NewEIN
Form 8821 e-signature for expedited-EIN non-US founders
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.
  • signatureRequirements on Create company and Retrieve company now includes a pending FORM8821 entry alongside SS4 for a non-US + expedited-EIN company. Standard-EIN and US companies are unchanged.
  • POST /v1/partner/companies/{companyId}/signatures accepts documentType: "FORM8821".
  • Three new webhook events mirror the SS-4 set: signature_form8821_completed, document_form8821_uploaded, and signature_form8821_reminder_due (day 1, 3, 7).
See Non-US founders. Existing SS-4 behavior is unchanged.
NewEIN
Expedited EIN at company formation
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.
NewWebhooksEIN
New webhook: company_ein_issued
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.
ChangeFormation
Precise industry selection — naicsCode deprecated
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.
NewFormation
Non-US founder formation with SS-4 e-signature
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 pending SS4 entry for a non-US founder, or an empty list for a US founder.
  • POST /v1/partner/companies/{companyId}/signatures returns 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, and signature_ss4_reminder_due (day 1, 3, 7). You own the reminder cadence.
See the new Non-US founders guide. US-founder integrations are unaffected.
ChangeFormation
formationSubmissionStatus does not report formation completion
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.
ChangeCustomers
Clearer conflict when an email is already in use
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.
ChangeCustomersFormation
Idempotent retries after a failed create
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.
NewFormation
C-Corp formation
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.
New
Initial release
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.
Last modified on October 29, 2026