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

> ## Agent Instructions
> The OpenAPI document at /api-reference/openapi.yaml defines the target contract. Its x-reflections-availability field and each operation's availability notice identify supported test and live forms. Do not infer implementation from a schema or code sample. Live keys support account details, reads of the licenses the calling account holds as licensee or issued as talent (GET /v1/licenses?role=issuer), and GET /v1/generations?license=… for the state of outputs under such a license (summaries only: no prompt, reference, bytes or metadata). Live image checks, submissions and receipts are built but not activated: until activation, a live POST /v1/checks or /v1/generations returns 403 live_not_activated, which must not be retried. Discovery and JWKS are at the origin root (https://app.reflections.ai/.well-known/...), not under /v1.
> Three rules hold everywhere: a decision is never an error (deny and escalate are 200 responses, and a live check still evaluating is a 202 with status checking); generate nothing for a named talent without an allow; deliver nothing until the generation is allow.
> The sandbox accepts personal rk_test_ keys. Persist a separate Idempotency-Key and body for each logical /v1 POST; retry an unknown outcome with the same key and body. OAuth and Talent API MCP remain planned.

# Retrieve a statement

> **Planned contract — unavailable in test and live modes.** This operation is a protocol reference, not a callable endpoint. Start with the [working sandbox quickstart](/quickstart).

Returns a statement: each line's reported, observed and billable units, the amounts, the
reconciliation result and the recorded payments. A representative whose mandate has
`receive_statements` can retrieve the talent's statements.

Restricted keys need `statements:read`.




## OpenAPI

````yaml /api-reference/openapi.yaml get /statements/{statement_id}
openapi: 3.1.0
info:
  title: Reflections Talent API
  version: '2026-10-15'
  summary: The license server for a person's name, likeness and voice in generative AI.
  description: >
    This document defines the target Talent API contract. Each operation
    declares its current

    test and live availability. Test mode serves a limited fictional sandbox.
    Live keys support

    account details and reading the caller's own licenses. The initial live
    image check,

    submission and receipt implementation is deployed, but requires separate
    live signing

    activation and production acceptance. Start at
    https://docs.reflections.ai/quickstart for test mode.


    The target API lets any product that can generate a real person check
    whether a use is licensed,

    verify the output it made, prove that verification to anyone downstream,
    report usage, and

    honor revocations.


    Protected requests use a secret key in the `Authorization` header. The
    target contract defines test keys

    (`rk_test_…`) and live keys (`rk_live_…`) use the same base URL; the key
    decides the mode.


    A decision is never an error. `deny` and `escalate` are `200` responses that
    carry a decision.

    Errors use RFC 9457 problem details.
  contact:
    name: Reflections developer support
    url: https://docs.reflections.ai/production/support
    email: developers@reflections.ai
servers:
  - url: https://app.reflections.ai/v1
    description: >-
      Fictional test sandbox and conditional live support; availability and
      activation are separate
security:
  - SecretKey: []
tags:
  - name: Account
    description: The account that owns the calling key.
  - name: Talent
    description: >-
      People whose name, likeness and voice are protected and licensed through
      Reflections.
  - name: Facets
    description: >-
      The parts of a talent's identity a license can cover, such as a voice or a
      likeness.
  - name: Resolutions
    description: Find which talent a prompt, image or voice sample invokes.
  - name: Licenses
    description: Signed licenses and their revisions.
  - name: License requests
    description: Ask a talent for a new license or a wider one.
  - name: Connections
    description: A licensee's permission for a platform to use its licenses.
  - name: Files
    description: References and outputs uploaded for checks and generations.
  - name: Checks
    description: Decide whether a use may proceed, before anything is generated.
  - name: Generations
    description: Check an output against the license its check relied on.
  - name: Sessions
    description: Authorize live voice and video with short-lived tokens and sampled checks.
  - name: Receipts
    description: Signed, portable proof of a decision.
  - name: Verifications
    description: Verify a file, manifest or receipt.
  - name: Revocations
    description: Every narrowing of consent, and the platform's acknowledgement of it.
  - name: Usage records
    description: Report usage for settlement and audit.
  - name: Statements
    description: Monthly amounts owed under a license, reconciled against observed usage.
  - name: Mandates
    description: A representative's authority to act for a talent, and its powers.
  - name: Escalations
    description: >-
      The review queue. Checks and held outputs waiting for the talent's side to
      decide.
  - name: License drafts
    description: Terms prepared for a talent's signature. Only a person signs.
  - name: Webhook endpoints
    description: Where Reflections sends events.
  - name: Events
    description: The record of everything that happened to your objects.
  - name: Test helpers
    description: Act as a talent or reviewer in test mode.
  - name: Discovery
    description: The public discovery document and signing keys. Neither needs a key.
  - name: OAuth
    description: >
      Authorization for connections, MCP clients and RSL clients, and the
      metadata that describes it.
paths:
  /statements/{statement_id}:
    get:
      tags:
        - Statements
      summary: Retrieve a statement
      description: >
        **Planned contract — unavailable in test and live modes.** This
        operation is a protocol reference, not a callable endpoint. Start with
        the [working sandbox quickstart](/quickstart).


        Returns a statement: each line's reported, observed and billable units,
        the amounts, the

        reconciliation result and the recorded payments. A representative whose
        mandate has

        `receive_statements` can retrieve the talent's statements.


        Restricted keys need `statements:read`.
      operationId: retrieveStatement
      parameters:
        - $ref: '#/components/parameters/ReflectionsVersion'
        - $ref: '#/components/parameters/ReflectionsAccount'
        - $ref: '#/components/parameters/StatementId'
      responses:
        '200':
          description: The statement.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Statement'
              examples:
                statement:
                  $ref: '#/components/examples/Statement'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/ServerError'
        '503':
          $ref: '#/components/responses/Unavailable'
      security:
        - SecretKey:
            - statements:read
      x-codeSamples:
        - lang: bash
          label: cURL
          source: >
            : "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this
            example}"


            curl --fail-with-body --max-time 30
            'https://app.reflections.ai/v1/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q'
            \
              -H "Authorization: Bearer $REFLECTIONS_KEY" \
              -H "Reflections-Version: 2026-10-15"
        - lang: typescript
          label: TypeScript
          source: >
            import { env, exit } from "node:process";


            const apiKey = env.REFLECTIONS_KEY;

            if (!apiKey) throw new Error("Set REFLECTIONS_KEY before running
            this example");


            const response = await
            fetch("https://app.reflections.ai/v1/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q",
            {
              method: "GET",
              headers: {
                Authorization: `Bearer ${apiKey}`,
                "Reflections-Version": "2026-10-15",
              },
              signal: AbortSignal.timeout(30_000),
            });

            const responseBody = await response.text();

            if (!response.ok) {
              console.error(`HTTP ${response.status}: ${responseBody}`);
              exit(1);
            }

            console.log(responseBody);
        - lang: python
          label: Python
          source: >
            import os

            from urllib.error import HTTPError

            from urllib.request import Request, urlopen


            apiKey = os.environ["REFLECTIONS_KEY"]

            if not apiKey:
                raise ValueError("Set REFLECTIONS_KEY before running this example")

            headers = {
                "Authorization": f"Bearer {apiKey}",
                "Reflections-Version": "2026-10-15",
            }

            request =
            Request("https://app.reflections.ai/v1/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q",
                              method="GET", headers=headers)
            try:
                with urlopen(request, timeout=30) as response:
                    print(response.read().decode("utf-8"))
            except HTTPError as error:
                error_body = error.read().decode("utf-8")
                raise RuntimeError(f"HTTP {error.code}: {error_body}") from error
        - lang: go
          label: Go
          source: |
            package main

            import (
                "fmt"
                "io"
                "net/http"
                "os"
                "time"
            )

            func main() {
                apiKey := os.Getenv("REFLECTIONS_KEY")
                if apiKey == "" {
                    panic("Set REFLECTIONS_KEY before running this example")
                }

                request, err := http.NewRequest("GET", "https://app.reflections.ai/v1/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q", nil)
                if err != nil {
                    panic(err)
                }
                request.Header.Set("Authorization", "Bearer " + apiKey)
                request.Header.Set("Reflections-Version", "2026-10-15")
                client := &http.Client{Timeout: 30 * time.Second}
                response, err := client.Do(request)
                if err != nil {
                    panic(err)
                }
                defer response.Body.Close()
                responseBody, err := io.ReadAll(response.Body)
                if err != nil {
                    panic(err)
                }
                if response.StatusCode < 200 || response.StatusCode >= 300 {
                    panic(fmt.Sprintf("HTTP %d: %s", response.StatusCode, responseBody))
                }
                fmt.Print(string(responseBody))
            }
components:
  parameters:
    ReflectionsVersion:
      name: Reflections-Version
      in: header
      required: false
      description: >-
        The dated API version. Defaults to the version your account is pinned
        to.
      schema:
        type: string
        example: '2026-10-15'
    ReflectionsAccount:
      name: Reflections-Account
      in: header
      required: false
      description: >
        Act for a connected licensee. The value is the licensee's account ID.
        Requires an active

        connection between that account and yours.
      schema:
        type: string
        pattern: ^acct_[0-9a-hjkmnp-tv-z]{26}$
    StatementId:
      name: statement_id
      in: path
      required: true
      description: The statement's ID.
      example: stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q
      schema:
        type: string
        pattern: ^stmt_[0-9a-hjkmnp-tv-z]{26}$
  headers:
    RequestId:
      description: Identifies this request. Include it when you contact support.
      schema:
        type: string
        example: req_8f2k4m6p8r0t2v4x6z8b0d2f4h
    RateLimit:
      description: >-
        Remaining quota and seconds until it resets, as IETF RateLimit header
        fields.
      schema:
        type: string
        example: '"checks";r=184;t=1'
    RateLimitPolicy:
      description: The policy the RateLimit field reports against.
      schema:
        type: string
        example: '"checks";q=200;w=1'
    RetryAfter:
      description: Seconds to wait before retrying.
      schema:
        type: integer
  schemas:
    Statement:
      type: object
      required:
        - id
        - object
        - livemode
        - license
        - talent
        - licensee
        - status
        - period
        - currency
        - lines
        - amount_due
        - amount_paid
        - reconciliation
        - created_at
      properties:
        id:
          type: string
          pattern: ^stmt_[0-9a-hjkmnp-tv-z]{26}$
          description: The statement's ID. Record, confirm and dispute payments against it.
        object:
          type: string
          const: statement
          description: Always `statement`.
        livemode:
          type: boolean
          description: >
            `true` in live mode, `false` in test mode, where statements are
            generated daily.
        license:
          type: string
          pattern: ^lic_[0-9a-hjkmnp-tv-z]{26}$
          description: >
            The license the statement covers. Each statement covers one license
            for one month.
        talent:
          type: string
          pattern: ^tal_[0-9a-hjkmnp-tv-z]{26}$
          description: The talent the licensee owes.
        licensee:
          type: string
          pattern: ^acct_[0-9a-hjkmnp-tv-z]{26}$
          description: The account that holds the license and pays the talent's payee.
        status:
          $ref: '#/components/schemas/StatementStatus'
          description: >
            `open` while the month runs, then `issued`. `paid` once confirmed
            payments reach

            `amount_due`, or `disputed` while the talent's side disputes it.
        period:
          type: object
          description: The month the statement covers.
          properties:
            start:
              type: string
              format: date-time
              description: The start of the period, inclusive.
            end:
              type: string
              format: date-time
              description: 'The end of the period, exclusive: the start of the next month.'
        currency:
          type: string
          pattern: ^[a-z]{3}$
          description: The ISO 4217 code, lowercase, of every amount on the statement.
        lines:
          type: array
          items:
            type: object
            properties:
              description:
                type: string
                description: The line's label, as the statement document shows it.
              units:
                $ref: '#/components/schemas/UsageUnits'
                description: The unit counted, from the license's `compensation`.
              reported:
                type: number
                description: Units you reported.
              observed:
                type: number
                description: Units Reflections recorded from checks and generations.
              billable:
                type: number
                description: The greater of reported and observed.
              rate:
                description: >
                  The license's rate for this unit. Null for a line without a
                  per-unit rate.
                oneOf:
                  - $ref: '#/components/schemas/Money'
                  - type: 'null'
              amount:
                type: integer
                description: '`billable` at `rate`, in the currency''s smallest unit.'
          description: One line per unit the license bills.
        amount_due:
          type: integer
          description: >
            What the licensee owes for the period under the license's
            `compensation`, in the

            currency's smallest unit.
        amount_paid:
          type: integer
          description: The total of `payments`, in the currency's smallest unit.
        reconciliation:
          type: object
          description: How the units reported compare with the units Reflections observed.
          properties:
            result:
              type: string
              enum:
                - matched
                - under_reported
                - over_reported
              description: >
                `matched`: reported and observed agree. `under_reported`:
                Reflections observed more

                than was reported. `over_reported`: more was reported than
                observed.
            detail:
              type:
                - string
                - 'null'
              description: The difference, in words. Null when `matched`.
        payments:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: ^pay_[0-9a-hjkmnp-tv-z]{26}$
                description: >-
                  The payment's ID. The talent's side passes it to Confirm a
                  payment.
              amount:
                type: integer
                description: In the currency's smallest unit.
              paid_at:
                type: string
                format: date-time
                description: When the licensee says it paid.
              method:
                type: string
                enum:
                  - bank_transfer
                  - card
                  - check
                  - other
                description: How the licensee says it paid.
              reference:
                type:
                  - string
                  - 'null'
                description: >
                  The licensee's payment reference, such as a wire ID. Null if
                  it gave none.
              confirmed_at:
                type:
                  - string
                  - 'null'
                format: date-time
                description: When the talent's side confirmed receipt.
          description: >-
            Payments the licensee recorded against the statement, in the order
            recorded.
        dispute:
          type:
            - object
            - 'null'
          description: Present while the talent's side disputes the statement.
          properties:
            reason:
              type: string
              description: Why the talent's side disputes the statement, as written.
            disputed_at:
              type: string
              format: date-time
              description: When the talent's side disputed the statement.
        due_at:
          type:
            - string
            - 'null'
          format: date-time
          description: When payment is due. Null while `open`.
        issued_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >
            When the statement was issued, or last reissued after a dispute.
            Null while `open`.
        document_url:
          type:
            - string
            - 'null'
          format: uri
          description: The statement as a document a person reads. Null while `open`.
        created_at:
          type: string
          format: date-time
          description: When the statement opened, at the start of its period.
    StatementStatus:
      type: string
      description: >-
        `open`: the month is still running. `issued`: final for the month.
        `paid`: the talent's side confirmed payment. `disputed`: the talent's
        side disputed it.
      enum:
        - open
        - issued
        - paid
        - disputed
    UsageUnits:
      type: string
      enum:
        - outputs
        - seconds
        - characters
        - placements
        - impressions
    Money:
      type: object
      required:
        - amount
        - currency
      properties:
        amount:
          type: integer
          description: In the currency's smallest unit, such as cents.
        currency:
          type: string
          pattern: ^[a-z]{3}$
          description: ISO 4217, lowercase.
    Problem:
      type: object
      description: An RFC 9457 problem detail. Every error has this shape.
      required:
        - type
        - title
        - status
        - code
        - request_id
      properties:
        type:
          type: string
          format: uri
          description: A URL for this error, under `https://docs.reflections.ai/errors/`.
        title:
          type: string
          description: A short summary of the error.
        status:
          type: integer
          description: The HTTP status.
        detail:
          type: string
          description: What happened in this request.
        code:
          $ref: '#/components/schemas/ErrorCode'
          description: The stable error code. Branch on it, then on `status`.
        param:
          type: string
          description: The field at fault, as a path such as `use.territories[1]`.
        request_id:
          type: string
          description: >
            `req_…`, the same value as the `Request-Id` header. Include it when
            you contact support.
        doc_url:
          type: string
          format: uri
          description: A link to the documentation for this error.
    ErrorCode:
      type: string
      description: A stable error code. See the error code catalog.
      enum:
        - invalid_request
        - parameter_missing
        - parameter_invalid
        - unsupported_modality
        - unsupported_media_type
        - media_unreadable
        - version_unsupported
        - authorization_code_invalid
        - authentication_required
        - invalid_api_key
        - token_invalid
        - insufficient_scope
        - account_not_connected
        - mandate_required
        - livemode_mismatch
        - live_not_activated
        - platform_not_permitted
        - resource_not_found
        - idempotency_key_in_use
        - generation_already_submitted
        - authorization_consumed
        - check_not_allowed
        - check_expired
        - escalation_closed
        - license_draft_closed
        - invalid_state_transition
        - session_not_active
        - payload_too_large
        - idempotency_key_reused
        - artifact_digest_mismatch
        - rate_limited
        - internal_error
        - service_unavailable
        - evaluation_timeout
  examples:
    Statement:
      summary: An issued monthly statement
      value:
        id: stmt_0c2e4g6j8k0m2n4p6q8r0s2t4v
        object: statement
        livemode: true
        license: lic_k5zba2q8v1m3n7p4r6s9t0wxyh
        talent: tal_9t0wxyhk5zba2q8v1m3n7p4r6s
        licensee: acct_2q8v1m3n7p4r6s9t0wxyhk5zba
        status: issued
        period:
          start: '2026-10-01T00:00:00Z'
          end: '2026-11-01T00:00:00Z'
        currency: usd
        lines:
          - description: Placements, social and web
            units: placements
            reported: 30
            observed: 32
            billable: 32
            rate:
              amount: 25000
              currency: usd
            amount: 800000
        amount_due: 800000
        amount_paid: 0
        reconciliation:
          result: under_reported
          detail: 32 released outputs were placed; 30 were reported.
        payments: []
        due_at: '2026-11-30T23:59:59Z'
        issued_at: '2026-11-02T08:00:00Z'
        document_url: https://app.reflections.ai/statements/stmt_0c2e4g6j8k0m2n4p6q8r0s2t4v
        created_at: '2026-10-01T00:00:00Z'
  responses:
    Unauthorized:
      description: The key is missing, unknown or revoked.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.reflections.ai/errors/invalid_api_key
            title: The API key is not valid
            status: 401
            code: invalid_api_key
            request_id: req_8f2k4m6p8r0t2v4x6z8b0d2f4h
    Forbidden:
      description: >-
        The key may not do this, the licensee is not connected, or live mode is
        not activated for this operation (`live_not_activated`).
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.reflections.ai/errors/account_not_connected
            title: The licensee has not connected your platform
            status: 403
            code: account_not_connected
            detail: >-
              acct_2q8v1m3n7p4r6s9t0wxyhk5zba has no active connection with your
              account.
            request_id: req_8f2k4m6p8r0t2v4x6z8b0d2f4h
    NotFound:
      description: No such object for this account.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.reflections.ai/errors/resource_not_found
            title: No such object
            status: 404
            code: resource_not_found
            request_id: req_8f2k4m6p8r0t2v4x6z8b0d2f4h
    RateLimited:
      description: Too many requests.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.reflections.ai/errors/rate_limited
            title: Too many requests
            status: 429
            code: rate_limited
            request_id: req_8f2k4m6p8r0t2v4x6z8b0d2f4h
    ServerError:
      description: Something failed on our side. Retry with the same idempotency key.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Unavailable:
      description: >
        Reflections is temporarily unavailable. Do not generate a named talent
        without a valid

        authorization. Retry with the same idempotency key.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    SecretKey:
      type: http
      scheme: bearer
      description: >
        Your secret key, `rk_test_…` or `rk_live_…`, sent as `Authorization:
        Bearer <key>`. Keep it

        on your server. Restricted keys carry only the scopes you give them.

````

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