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

# Get income statement (as-reported)

> Returns the statement exactly as the filing presents it, read from the rendered statement files SEC EDGAR generates from that filing's own XBRL presentation linkbase (go/service/asreported.go). The line_items tree is the filing's real hierarchy: a heading row carries value null and its rows as children.

Structural parity, not label parity. Financial Datasets normalizes some labels where this server prints what the filing prints: Apple's FY2025 income statement says "Gross margin" where they say "Gross Profit". full_label carries the row's XBRL element name on both, so it agrees either way. Verified against their own as-reported output for AAPL FY2025: balance-sheet values agree 19 of 19, cash flow 11 of 11.

ticker is required. Both EDGAR fetches route through Monid, so they bill the caller's wallet and write receipts like every other upstream call.



## OpenAPI

````yaml /api-reference/openapi.json get /financials/income-statements/as-reported
openapi: 3.1.0
info:
  title: Monid Finance API
  version: 1.0.0
  summary: A Financial Datasets-compatible finance REST API backed by Monid providers.
  description: >-
    US equities fundamentals, prices, filings, news, insider trades, and a stock
    screener, generated faithfully from this repository's Go source
    (go/httpapi/rest.go, go/service, go/fd). This server is drop-in compatible
    with the Financial Datasets REST and MCP interface: the same route shapes,
    the same query parameters, and response objects whose field names and field
    order match the Financial Datasets contract, captured 2026-09-04. It is an
    independent, Monid-backed implementation; it is not affiliated with or
    endorsed by Financial Datasets, and no Financial Datasets data or outputs
    are used.


    **Bring your own Monid API key.** Every request carries the caller's own key
    in the `X-API-KEY` header. Usage bills that caller's own Monid wallet; this
    server never stores or logs the key. Get a key at https://monid.ai.


    **Coverage.** All 54 Financial Datasets REST paths are registered. all 54
    return data; most call live Monid providers, and a handful (the static
    catalogs and the accept-universe coverage lists; see each operation's
    description) never call Monid at all. Every registered path answers from a
    live source; there are no not_implemented stubs. /kpi/metrics/sectors
    returns the screener provider's own industry taxonomy and
    /index-funds/tickers the upstream fund universe, both scraped through Monid
    on demand. See docs/compatibility.md for every deliberate deviation and
    docs/openapi-notes.md for how this document was derived.


    **Errors and soft failures.** Every failure — real HTTP error and zero-cost
    soft failure alike — uses the two-key body `{"error": <code>, "message":
    <detail>}`. Some routes answer `not_found` with HTTP 200 rather than a 4xx
    status (see each operation's description).


    **Pagination.** List routes return a wrapped envelope (e.g.
    `{"income_statements": [...], "next_page_url": "..."}`) with opaque,
    server-minted base64url `cursor` tokens. Pages hold 10 records (100 for
    /prices). `next_page_url` is an absolute URL on this deployment's own host,
    present only when more records remain.


    **Ticker coverage lists are accept-universes, not data-coverage claims.**
    The eight `*/tickers` routes (e.g. /company/facts/tickers,
    /kpi/metrics/tickers) all answer from the same ~3,227-ticker US equity
    catalog: the tickers a route will ACCEPT as input, never a promise that
    every one of them has data for that particular dataset - this server has not
    measured per-dataset coverage. Their own `limit` (default 1000, max 5000)
    and `cursor` query parameters page through that shared universe
    independently of every other route's pagination convention above.
  contact:
    url: https://docs.financialdatasets.rip
  license:
    name: MIT
    identifier: MIT
servers:
  - url: https://financialdatasets.rip
    description: Production (Fly.io).
security:
  - ApiKeyAuth: []
tags:
  - name: Financial statements
    description: Income statements, balance sheets, cash flow statements.
  - name: Financial metrics
    description: Historical financial metrics and the live snapshot.
  - name: Earnings
    description: Earnings records composed from SEC filing events.
  - name: Filings
    description: SEC filing index and extracted filing sections.
  - name: Prices
    description: Historical OHLCV prices and the live price snapshot.
  - name: News
    description: Ticker-matched news.
  - name: Insider trades
    description: SEC Form 4 insider trading transactions.
  - name: Screener
    description: Stock screener and its executable filter catalog.
  - name: Company
    description: Company facts.
  - name: KPIs
    description: >-
      KPI-taxonomy metrics, forward guidance, and non-GAAP metrics extracted
      from SEC filings.
  - name: Macroeconomics
    description: Central bank policy interest rates.
  - name: Index funds
    description: ETF / index-fund holdings.
  - name: Institutional holdings
    description: SEC Form 13F institutional-holdings rows.
  - name: Ownership
    description: Insider, beneficial (13D/13G) and activist ownership state.
  - name: Not implemented
    description: >-
      Routes registered for Financial Datasets route parity; always a zero-cost
      not_implemented stub today.
paths:
  /financials/income-statements/as-reported:
    get:
      tags:
        - Financial statements
      summary: Get income statement (as-reported)
      description: >-
        Returns the statement exactly as the filing presents it, read from the
        rendered statement files SEC EDGAR generates from that filing's own XBRL
        presentation linkbase (go/service/asreported.go). The line_items tree is
        the filing's real hierarchy: a heading row carries value null and its
        rows as children.


        Structural parity, not label parity. Financial Datasets normalizes some
        labels where this server prints what the filing prints: Apple's FY2025
        income statement says "Gross margin" where they say "Gross Profit".
        full_label carries the row's XBRL element name on both, so it agrees
        either way. Verified against their own as-reported output for AAPL
        FY2025: balance-sheet values agree 19 of 19, cash flow 11 of 11.


        ticker is required. Both EDGAR fetches route through Monid, so they bill
        the caller's wallet and write receipts like every other upstream call.
      operationId: get_income_statement_as_reported
      parameters:
        - name: ticker
          in: query
          required: false
          schema:
            type: string
          description: Ticker of the issuer. Required.
        - name: period
          in: query
          required: false
          schema:
            type: string
            enum:
              - annual
              - quarterly
            default: annual
          description: annual reads the 10-K, quarterly the 10-Q.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 50
            default: 1
          description: 'Number of filings to return (default: 1).'
        - name: cik
          in: query
          required: false
          schema:
            type: string
          description: >-
            SEC CIK. Accepted for parity; this route resolves the CIK from the
            filing itself.
        - name: report_period
          in: query
          required: false
          schema:
            type: string
            format: date
          description: >-
            Restricts to the period whose report_period equals this date
            (YYYY-MM-DD).
        - name: report_period_gte
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Restricts to periods ending on or after this date.
        - name: report_period_lte
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Restricts to periods ending on or before this date.
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: Opaque base64url pagination cursor.
      responses:
        '200':
          description: As-filed statement, nested as the filing presents it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsReportedIncomeStatementsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '502':
          $ref: '#/components/responses/BadGateway'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
components:
  schemas:
    AsReportedIncomeStatementsResponse:
      type: object
      title: AsReportedIncomeStatementsResponse
      description: >-
        As-reported envelope: {"income_statements": [...]}. The key matches the
        normalized route, so a client that only changed its base URL reads the
        same field.
      properties:
        income_statements:
          type: array
          items:
            $ref: '#/components/schemas/AsReportedStatement'
        next_page_url:
          type: string
      required:
        - income_statements
    AsReportedStatement:
      type: object
      title: AsReportedStatement
      description: >-
        One filing's as-reported statement: its identity plus the line-item
        tree.
      properties:
        ticker:
          type: string
        report_period:
          type: string
          format: date
        fiscal_period:
          type: string
          example: FY2025
        period:
          type: string
          enum:
            - annual
            - quarterly
        currency:
          type: string
        accession_number:
          type: string
        filing_url:
          type: string
        line_items:
          type: array
          items:
            $ref: '#/components/schemas/AsReportedNode'
    ErrorResponse:
      type: object
      title: ErrorResponse
      description: >-
        Uniform error/soft-failure body: {"error": <code>, "message": <detail>}.
        Used both for real HTTP error statuses and for 200 OK
        "not_found"/"not_implemented" soft failures that this API never bills
        for.
      properties:
        error:
          type: string
          description: >-
            Machine-readable error code, e.g. bad_request, unauthorized,
            payment_required, rate_limited, upstream_error,
            upstream_schema_changed, upstream_timeout, unsupported,
            invalid_cursor, not_found, not_implemented.
        message:
          type: string
          description: Human-readable detail.
      required:
        - error
        - message
    AsReportedNode:
      type: object
      title: AsReportedNode
      description: >-
        One row of an as-filed statement, nested exactly as the filing presents
        it. label is the text the filing prints, full_label is the row's XBRL
        element name, value is null on a heading row that only groups its
        children, and children carries the rows beneath it.
      properties:
        label:
          type: string
          description: The row label as the filing prints it.
        full_label:
          type: string
          nullable: true
          description: >-
            The row's XBRL element name, spaced into words. Null when the row
            carries no element.
        value:
          type: number
          nullable: true
          description: >-
            The reported figure. Null on a heading row that groups children
            rather than reporting a number.
        children:
          type: array
          items:
            $ref: '#/components/schemas/AsReportedNode'
          description: Rows nested beneath this one.
  responses:
    BadRequest:
      description: >-
        400 Bad Request. Validation failed before any paid Monid call was made
        (bad_request), or the request is well-formed but names a capability this
        server deliberately rejects (unsupported), e.g. as_reported=true or a
        non-USD currency.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            bad_request:
              summary: Validation failure
              value:
                error: bad_request
                message: ticker must be 1-20 letters, digits, dots, or hyphens
            unsupported:
              summary: Deliberately rejected capability
              value:
                error: unsupported
                message: >-
                  as_reported is not supported by the Monid-backed server;
                  as_reported=True cannot be answered honestly.
            invalid_cursor:
              summary: Malformed pagination cursor
              value:
                error: invalid_cursor
                message: cursor is not a valid opaque pagination token
    Unauthorized:
      description: >-
        401 Unauthorized. The X-API-KEY header was missing, empty, or contained
        control characters, or (if the operator configured an allowlist) the key
        is not on it. This check runs before any Monid call.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            unauthorized:
              value:
                error: unauthorized
                message: Missing or invalid API key.
    PaymentRequired:
      description: >-
        402 Payment Required. The caller's own Monid wallet could not cover the
        call (Monid returned a blocked/insufficient-funds result).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            payment_required:
              value:
                error: payment_required
                message: 'Monid run blocked: insufficient wallet balance.'
    TooManyRequests:
      description: >-
        429 Too Many Requests. Per-API-key token-bucket rate limit exceeded
        (default 60/min per key; 10/min for keyless demo traffic, where
        enabled).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            rate_limited:
              value:
                error: rate_limited
                message: Rate limit exceeded. Retry shortly.
    BadGateway:
      description: >-
        502 Bad Gateway. The upstream Monid provider call failed for a reason
        other than auth/funds/timeout (upstream_error), or its payload no longer
        matches the shape this server parses (upstream_schema_changed).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            upstream_error:
              summary: Generic upstream failure
              value:
                error: upstream_error
                message: provider returned HTTP 500
            upstream_schema_changed:
              summary: Upstream payload shape drifted
              value:
                error: upstream_schema_changed
                message: provider payload is not valid JSON
    GatewayTimeout:
      description: 504 Gateway Timeout. The upstream Monid provider call timed out.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            upstream_timeout:
              value:
                error: upstream_timeout
                message: provider request timed out
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
      description: >-
        The caller's own Monid API key (get one at
        https://monid.ai?fpr=dhruv-15136b). Passed straight through to Monid on
        every call, so usage bills the caller's own wallet — this is never a
        shared server-side credential, and the server never logs or stores it.
        Missing, empty, or malformed values answer 401 unauthorized before any
        paid call is attempted.

````