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

# Balance Sheets

> Total assets, liabilities, and shareholders' equity for each reporting period, from filed SEC data.

This route returns one balance sheet row per reporting period: total assets, total liabilities, and shareholders' equity, alongside their component lines, normalized to the Financial Datasets field names and order. It shares its provider chain and pagination shape with [Income Statements](/datasets/financial-statements/income-statements): the same `/equities/v1/statements` fetch, joined against `/equities/v1/filings` for SEC identity.

## What this answers

* How a company's total assets and shareholders' equity have moved over recent periods.
* How much cash, inventory, and receivables a company is carrying right now, or as of a past period.

## Coverage

|                   |                                                                         |
| ----------------- | ----------------------------------------------------------------------- |
| Provider chain    | DefiLlama `/equities/v1/statements`, joined with `/equities/v1/filings` |
| Reporting periods | Annual, quarterly, and trailing-twelve-month (`ttm`)                    |
| Measured cost     | \$0.0012 per call (statement fetch plus the filings identity join)      |
| Cache TTL         | 600 seconds, see [Caching](/guides/caching)                             |

## Query rules

`ticker` is required. `period` accepts `annual`, `quarterly`, or `ttm`, and defaults to `annual` on this REST route, unlike the underlying MCP tool's own `ttm` default. Pass `period` explicitly if the default matters.

`as_reported=true` is accepted for parameter parity but always answers `400 bad_request`. `limit` defaults to `4` and caps at `100`. The `report_period*` family of filters narrows by report date, the same way it does on [Income Statements](/datasets/financial-statements/income-statements).

Fields the current Go source declares but our own live captures never populate: `currency`, `accession_number`, `form_type`, `filing_url`, `filing_date`, `filing_datetime`, `current_investments`, `property_plant_and_equipment`, `goodwill_and_intangible_assets`, `investments`, `non_current_investments`, `outstanding_shares`, `tax_assets`, `trade_and_non_trade_payables`, `deferred_revenue`, `deposit_liabilities`, `tax_liabilities`, `accumulated_other_comprehensive_income`, `total_debt`. These are schema-legal and left out of the response rather than guessed.

## Worked example

```bash curl theme={"theme":"css-variables"}
curl -s 'https://financialdatasets.rip/financials/balance-sheets?ticker=AAPL&period=annual&limit=1' \
  -H 'X-API-KEY: <your-api-key>'
```

```json Response theme={"theme":"css-variables"}
{
  "balance_sheets": [
    {
      "ticker": "AAPL",
      "report_period": "2025-09-30",
      "fiscal_period": "FY2025",
      "period": "annual",
      "total_assets": 359241000000,
      "current_assets": 147957000000,
      "cash_and_equivalents": 35934000000,
      "inventory": 5718000000,
      "trade_and_non_trade_receivables": 39777000000,
      "non_current_assets": 211284000000,
      "total_liabilities": 285508000000,
      "current_liabilities": 165631000000,
      "current_debt": 20329000000,
      "non_current_liabilities": 119877000000,
      "non_current_debt": 78328000000,
      "shareholders_equity": 73733000000,
      "retained_earnings": -14264000000
    }
  ]
}
```


## OpenAPI

````yaml api-reference/openapi.json GET /financials/balance-sheets
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/balance-sheets:
    get:
      tags:
        - Financial statements
      summary: Get balance sheets
      description: >-
        Fetches a company's balance sheet history: assets, liabilities, and
        shareholders' equity at each period end. Sourced and joined the same way
        as /financials/income-statements. ttm balance rows are point-in-time
        (carried from the latest quarter, not summed) and omit fiscal_period,
        currency, and filing identity.


        period default note: the underlying get_balance_sheet MCP tool's own
        JSON Schema default is "ttm", matching Financial Datasets. This REST
        route always fills a period value before calling that tool, so an
        omitted `period` query parameter defaults to "annual" here instead.
      operationId: get_balance_sheet
      parameters:
        - name: ticker
          in: query
          required: true
          schema:
            type: string
          description: >-
            Uppercase-normalized ticker symbol (1-20
            letters/digits/dots/hyphens).
        - name: period
          in: query
          required: false
          schema:
            type: string
            enum:
              - annual
              - quarterly
              - ttm
            default: annual
          description: >-
            Reporting period. REST-level default is "annual"; the tool/FD-schema
            default is "ttm".
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 4
          description: 'Number of records to retrieve (default: 4, max: 100).'
        - name: as_reported
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: >-
            Accepted for FD parameter parity but always rejected:
            as_reported=true answers 400 bad_request ("as_reported is not
            supported; use the normalized balance-sheets endpoint") at zero
            cost.
        - name: report_period
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Exact report_period date filter (YYYY-MM-DD).
        - name: report_period_gte
          in: query
          required: false
          schema:
            type: string
            format: date
          description: report_period >= this date (YYYY-MM-DD, inclusive).
        - name: report_period_lte
          in: query
          required: false
          schema:
            type: string
            format: date
          description: report_period <= this date (YYYY-MM-DD, inclusive).
        - name: report_period_gt
          in: query
          required: false
          schema:
            type: string
            format: date
          description: report_period > this date (YYYY-MM-DD, exclusive).
        - name: report_period_lt
          in: query
          required: false
          schema:
            type: string
            format: date
          description: report_period < this date (YYYY-MM-DD, exclusive).
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Opaque base64url pagination cursor from a previous response's
            next_page_url. Omit for the first page.
      responses:
        '200':
          description: >-
            A page of balance sheets, newest report_period first. Real AAPL
            FY2025 annual values captured from our own live API
            (docs/our-live-samples/balance_sheets.json).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BalanceSheetsResponse'
              examples:
                example:
                  value:
                    balance_sheets:
                      - ticker: AAPL
                        report_period: '2025-09-30'
                        fiscal_period: FY2025
                        period: annual
                        total_assets: 359241000000
                        current_assets: 147957000000
                        cash_and_equivalents: 35934000000
                        inventory: 5718000000
                        trade_and_non_trade_receivables: 39777000000
                        non_current_assets: 211284000000
                        total_liabilities: 285508000000
                        current_liabilities: 165631000000
                        current_debt: 20329000000
                        non_current_liabilities: 119877000000
                        non_current_debt: 78328000000
                        shareholders_equity: 73733000000
                        retained_earnings: -14264000000
        '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:
    BalanceSheetsResponse:
      type: object
      title: BalanceSheetsResponse
      description: >-
        Wrapped list envelope: {"balance_sheets": [...], "next_page_url":
        "..."}. Page size is 10 records (100 for /prices).
      properties:
        balance_sheets:
          type: array
          items:
            $ref: '#/components/schemas/BalanceSheet'
        next_page_url:
          type: string
          format: uri
          description: >-
            Absolute URL for the next page, present only when more records
            remain. Built from an opaque base64url cursor over this deployment's
            own host (never a fixed facade base).
      required:
        - balance_sheets
    BalanceSheet:
      type: object
      title: BalanceSheet
      description: >-
        One balance sheet record. Field order matches the Go struct declaration
        in go/fd/types.go. Every field is a pointer with omitempty in the Go
        source: unsourced values are omitted from the response, never nulled or
        fabricated.
      properties:
        ticker:
          type: string
          description: Uppercase ticker symbol.
        report_period:
          type: string
          description: Reporting period end date (YYYY-MM-DD).
          format: date
        fiscal_period:
          type: string
          description: Fiscal-period label. Omitted for ttm rows.
        period:
          type: string
          description: 'Echoes the requested period: annual, quarterly, or ttm.'
        currency:
          type: string
          description: Reporting currency. Always USD.
        accession_number:
          type: string
          description: >-
            SEC EDGAR accession number of the source filing. Omitted for ttm
            rows.
        form_type:
          type: string
          description: SEC form type of the source filing. Omitted for ttm rows.
        filing_url:
          type: string
          description: SEC EDGAR filing index URL. Omitted for ttm rows.
          format: uri
        filing_date:
          type: string
          description: Date the source filing was filed. Omitted for ttm rows.
          format: date
        filing_datetime:
          type: string
          description: >-
            Filing acceptance timestamp. Declared for
            Financial-Datasets-contract parity, but no provider integration in
            this codebase currently sets this field on any record type; always
            omitted in practice today.
          format: date-time
        total_assets:
          type: number
          description: Total assets.
        current_assets:
          type: number
          description: Total current assets.
        cash_and_equivalents:
          type: number
          description: Cash and cash equivalents.
        inventory:
          type: number
          description: Inventory, when itemized.
        current_investments:
          type: number
          description: Not sourced by the validated route; always omitted today.
        trade_and_non_trade_receivables:
          type: number
          description: Accounts receivable, when itemized.
        non_current_assets:
          type: number
          description: Total non-current assets.
        property_plant_and_equipment:
          type: number
          description: PP&E, when itemized.
        goodwill_and_intangible_assets:
          type: number
          description: Goodwill and intangible assets, when itemized.
        investments:
          type: number
          description: Not sourced by the validated route; always omitted today.
        non_current_investments:
          type: number
          description: Not sourced by the validated route; always omitted today.
        outstanding_shares:
          type: number
          description: Basic shares outstanding at period end.
        tax_assets:
          type: number
          description: Not sourced by the validated route; always omitted today.
        total_liabilities:
          type: number
          description: Total liabilities.
        current_liabilities:
          type: number
          description: Total current liabilities.
        current_debt:
          type: number
          description: Short-term debt, when itemized.
        trade_and_non_trade_payables:
          type: number
          description: Not sourced by the validated route; always omitted today.
        deferred_revenue:
          type: number
          description: Not sourced by the validated route; always omitted today.
        deposit_liabilities:
          type: number
          description: Not sourced by the validated route; always omitted today.
        non_current_liabilities:
          type: number
          description: Total non-current liabilities.
        non_current_debt:
          type: number
          description: Long-term debt, when itemized.
        tax_liabilities:
          type: number
          description: Not sourced by the validated route; always omitted today.
        shareholders_equity:
          type: number
          description: Total shareholders' equity.
        retained_earnings:
          type: number
          description: Retained earnings, when itemized.
        accumulated_other_comprehensive_income:
          type: number
          description: Not sourced by the validated route; always omitted today.
        total_debt:
          type: number
          description: Total debt.
    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
  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.

````