> ## 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.

> ## Agent Instructions
> Authenticate with the raw API key in the Authorization header. Never add a Bearer prefix.
> Use the sandbox base URL https://api.test.doola.com and a dk_test_ key in examples unless the user asks for production.
> Send an Idempotency-Key header on POST /v1/partner/customers and POST /v1/partner/companies. No other endpoint takes one.
> Every response is wrapped as {payload, error}. Read fields from payload and branch on error.code, never on the message.
> Drive formation progress from webhooks plus a reconciliation sweep, never a polling loop.
> Embedded SDK (@doola/js): the dk_ key stays on the server and mints customer sessions; the browser gets only a pk_ key and the session. onFormed carries only companyId and can fire more than once. Before charging, read the company with the dk_ key, require formationSubmissionStatus AWAITING_PAYMENT, check the owner's email, and price on the server. Then POST payment-confirmed, which answers 200 with an empty body, and replace the SDK element with a new doola.create() (never append a second one).
> The doola Formation MCP server at https://mcp.doola.com is for founders forming their own company with their own doola account. Partners integrate the Partner API or the Embedded SDK. The /mcp endpoint on this docs site only searches these docs.
> For a full capability summary with the rules above, read https://docs.doola.com/skill.md.

# Compliance Calendar

> Read a company's tracked compliance obligations and their due dates.

<Info>
  The compliance calendar is **read-only**. Reading it never triggers a filing, a recomputation, or any side effect — it reflects what doola already tracks for the company.
</Info>

A company's compliance calendar lists the recurring obligations doola tracks to keep it in good standing. Today it returns a single obligation — the **annual report** — with its next due date and a derived status. The response is a list, so future obligation types slot in as additional entries without a breaking change.

To file that annual report through the API, see [Annual Report Filing](/api/compliance/annual-report-filing).

## Retrieving the calendar

```
GET /v1/partner/companies/{companyId}/compliance/calendar
```

The full request and response schema is in the **Compliance** section of the API reference. A successful response:

```json theme={null}
{
  "events": [
    {
      "type": "ANNUAL_REPORT",
      "state": "CA",
      "nextDueDate": "2026-11-30",
      "lastFiledDate": "2025-11-15",
      "status": "UPCOMING"
    }
  ]
}
```

| Field | Meaning |
| - | - |
| `type` | Obligation type. Only `ANNUAL_REPORT` is returned today. |
| `state` | US state the obligation applies to. |
| `nextDueDate` | Next due date (`yyyy-MM-dd`), or `null` when there is no concrete date — see the statuses below. |
| `lastFiledDate` | When the obligation was last filed (`yyyy-MM-dd`), or `null` if never filed. Explains a rolled-forward `nextDueDate`. |
| `status` | Derived status — see [Statuses](#statuses). |

## Statuses

`status` is derived at read time from the resolved due date and the company's state:

| Status | Meaning | Dates |
| - | - | - |
| `UPCOMING` | A due date is set today or in the future. | `nextDueDate` set |
| `OVERDUE` | The due date has passed and the report was not filed. | `nextDueDate` set (in the past) |
| `NOT_YET_DUE` | The company's formation filing is not yet complete, so no due date applies yet. | dates `null` |
| `UNSUPPORTED_STATE` | doola does not track an annual report for the company's state. | dates `null` |

<Note>
  The annual-report event is **always returned** — even for an unsupported state or a company that is too new. The `status` carries the reason and the date fields are `null`, so you never receive an empty list you have to disambiguate.
</Note>

## Roll-forward

The annual report recurs each year. Once a report is filed, `nextDueDate` advances to the next occurrence and `lastFiledDate` records when the previous one was filed — so a future due date is always explainable to the customer.

## Errors

| HTTP | When |
| - | - |
| `404 E_COMPANY_NOT_FOUND` | The company does not exist, or is not owned by your partner account. |

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).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.