> ## Documentation Index
> Fetch the complete documentation index at: https://docs.doola.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Annual Report Requirements

> Read the fields to collect from a customer before their annual report is filed.

<Info>
  This endpoint is **read-only**. It describes what to collect; it neither starts a filing nor stores anything.
</Info>

An annual report asks for two different kinds of information: questions the state puts to the company, and company details doola already holds. This endpoint returns both as one ordered list, so you render the list you are given rather than deriving it from the state yourself.

Most states ask no questions at all. For those companies the response carries only the company details, which is the common case rather than an edge one.

## Retrieving the requirements

```
GET /v1/partner/companies/{companyId}/compliance/annual-report/requirements
```

| Query parameter | Meaning                                                                                                                                                                    |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `fiscalYear`    | Year the report covers, `2000`–`2100`. Defaults to the current year. It is echoed back so you can tag what you collect; the field list itself does not vary by year today. |

The full schema is in the **Compliance** section of the API reference. A Wyoming LLC, abbreviated:

```json theme={null}
{
  "doolaCompanyId": "2Ns8vJqZ1lQwErTyUiOpAsDfGhJ",
  "state": "WY",
  "entityType": "LLC",
  "fiscalYear": 2026,
  "filingRequired": true,
  "dueDate": null,
  "fields": [
    {
      "id": "Q16",
      "label": "Do you have any assets in the state of Wyoming?",
      "type": "RADIO",
      "group": "QUESTION",
      "required": true,
      "options": ["Yes", "No"],
      "dependsOn": null
    },
    {
      "id": "Q17",
      "label": "Liquid cash resources in Wyoming (bank balances, petty cash)",
      "type": "AMOUNT",
      "group": "QUESTION",
      "required": true,
      "options": null,
      "dependsOn": { "fieldId": "Q16", "answer": "Yes" }
    },
    {
      "id": "companyName",
      "label": "Company name",
      "type": "TEXT",
      "group": "COMPANY_DETAIL",
      "required": false,
      "options": null,
      "dependsOn": null
    }
  ]
}
```

| Field            | Meaning                                                                                                                         |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `doolaCompanyId` | The company the requirements were read for.                                                                                     |
| `state`          | US state the report is filed in.                                                                                                |
| `entityType`     | `LLC` or `CCorp`. The field list applies to this entity type only.                                                              |
| `fiscalYear`     | The year you asked for, or the current year when you did not send one.                                                          |
| `filingRequired` | Whether the state requires an annual report at all. `false` comes with an empty `fields` list. See below.                       |
| `dueDate`        | Due date (`yyyy-MM-dd`) from the [compliance calendar](/api/compliance/calendar), or `null` when there is no concrete date yet. |
| `fields`         | The fields to collect, in the order to present them.                                                                            |

## Field groups

Every entry carries a `group`, and the two groups behave differently. Read the `group` rather than guessing from the `id`.

| Group            | Who it comes from                       | What it means                               |
| ---------------- | --------------------------------------- | ------------------------------------------- |
| `QUESTION`       | The state asks it. doola has no answer. | Has to be collected.                        |
| `COMPANY_DETAIL` | Company data doola already holds.       | Already known, unless `required` is `true`. |

Questions are listed first, then the company details.

## Required and already known

`required` tells you whether the filing is rejected without the field.

A `COMPANY_DETAIL` with `required: false` is data doola already holds, so you do not have to ask the customer for it. A `COMPANY_DETAIL` with `required: true` is data we do not hold and cannot file without; today that is the phone number and physical address of a Delaware C-corp.

## When no report is filed at all

Four states — Alabama, New Mexico, Ohio and South Carolina — require no annual report. For a company in one of those, this endpoint answers `200` with `filingRequired: false` and an empty `fields` list. There is nothing to collect because there is nothing to file.

```json theme={null}
{
  "doolaCompanyId": "2Ns8vJqZ1lQwErTyUiOpAsDfGhJ",
  "state": "OH",
  "entityType": "LLC",
  "fiscalYear": 2026,
  "filingRequired": false,
  "dueDate": null,
  "fields": []
}
```

<Warning>
  `fields: []` means two different things, and `filingRequired` is what separates them. With `filingRequired: true` it means the state asks nothing beyond the company details — but the company details are always appended, so that case never actually produces an empty list. With `filingRequired: false` the list is empty because no filing exists.
</Warning>

<Note>
  With `filingRequired: true`, `fields` is never empty: the company details are always appended. A state that asks no questions produces a response carrying only the details.
</Note>

<Info>
  What the state charges is a separate call: [Annual report fee](/api/compliance/annual-report-fee). It reports the same `filingRequired`, and answers `422` on the same condition, because both read the same source.
</Info>

<Info>
  Submitting the collected answers is a separate endpoint that is not available yet. Today this endpoint tells you what an annual report will ask for, so you can prepare the collection ahead of it.
</Info>

## Rendering a field

| Field       | Meaning                                                                                                                                                                                                                                           |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`        | Key to send the answer back under.                                                                                                                                                                                                                |
| `label`     | Text to show the customer.                                                                                                                                                                                                                        |
| `type`      | One of `TEXT`, `NUMBER`, `SELECT`, `RADIO`, `AMOUNT`, `DATE`, `BOOLEAN`, `ADDRESS`. `ADDRESS` means a structured address, not a string. `DATE` and `BOOLEAN` are published so adding one later is not a breaking change; nothing uses them today. |
| `options`   | Allowed values for `SELECT` and `RADIO`, `null` otherwise.                                                                                                                                                                                        |
| `dependsOn` | Present when the field only applies given another field's answer: `fieldId` names a field in the same list, `answer` is the value it must carry. Hide the field until then.                                                                       |

Treat the list as data. New `type` values and new fields are added over time, so a client that switches on a closed set of ids will break; one that renders whatever it is handed will not.

## Errors

| HTTP                        | When                                                                       |
| --------------------------- | -------------------------------------------------------------------------- |
| `400 E_VALIDATION_FAILED`   | `fiscalYear` is outside `2000`–`2100`.                                     |
| `404 E_COMPANY_NOT_FOUND`   | The company does not exist, or is not owned by your partner account.       |
| `422 E_STATE_NOT_SUPPORTED` | doola holds no annual-report data for the company's state and entity type. |

<Note>
  `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 that simply files no annual report is **not** a `422`: it answers `200` with `filingRequired: false`.
</Note>

Do not derive the requirements from the [compliance calendar](/api/compliance/calendar), or the other way round. The two answer different questions from different sources: whether doola files an annual report for the state, and whether an obligation is currently tracked for the company. For a small number of states they do not line up, so a tracked due date is not a promise that this endpoint returns a field list, and a `422` here is not a promise that the calendar reports the state as unsupported.

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](/api/errors).
