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

# Submit a company's annual report

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



## OpenAPI

````yaml /api-reference/openapi.json post /v1/partner/companies/{companyId}/compliance/annual-reports
openapi: 3.1.0
info:
  title: doola Partner API
  description: >-
    REST API for doola partners to create and manage customers and companies,
    retrieve formation documents, and look up reference data.


    Authenticate every request with a partner API key in the `Authorization`
    header. Generate keys and manage webhooks and event subscriptions in the
    doola Partner Portal.
  contact:
    name: doola
    url: https://www.doola.com
  version: v1
servers:
  - url: https://api.test.doola.com
    description: Sandbox — use test keys (dk_test_…)
  - url: https://api.doola.com
    description: Production — use live keys (dk_live_…)
security:
  - PartnerApiKey: []
tags:
  - name: Playground (sandbox only)
    description: >-
      Sandbox-only helpers to drive a test company through the Formation and
      EinCreation milestones end to end.
  - name: Required Actions
    description: >-
      Actions doola needs you to take on a company, such as supplying new name
      options after a state rejection.
  - name: Customers
    description: Create and look up customers under your partner tenant.
  - name: Documents
    description: List and download a company's formation documents.
  - name: Compliance
    description: Track a company's compliance obligations and their due dates.
  - name: Annual Report Filing
    description: >-
      File a company's annual report with its state: what to collect, what it
      costs, submission, confirmation and status.
  - name: Signatures
    description: Request embedded signing sessions for pending company documents.
  - name: Companies
    description: Create companies for your customers, then track formation status.
  - name: Reference data
    description: >-
      Static lookups for building company-creation requests: NAICS codes,
      states, countries, and state filing fees.
paths:
  /v1/partner/companies/{companyId}/compliance/annual-reports:
    post:
      tags:
        - Annual Report Filing
      summary: Submit a company's annual report
      description: >-
        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.
      operationId: submitAnnualReport
      parameters:
        - name: companyId
          in: path
          description: doola company ID (KSUID).
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartnerAnnualReportSubmissionRequest'
        required: true
      responses:
        '200':
          description: >-
            The report is on file and replaced an unconfirmed one for the same
            fiscal year; same annualReportId, isReplaced true.
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/PartnerAnnualReportFilingResponse'
        '201':
          description: The report is on file, newly created for this fiscal year.
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/PartnerAnnualReportFilingResponse'
        '400':
          description: >-
            E_VALIDATION_FAILED: an answer or a correction was not one this
            company was offered, was missing, or was not the kind of value its
            field asks for. The refused field is reported under error.fields,
            keyed by its fieldId.
        '404':
          description: >-
            E_COMPANY_NOT_FOUND: the company does not exist, or is not owned by
            the calling partner.
        '409':
          description: >-
            E_ANNUAL_REPORT_ALREADY_EXISTS: a report is on file for this company
            and fiscal year that must not be overwritten, because it has been
            confirmed, filed, or is being worked on.
        '422':
          description: >-
            E_STATE_NOT_SUPPORTED: the company's state files no annual report,
            so there is nothing to submit.
components:
  schemas:
    PartnerAnnualReportSubmissionRequest:
      type: object
      description: An annual report to file, supplied whole.
      properties:
        fiscalYear:
          type:
            - integer
            - 'null'
          format: int32
          description: >-
            Fiscal year the report covers. Defaults to the current year when
            omitted.
          example: 2026
          maximum: 2100
          minimum: 2000
        answers:
          type:
            - array
            - 'null'
          description: >-
            One entry per question the requirements published. Omit for a state
            that asks none, which is most of them.
          items:
            $ref: '#/components/schemas/PartnerAnnualReportAnswerDto'
        companyDetails:
          anyOf:
            - $ref: '#/components/schemas/PartnerAnnualReportCompanyDetailsDto'
            - type: 'null'
          description: >-
            Corrections to the company details doola holds. Omit when there are
            none.
    PartnerAnnualReportFilingResponse:
      type: object
      description: An annual report on record.
      properties:
        annualReportId:
          type: string
          description: >-
            Annual report ID (KSUID). Keep it: confirm and the status reads
            address the report by it.
          example: 2Ns8vJqZ1lQwErTyUiOpAsDfGhJ
        doolaCompanyId:
          type: string
          description: doola company ID (KSUID).
          example: 2Ns8vJqZ1lQwErTyUiOpAsDfGhJ
        fiscalYear:
          type: integer
          format: int32
          description: Fiscal year the report covers.
          example: 2026
        state:
          type: string
          description: US state the report is filed in.
          example: WY
        entityType:
          type: string
          description: Entity type the report was filed for.
          enum:
            - LLC
            - CCorp
          example: LLC
        status:
          type: string
          description: Where the report stands.
          enum:
            - FILLED
            - IN_PROGRESS
            - AWAITING_INFORMATION
            - FILING_COMPLETED
          example: FILLED
        priceInCents:
          type: integer
          format: int64
          description: >-
            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.
          example: 6225
        submittedAt:
          type:
            - string
            - 'null'
          description: >-
            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.
          example: '2026-03-01'
        createdAt:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When the report was first recorded. Null if the row carries no
            timestamp.
          example: '2026-02-01T09:00:00Z'
        updatedAt:
          type:
            - string
            - 'null'
          format: date-time
          description: When the report last changed. Null if the row carries no timestamp.
          example: '2026-02-02T09:00:00Z'
        answers:
          type: array
          description: >-
            The answers on record, addressed by the field ids the requirements
            published. Empty for a state that asks no questions, which is most
            of them.
          items:
            $ref: '#/components/schemas/PartnerRecordedAnswerDto'
        isReplaced:
          type: boolean
          description: >-
            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: false
    PartnerAnnualReportAnswerDto:
      type: object
      description: An answer to one of the fields the requirements published.
      properties:
        fieldId:
          type: string
          description: >-
            The field's fieldId from the requirements response, as published in
            fields[].fieldId.
          example: Q17
          minLength: 1
        value:
          type: string
          description: >-
            The answer, as text. Typed against the field's own type before it is
            accepted.
          example: '1000000'
          minLength: 1
      required:
        - fieldId
        - value
    PartnerAnnualReportCompanyDetailsDto:
      type: object
      description: Corrections to the company details doola already holds.
      properties:
        companyName:
          type:
            - string
            - 'null'
          description: Company name as it should appear on the report.
        address:
          anyOf:
            - $ref: '#/components/schemas/PartnerAddressDto'
            - type: 'null'
          description: Business address.
        mailingAddress:
          anyOf:
            - $ref: '#/components/schemas/PartnerAddressDto'
            - type: 'null'
          description: Mailing address.
        physicalAddress:
          anyOf:
            - $ref: '#/components/schemas/PartnerAddressDto'
            - type: 'null'
          description: >-
            Physical address. Required for a Delaware C-corp, which doola does
            not hold one for.
        phoneNumber:
          type:
            - string
            - 'null'
          description: >-
            Phone number. Required for a Delaware C-corp, which doola does not
            hold one for.
          example: '+13075550100'
        authorizedShares:
          type:
            - number
            - 'null'
          description: Authorized shares. A whole number.
          example: 10000000
        issuedShares:
          type:
            - number
            - 'null'
          description: Issued shares. A whole number.
          example: 2500000
        perValuedShares:
          type:
            - number
            - 'null'
          description: Par value per share, in USD.
          example: 0.0001
    PartnerRecordedAnswerDto:
      type: object
      description: One answer on record for an annual report.
      properties:
        fieldId:
          type: string
          description: >-
            Field id, as published by the requirements endpoint's
            fields[].fieldId. An answer stays on record under it after doola
            stops asking that question, so it may name a field the requirements
            no longer publish.
          example: Q17
        value:
          type:
            - string
            - 'null'
          description: What was answered, as given.
          example: '1000000'
    PartnerAddressDto:
      type: object
      description: A postal address.
      properties:
        id:
          type: string
          description: Server-assigned ID.
          readOnly: true
        line1:
          type: string
          description: Street address line 1.
          example: 251 W 30th St
        line2:
          type: string
          description: Street address line 2.
          example: Ste 12E
        city:
          type: string
          description: City.
          example: New York
        state:
          type: string
          description: State or province.
          example: NY
        postalCode:
          type: string
          description: Postal or ZIP code.
          example: '10001'
        country:
          type: string
          description: ISO 3166-1 alpha-3 country code (e.g. USA).
          example: USA
        phone:
          type: string
          description: >-
            Phone number in E.164 format. Required for a person's address (the
            responsible party, a member, or an executive member); optional for a
            company `mailing` or `business` address.
          example: '+12125550100'
      required:
        - city
        - country
        - line1
        - postalCode
        - state
  securitySchemes:
    PartnerApiKey:
      type: apiKey
      description: >-
        Partner API key. Send the raw key as the `Authorization` header value —
        e.g. `dk_test_…` in sandbox or `dk_live_…` in production. Generate and
        rotate keys in the doola Partner Portal.
      name: Authorization
      in: header

````