Skip to main content
This endpoint is read-only. It quotes a price; it neither starts a filing, stores anything, nor charges the customer.
Most states price an annual report from data doola already holds, so the amount comes back on the first call and there is nothing to collect. A small number price it from figures only the customer knows. For those, the first call tells you which fields to gather; the second call, carrying them, returns the amount. Two fields carry the shape of the answer, and they answer different questions:
  • filingRequired — is there an annual report to file in this state at all?
  • needsInput — can the fee be quoted yet, or are figures still needed?
Read both before reading amount. An amount of 0 on its own is ambiguous: some states file the report free of charge, and some file no report at all.

Quoting the fee

The body is optional in full. A bare POST with no body asks what the state needs. Omitting answers and sending [] are different requests, not two spellings of the same one:

When the amount comes straight back

Most calls end here. The state prices from data doola already holds, so the quote is settled on the first request.
Some states compute the amount rather than reading it off a table — Delaware from the company’s authorized shares, for instance. Those still answer immediately, and formula shows the working. A computed fee is not a request for input; only needsInput tells you which case you are in.

When figures are needed first

That is Wyoming’s asset worksheet: a yes/no gate followed by the lines it opens up. Collect those fields — their labels, types and conditional logic are in Annual report requirements — then call again:

Zero is two different situations

Some states file an annual report and charge nothing for it. Others file no annual report at all. Both come back with amount: 0, and only filingRequired tells them apart.
Do not branch on amount === 0. Branch on filingRequired. Treating a NO_REPORT state as free-but-filable would have you gather answers and attempt a filing that cannot be made.
filingRequired: false is a normal answer, not an error — as of today it covers Alabama, New Mexico, Ohio and South Carolina, which between them hold a meaningful share of doola companies. Annual report requirements reports the same filingRequired: false for those companies, with an empty fields list.

Sending answers

Answers are keyed by fieldId, and each field may appear at most once. A repeated fieldId is rejected with 400 rather than resolved: two figures for one field is a request with no correct answer, and quietly picking one would be a guess about money. A fieldId the state does not price from is ignored. This matters because the requirements list mixes the state’s questions with company details, some of them numeric, so posting the whole list back is a natural mistake. Send what inputFieldIds names and nothing more, but a stray field will not corrupt the quote. value is always a string, whatever the field’s type. A blank or unparseable figure counts as zero rather than failing the quote, so a half-filled worksheet still returns a price.

Errors

422 should not occur for a company created through this API. Every US state and DC is covered for both LLC and CCorp, so it is declared for completeness — a state added before its pricing lands, or an entity type outside this API’s reach. A state that simply files no annual report is not a 422: it answers 200 with filingRequired: false.
This endpoint and Annual report requirements answer 422 on the same condition, and report the same filingRequired, because both read the same source. Ownership is enforced the same way across the Partner API: a company that exists but isn’t yours returns 404, never 403, so existence cannot be probed across partners. See Errors.