The flow
- Import the company. It starts at
importStatus: AWAITING_DOCUMENTS. - Upload the documents listed in
documentRequirements. Once every one is on file, the import moves toIN_REVIEW. - doola reviews the import. If something needs correcting, doola raises a required action and you answer it.
- doola verifies the import:
importStatusbecomesVERIFIEDandcompany_import_verifiedfires.
Importing the company
Idempotency-Key is required, as on Create a company. Retrying with the same key and body returns the first response. A failed import releases the key, so fix the request and retry with the same key.
Fields
Send the company as the state has it on file today. Fields shared with company creation follow the same rules: see Domain objects.Response
201 with the company. An imported company differs from one doola forms in a few fields:
The registered agent you sent is stored with the import but not returned on the company.
company_imported fires once the import is saved. No formation webhooks fire for an imported company.
Uploading the documents
documentRequirements lists what doola needs before it can review the import:
Upload each one as
multipart/form-data, with the file in file and its type in documentType:
201 with the stored document:
- PDF only, up to 10MB, with a file name of at most 255 characters. doola checks the file’s contents, not the declared content type.
documentTypeis one ofArticlesOfOrganization,EinLetter,OperatingAgreement,CorporateBylawsorOTHER.Idempotency-Keyis required. Retrying the same file with the same key returns the first upload instead of storing a second copy.- The document then appears in the company’s document list and downloads by its
id. Every type exceptOTHERfires itsdocument_*_uploadedwebhook, as when doola stores a document.
IN_REVIEW. This happens shortly after the upload, not inside the upload call, so read the company again rather than expecting the upload response to show it.
If documents are missing
doola checks once a day for imports still atAWAITING_DOCUMENTS a day after they were created. For each one it raises a single IMPORT_DOCUMENTS_MISSING required action, announced by the company_import_documents_missing webhook. Upload the missing documents and the action closes on its own. Nothing else happens if they never arrive: the import stays at AWAITING_DOCUMENTS and annual filing stays closed.
Upload errors
Review and verification
Once the documents are on file, doola checks them against the facts you sent.- Everything matches. doola verifies the import.
importStatusbecomesVERIFIEDandcompany_import_verifiedfires. - Something needs correcting. doola raises an
IMPORT_INFO_REQUIREDrequired action that names the fields and documents it needs. You send the corrections, doola applies them to the company, and the review continues.
Import statuses
A verified import can go back to
IN_REVIEW if doola needs to check it again. No webhook announces that move, so read importStatus in your reconciliation sweep. Annual filing closes again until the import is verified again. Work that already started, such as an EIN application, carries on.
What waits for verification
- Annual filing. Submitting or confirming an annual report for an imported company answers
409 E_IMPORT_NOT_VERIFIEDuntilimportStatusisVERIFIED. The requirement and fee reads work at any time. - The EIN. See Ordering an EIN.
Ordering an EIN
An imported company without an EIN can order one with Add a service. You can order it at any point after the import:- Before verification, the EIN waits at
NotStarted/WaitingForFilingServiceToCompleteand starts when doola verifies the import. - After verification, it starts right away.
ein already has one, so ordering another answers 409 E_EIN_ALREADY_ISSUED.
Listing imported companies
List companies returnsorigin on every company and importStatus on imported ones, and takes two filters:
Any other value answers
400 E_VALIDATION_FAILED, with the detail on error.fields.origin or error.fields.importStatus.
Webhooks
company_imported and company_import_verified carry doolaCompanyId only: read the company for the rest. The two required-action events carry the required action payload. See Webhooks for examples.
Errors
Branch onerror.code, never on the message. A field error answers 400 E_VALIDATION_FAILED with the field’s own code under error.fields:
The other errors:
A refused import stores nothing.