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

# List Changes

> Every change to the documents and companies the API shows, in order: new documents, documents whose metadata or files changed, documents removed from the API, and the same for companies. Use it to keep a copy of Captide's data up to date without re-reading the lists.

    To start:
    1. Load your starting copy from `GET /api/v2/changes/snapshot`: companies, then documents. Keep the `cursor` of the first page you loaded.
    2. From then on, call this endpoint with `after` set to that `cursor` (then to each response's `nextCursor`) every few minutes, and apply the changes in order. Changes made while you were loading the snapshot come through again, so apply them as upserts and deletes:
       - `document.created` / `company.created`: add it, or replace it if you have it.
       - `document.updated` / `company.updated`: replace it. `changedFields` says what changed and `previous` holds the old values. When a file changed (`originalFileUrl`, `markdownFileUrl`, `layoutJsonFileUrl`) or the document's `id` changed (a new version of its file), fetch it again with `GET /api/v2/documents/{id}`.
       - `document.deleted` / `company.deleted`: remove it, if you have it.

    A document is in the feed when `/documents/list` lists it, so a document that gains a category or a listable file appears as `document.created`. A document dated in the future is announced when it is added, although the list only shows it from its date. Changes are published about a minute after they are made.



## OpenAPI

````yaml GET /api/v2/changes
openapi: 3.1.0
info:
  title: Captide REST API
  description: >-
    API for accessing financial disclosures and AI-powered financial document
    analysis.
  version: 0.3.14
servers:
  - url: https://rest-api.captide.co
    description: Prod server
security: []
paths:
  /api/v2/changes:
    get:
      tags:
        - Changes
      summary: List changes
      description: >-
        Every change to the documents and companies the API shows, in order: new
        documents, documents whose metadata or files changed, documents removed
        from the API, and the same for companies. Use it to keep a copy of
        Captide's data up to date without re-reading the lists.

            To start:
            1. Load your starting copy from `GET /api/v2/changes/snapshot`: companies, then documents. Keep the `cursor` of the first page you loaded.
            2. From then on, call this endpoint with `after` set to that `cursor` (then to each response's `nextCursor`) every few minutes, and apply the changes in order. Changes made while you were loading the snapshot come through again, so apply them as upserts and deletes:
               - `document.created` / `company.created`: add it, or replace it if you have it.
               - `document.updated` / `company.updated`: replace it. `changedFields` says what changed and `previous` holds the old values. When a file changed (`originalFileUrl`, `markdownFileUrl`, `layoutJsonFileUrl`) or the document's `id` changed (a new version of its file), fetch it again with `GET /api/v2/documents/{id}`.
               - `document.deleted` / `company.deleted`: remove it, if you have it.

            A document is in the feed when `/documents/list` lists it, so a document that gains a category or a listable file appears as `document.created`. A document dated in the future is announced when it is added, although the list only shows it from its date. Changes are published about a minute after they are made.
      operationId: list_changes_api_v2_changes_get
      parameters:
        - name: after
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            description: >-
              Return changes after this `sequence`: the last one you processed,
              or `nextCursor` / `latestCursor` from a previous response
            examples:
              - 1310
            default: 0
            title: After
          description: >-
            Return changes after this `sequence`: the last one you processed, or
            `nextCursor` / `latestCursor` from a previous response
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 1000
            minimum: 1
            description: Maximum number of changes to return
            examples:
              - 100
            default: 100
            title: Limit
          description: Maximum number of changes to return
        - name: types
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Comma-separated change types to return, e.g.
              `document.created,document.updated`. Default: all.
            examples:
              - document.created,document.updated
            title: Types
          description: >-
            Comma-separated change types to return, e.g.
            `document.created,document.updated`. Default: all.
        - name: companyIds
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Comma-separated company IDs: only changes to these companies and
              their documents. A document moved to another company comes through
              for both, as `document.updated` with `companyId` in
              `changedFields`.
            examples:
              - 77848abe-a215-41b7-8950-86e89ea1fadc
            title: Companyids
          description: >-
            Comma-separated company IDs: only changes to these companies and
            their documents. A document moved to another company comes through
            for both, as `document.updated` with `companyId` in `changedFields`.
        - name: documentCategories
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Comma-separated document category codes: only document changes in
              these categories (before or after the change). Company changes are
              not affected; use `types` to leave them out.
            examples:
              - earnings-release,earnings-call-transcript
            title: Documentcategories
          description: >-
            Comma-separated document category codes: only document changes in
            these categories (before or after the change). Company changes are
            not affected; use `types` to leave them out.
      responses:
        '200':
          description: A page of changes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChangesResponse'
              example:
                changes:
                  - sequence: 1312
                    id: 6f1d9c1e-2b7a-4d0e-9d5f-0c9a7e2b41a3
                    type: document.updated
                    changedAt: '2026-11-04T18:02:11.514Z'
                    changedFields:
                      - fiscalQuarter
                      - markdownFileUrl
                    previous: {}
                    document:
                      id: 97ac0c55-7349-46ec-8670-92f8524f5294
                      documentCategory: interim-financial-report
                      title: Third Quarter Report
                      description: >-
                        Santos Limited third quarter report for the period
                        ending 30 September 2026, summarising record quarterly
                        production and free cash flow, operational performance
                        across assets (including Barossa, Pikka and PNG LNG),
                        sales and pricing, updated 2026 guidance and project
                        developments.
                      date: '2026-10-22'
                      fiscalQuarter: 3
                      fiscalYear: 2026
                      fiscalPeriod: quarter
                      language: en
                      companyId: 77848abe-a215-41b7-8950-86e89ea1fadc
                      companyName: Santos Ltd.
                      companyTickers:
                        - STO.AX
                      metadata: {}
                  - sequence: 1315
                    id: 0b8e4f52-7c33-4a61-a9d2-5e1f0c6d7b88
                    type: company.updated
                    changedAt: '2026-11-04T18:03:40.027Z'
                    changedFields:
                      - permId
                    previous: {}
                    company:
                      id: 77848abe-a215-41b7-8950-86e89ea1fadc
                      name: Santos Ltd.
                      tickers:
                        - STO.AX
                      countries:
                        - AU
                      filesWithSec: false
                      permId: '4295857141'
                nextCursor: 1315
                hasMore: false
                latestCursor: 1315
        '400':
          description: Invalid request parameters
          content:
            application/json:
              examples:
                unknown_type:
                  summary: >-
                    Unknown change type(s): document.moved. Valid types:
                    document.created, document.updated, document.deleted,
                    company.created, company.updated, company.deleted
                  value:
                    detail: >-
                      Unknown change type(s): document.moved. Valid types:
                      document.created, document.updated, document.deleted,
                      company.created, company.updated, company.deleted
                invalid_company_id:
                  summary: 'Invalid companyIds: each value must be a UUID'
                  value:
                    detail: 'Invalid companyIds: each value must be a UUID'
                invalid_category:
                  summary: 'Invalid document categories: quarterly-letter'
                  value:
                    detail: 'Invalid document categories: quarterly-letter'
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              examples:
                missing_key:
                  summary: Missing API key
                  value:
                    detail: Missing API key
                invalid_key:
                  summary: Invalid or expired API key
                  value:
                    detail: Invalid or expired API key
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Your organization doesn't have access to this endpoint
          content:
            application/json:
              examples:
                forbidden:
                  summary: Access to this endpoint is not allowed for your organization
                  value:
                    detail: >-
                      Access to this endpoint is not allowed for your
                      organization
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: >-
            Validation error: a parameter or body field is missing, has the
            wrong type or is out of range
          content:
            application/json:
              example:
                detail:
                  - type: less_than_equal
                    loc:
                      - query
                      - limit
                    msg: Input should be less than or equal to 1000
                    input: '5000'
                    ctx:
                      le: 1000
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              examples:
                rate_limited:
                  summary: 'Rate limit exceeded: 100 requests per minute'
                  value:
                    detail: 'Rate limit exceeded: 100 requests per minute'
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              examples:
                database_error:
                  summary: Database error occurred
                  value:
                    detail: Database error occurred
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - APIKeyHeader: []
components:
  schemas:
    ChangesResponse:
      properties:
        changes:
          items:
            $ref: '#/components/schemas/Change'
          type: array
          title: Changes
          description: Changes after `after`, oldest first
        nextCursor:
          type: integer
          title: Nextcursor
          description: >-
            Pass as `after` to get the next page. It can move forward even when
            `changes` is empty, past changes your filters skip.
        hasMore:
          type: boolean
          title: Hasmore
          description: Whether more changes may follow `nextCursor` right now
        latestCursor:
          type: integer
          title: Latestcursor
          description: The newest position in the feed
      type: object
      required:
        - changes
        - nextCursor
        - hasMore
        - latestCursor
      title: ChangesResponse
      description: A page of changes.
    ErrorResponse:
      properties:
        detail:
          type: string
          title: Detail
      type: object
      required:
        - detail
      title: ErrorResponse
      description: Standard error response model for all API endpoints.
    ValidationErrorResponse:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationErrorItem'
          type: array
          title: Detail
      type: object
      required:
        - detail
      title: ValidationErrorResponse
      description: '422 body: every invalid field of the request.'
    Change:
      properties:
        sequence:
          type: integer
          title: Sequence
          description: >-
            Position in the feed. Changes are in this order, without gaps in
            what Captide publishes; pass the last one you processed as `after`.
        id:
          type: string
          title: Id
          description: Unique ID of this change
        type:
          type: string
          title: Type
          description: >-
            `document.created`, `document.updated`, `document.deleted`,
            `company.created`, `company.updated` or `company.deleted`
        changedAt:
          type: string
          format: date-time
          title: Changedat
          description: When the change was made (UTC)
        changedFields:
          items:
            type: string
          type: array
          title: Changedfields
          description: >-
            For `updated`: the fields that changed. `originalFileUrl`,
            `markdownFileUrl` or `layoutJsonFileUrl` means a new version of that
            file: fetch fresh links from `GET /api/v2/documents/{id}`.
        previous:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Previous
          description: >-
            For `updated`: the old value of each changed field (file links
            aside)
        document:
          anyOf:
            - $ref: '#/components/schemas/ChangedDocument'
            - type: 'null'
          description: >-
            For document changes: the document after the change; for
            `document.deleted`, as it was last shown
        company:
          anyOf:
            - $ref: '#/components/schemas/CompanyResponse'
            - type: 'null'
          description: >-
            For company changes: the company after the change; for
            `company.deleted`, as it was last shown
      type: object
      required:
        - sequence
        - id
        - type
        - changedAt
        - changedFields
      title: Change
      description: One change to a document or company the API shows.
    ValidationErrorItem:
      properties:
        type:
          type: string
          title: Type
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Loc
        msg:
          type: string
          title: Msg
        input:
          anyOf:
            - {}
            - type: 'null'
          title: Input
        ctx:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Ctx
      type: object
      required:
        - type
        - loc
        - msg
      title: ValidationErrorItem
      description: One invalid field, as FastAPI reports it.
    ChangedDocument:
      properties:
        id:
          type: string
          title: Id
          description: >-
            Document ID, as used by `GET /api/v2/documents/{id}`. A new version
            of the document's file has a new ID; the old one is in
            `previous.id`.
        documentCategory:
          type: string
          title: Documentcategory
          description: Document category code. See [Coverage](/coverage).
        secFormType:
          anyOf:
            - type: string
            - type: 'null'
          title: Secformtype
          description: SEC form type, for SEC filings
        title:
          anyOf:
            - type: string
            - type: 'null'
          title: Title
          description: Captide-generated document title
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: Captide-generated document description
        date:
          anyOf:
            - type: string
            - type: 'null'
          title: Date
          description: Date of the document, as in `/documents/list`
        fiscalQuarter:
          anyOf:
            - type: integer
            - type: 'null'
          title: Fiscalquarter
          description: Fiscal quarter (1 to 4)
        fiscalYear:
          anyOf:
            - type: integer
            - type: 'null'
          title: Fiscalyear
          description: Fiscal year
        fiscalPeriod:
          anyOf:
            - type: string
            - type: 'null'
          title: Fiscalperiod
          description: '`year`, `multi-year`, `month`, `half-year`, `quarter` or null'
        language:
          anyOf:
            - type: string
            - type: 'null'
          title: Language
          description: ISO 639-1 language code
        companyId:
          type: string
          title: Companyid
          description: ID of the company the document belongs to
        companyName:
          anyOf:
            - type: string
            - type: 'null'
          title: Companyname
          description: The company's name now
        companyTickers:
          items:
            type: string
          type: array
          title: Companytickers
          description: The company's tickers now
        metadata:
          additionalProperties: true
          type: object
          title: Metadata
          description: As in `GET /api/v2/documents/{id}`
      type: object
      required:
        - id
        - documentCategory
        - companyId
      title: ChangedDocument
      description: >-
        A document as the API shows it, without file links (they expire; fetch
        them from `GET /api/v2/documents/{id}`).
    CompanyResponse:
      properties:
        id:
          type: string
          title: Id
          description: Unique company ID
        name:
          type: string
          title: Name
          description: Company name
        tickers:
          items:
            type: string
          type: array
          title: Tickers
          description: >-
            List of ticker symbols with exchange suffixes (e.g., 'ASML',
            'ASML.AS')
        countries:
          items:
            type: string
          type: array
          title: Countries
          description: Company's country of domicile (ISO 3166-1 alpha-2)
        filesWithSec:
          type: boolean
          title: Fileswithsec
          description: Whether the company files reports with the SEC
        cik:
          anyOf:
            - type: string
            - type: 'null'
          title: Cik
          description: Central Index Key (CIK) assigned by the SEC
        permId:
          anyOf:
            - type: string
            - type: 'null'
          title: Permid
          description: PermID (Permanent Identifier) assigned by Refinitiv
      type: object
      required:
        - id
        - name
        - tickers
        - countries
        - filesWithSec
      title: CompanyResponse
      description: Response model for single company retrieval.
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key

````

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