Annual Report Filing

Submit a company's annual report

Changed on

Records the annual report in one call. Send the answers to every field /requirements published for the company, and only those - a field it was not offered is refused rather than ignored. This does not start the filing: the report rests at FILLED until you call /confirm, and waits there indefinitely. A report already on file for the year is replaced while it is still unconfirmed, and answers 409 once it is being worked on.

post/v1/partner/companies/{companyId}/compliance/annual-reports

Request

  • Base URL
    https://api.test.doola.com
  • URL
    https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports
  • Auth
    API key in header Authorization

Path parameters

companyIdstring required

doola company ID (KSUID).

Request body

fiscalYearinteger nullable

Fiscal year the report covers. Defaults to the current year when omitted.

Example request

{
  "fiscalYear": 2026,
  "answers": [
    {
      "fieldId": "Q17",
      "value": "1000000"
    }
  ],
  "companyDetails": {
    "address": {
      "line1": "251 W 30th St",
      "line2": "Ste 12E",
      "city": "New York",
      "state": "NY",
      "postalCode": "10001",
      "country": "USA",
      "phone": "+12125550100"
    },
    "mailingAddress": {
      "line1": "251 W 30th St",
      "line2": "Ste 12E",
      "city": "New York",
      "state": "NY",
      "postalCode": "10001",
      "country": "USA",
      "phone": "+12125550100"
    },
    "physicalAddress": {
      "line1": "251 W 30th St",
      "line2": "Ste 12E",
      "city": "New York",
      "state": "NY",
      "postalCode": "10001",
      "country": "USA",
      "phone": "+12125550100"
    },
    "phoneNumber": "+13075550100",
    "authorizedShares": 10000000,
    "issuedShares": 2500000,
    "perValuedShares": 0.0001
  }
}

Response

The report is on file and replaced an unconfirmed one for the same fiscal year; same annualReportId, isReplaced true.

annualReportIdstring

Annual report ID (KSUID). Keep it: confirm and the status reads address the report by it.

doolaCompanyIdstring

doola company ID (KSUID).

fiscalYearinteger

Fiscal year the report covers.

statestring

US state the report is filed in.

entityType'LLC' | 'CCorp'

Entity type the report was filed for.

status'FILLED' | 'IN_PROGRESS' | 'AWAITING_INFORMATION' | 'FILING_COMPLETED'

Where the report stands.

priceInCentsinteger

The state fee for this report in whole US cents, fixed when it was recorded. Nothing is charged through this API. 0 where the state charges nothing.

submittedAtstring nullable

Date the report was handed to doola's filing pipeline (yyyy-MM-dd). Null on a report that has only just been recorded; read status for where the report stands.

createdAtstring date-time nullable

When the report was first recorded. Null if the row carries no timestamp.

updatedAtstring date-time nullable

When the report last changed. Null if the row carries no timestamp.

isReplacedboolean

True when a report was already on file for this year and this one took its place, which is allowed only while the report is still FILLED.

Example response

{
  "annualReportId": "2Ns8vJqZ1lQwErTyUiOpAsDfGhJ",
  "doolaCompanyId": "2Ns8vJqZ1lQwErTyUiOpAsDfGhJ",
  "fiscalYear": 2026,
  "state": "WY",
  "entityType": "LLC",
  "status": "FILLED",
  "priceInCents": 6225,
  "submittedAt": "2026-03-01",
  "createdAt": "2026-02-01T09:00:00Z",
  "updatedAt": "2026-02-02T09:00:00Z",
  "answers": [
    {
      "fieldId": "Q17",
      "value": "1000000"
    }
  ]
}

Changes