openapi: 3.1.0
info:
  title: ForceX Xtract API
  summary: "Quality-first Litecoin data \u2014 addresses, transactions, blocks, mempool,\
    \ and analytics."
  description: 'Public, validated Litecoin chain data with a first-class data-quality
    contract (`meta.validation` on every response). Authenticate with a Bearer API
    key. Per-window credit limits are echoed back as `RateLimit-*` response headers;
    failed calls remain traceable via `meta.request_id`.


    **Monetary amounts** are emitted as integers in the chain''s smallest atomic unit
    (chain-agnostic naming `*_atomic_units`). For Litecoin, 1 LTC = 100,000,000 atomic
    units (sometimes called *litoshi*); scale = 8. Sizes are emitted in **bytes**
    (`size_bytes`) or **vbytes** (`vsize`); transaction counts use `tx_count`. Subscription
    budget windows use `period_*` naming throughout.'
  termsOfService: https://forcex.com/terms
  contact:
    name: ForceX Support
    url: https://forcex.com/support
  license:
    name: Proprietary
  version: 0.2.0
servers:
- url: https://forcex.com
  description: Production
paths:
  /xtract/v1/litecoin/chain/home:
    get:
      tags:
      - chain
      summary: Chain Home
      operationId: getChainHome
      parameters:
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Include
      - name: recent_limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 1
          description: Maximum rows returned by the `recent_blocks` and `recent_transactions`
            include expansions. Defaults to 25 and caps at 100. Ignored when neither
            include is requested.
          default: 25
          title: Recent Limit
        description: Maximum rows returned by the `recent_blocks` and `recent_transactions`
          include expansions. Defaults to 25 and caps at 100. Ignored when neither
          include is requested.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChainHomeResponse'
          headers:
            x-request-id: &id001
              schema:
                type: string
              description: Echo of the request_id; partner correlation token. Emitted
                on every response, including all error statuses.
            RateLimit-Limit: &id002
              schema:
                type: string
              description: Per-window credit limits, RFC 9239 draft format. Post-auth
                responses only.
            RateLimit-Remaining: &id003
              schema:
                type: integer
              description: Credits remaining on the most-restrictive window. Post-auth
                responses only.
            RateLimit-Reset: &id004
              schema:
                type: integer
              description: Seconds until the most-restrictive window resets. Post-auth
                responses only.
            RateLimit-Cost: &id005
              schema:
                type: integer
              description: Credits charged for this request. Post-auth responses only.
            RateLimit-Policy: &id006
              schema:
                type: string
              description: "Informational \u2014 names the limiting window. Post-auth\
                \ responses only."
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: &id007
              schema:
                type: integer
              description: Seconds until the limiting window resets.
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '502':
          description: 'Upstream Litecoin node was reached but returned an error or
            a non-2xx status (connection failure, timeout, or error payload). `error.code`
            = `upstream_unavailable`. Returned only on routes that read live node
            state: the mempool routes (`/mempool`, `/mempool/{txid}`) and `/chain/home`
            when `?include=mempool` is set.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/validation:
    get:
      tags:
      - chain
      summary: Chain Validation
      description: 'Current active validation checkpoint as a single scalar payload.


        By database invariant exactly one row carries `is_valid = TRUE` at any

        moment; this endpoint surfaces that row. Returns 503

        `data_unavailable` when no active checkpoint exists (cold-start or

        indexer mid-rebaseline).'
      operationId: getChainValidation
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationStatusResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/block/{height_or_hash}:
    get:
      tags:
      - chain
      summary: Get Block
      operationId: getBlock
      parameters:
      - name: height_or_hash
        in: path
        required: true
        schema:
          type: string
          title: Height Or Hash
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Include
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BlockResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '404':
          description: "Entity not found. `error.code` = `not_found`. Returned on\
            \ direct entity GETs only \u2014 the `/chain/search` endpoint returns\
            \ 200 with an empty/`not_found`-shaped body instead."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/blocks:
    get:
      tags:
      - chain
      summary: List Blocks
      description: "List block headers in a contiguous height range.\n\nWatermark-pinned:\
        \ end_height is clamped to the snapshot's\n`validated_height` so the response\
        \ never includes blocks beyond the\nvalidated chain height. The clamp is silent\
        \ \u2014 partners observing the\nsnapshot via `meta.validation.validated_height`\
        \ always see a consistent\nupper bound.\n\nRows are ordered ascending by height;\
        \ partners that need to walk a long\nrange issue subsequent requests with\
        \ `start_height = previous_end + 1`."
      operationId: listBlocks
      parameters:
      - name: start_height
        in: query
        required: true
        schema:
          type: integer
          minimum: 0
          description: Inclusive lower bound on block height.
          title: Start Height
        description: Inclusive lower bound on block height.
      - name: end_height
        in: query
        required: true
        schema:
          type: integer
          minimum: 0
          description: Inclusive upper bound on block height. Must be greater than
            or equal to start_height and not exceed the validated chain height.
          title: End Height
        description: Inclusive upper bound on block height. Must be greater than or
          equal to start_height and not exceed the validated chain height.
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 1
          description: Maximum block headers to return for this request. Defaults
            to 25 and caps at 100; test-tier keys are further clamped to the test-key
            page-size cap and surface the requested value under pagination.requested_limit.
          default: 25
          title: Limit
        description: Maximum block headers to return for this request. Defaults to
          25 and caps at 100; test-tier keys are further clamped to the test-key page-size
          cap and surface the requested value under pagination.requested_limit.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BlockListResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/transaction/{txid}:
    get:
      tags:
      - chain
      summary: Get Transaction
      operationId: getTransaction
      parameters:
      - name: txid
        in: path
        required: true
        schema:
          type: string
          title: Txid
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Include
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '404':
          description: "Entity not found. `error.code` = `not_found`. Returned on\
            \ direct entity GETs only \u2014 the `/chain/search` endpoint returns\
            \ 200 with an empty/`not_found`-shaped body instead."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/address/{address}:
    get:
      tags:
      - chain
      summary: Get Address
      operationId: getAddress
      parameters:
      - name: address
        in: path
        required: true
        schema:
          type: string
          title: Address
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Include
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '404':
          description: "Entity not found. `error.code` = `not_found`. Returned on\
            \ direct entity GETs only \u2014 the `/chain/search` endpoint returns\
            \ 200 with an empty/`not_found`-shaped body instead."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/address/{address}/transactions:
    get:
      tags:
      - chain
      summary: Address Transactions
      description: 'Paginated transaction history for an address.


        Cursor-stable: the cursor pins the chain height at which the page was

        issued, so a partner walking many pages sees a consistent snapshot even

        as new blocks land. Deep pagination beyond the test-key cap returns 402.'
      operationId: listAddressTransactions
      parameters:
      - name: address
        in: path
        required: true
        schema:
          type: string
          title: Address
      - name: cursor
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Cursor
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 1
          default: 25
          title: Limit
      - name: direction
        in: query
        required: false
        schema:
          type: string
          pattern: ^(in|out|both)$
          default: both
          title: Direction
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressTransactionListResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/output/{txid}:{vout}:
    get:
      tags:
      - chain
      summary: Get Output
      operationId: getOutput
      parameters:
      - name: txid
        in: path
        required: true
        schema:
          type: string
          pattern: ^[0-9a-f]{64}$
          description: Transaction ID, lowercase hex, 64 chars.
          title: Txid
        description: Transaction ID, lowercase hex, 64 chars.
      - name: vout
        in: path
        required: true
        schema:
          type: integer
          minimum: 0
          description: Output index within the transaction.
          title: Vout
        description: Output index within the transaction.
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Include
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutputResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '404':
          description: "Entity not found. `error.code` = `not_found`. Returned on\
            \ direct entity GETs only \u2014 the `/chain/search` endpoint returns\
            \ 200 with an empty/`not_found`-shaped body instead."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/outputs/batch:
    post:
      tags:
      - chain
      summary: Chain Outputs Batch
      description: "Resolve a list of outpoints in a single request.\n\nBody shape\
        \ (capped at 100 tokens) is validated by `BatchOutputsRequest`\nbefore this\
        \ handler runs \u2014 empty lists and oversized lists surface 422\nfrom the\
        \ FastAPI layer. Per-token format is validated here before the\nunderlying\
        \ point lookup so a single malformed token rejects the whole\nrequest with\
        \ 400 `invalid_outpoint` (no credits consumed beyond the\nbase cost that was\
        \ already pre-charged).\n\nThe response array is order-preserving: index `i`\
        \ carries the result\nfor `body.outpoints[i]`. Outpoints that do not resolve\
        \ surface a\nplaceholder `{txid, vout, error: \"not_found\"}` entry in their\
        \ original\nposition so partners can zip the two arrays without bookkeeping."
      operationId: postChainOutputsBatch
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchOutputsRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchOutputsResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/search:
    get:
      tags:
      - chain
      summary: Search
      description: "Resolver: tries block \u2192 transaction \u2192 address in order.\
        \ First match wins."
      operationId: getChainSearch
      parameters:
      - name: q
        in: query
        required: true
        schema:
          type: string
          minLength: 1
          maxLength: 128
          title: Q
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Include
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/chain/mweb/blocks/{height}:
    get:
      tags:
      - chain
      summary: Mweb Block
      operationId: getMwebBlock
      parameters:
      - name: height
        in: path
        required: true
        schema:
          type: integer
          title: Height
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Include
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MwebBlockResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '404':
          description: "Entity not found. `error.code` = `not_found`. Returned on\
            \ direct entity GETs only \u2014 the `/chain/search` endpoint returns\
            \ 200 with an empty/`not_found`-shaped body instead."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/mempool:
    get:
      tags:
      - mempool
      summary: Mempool Snapshot
      operationId: getMempool
      parameters:
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Include
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MempoolResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '502':
          description: 'Upstream Litecoin node was reached but returned an error or
            a non-2xx status (connection failure, timeout, or error payload). `error.code`
            = `upstream_unavailable`. Returned only on routes that read live node
            state: the mempool routes (`/mempool`, `/mempool/{txid}`) and `/chain/home`
            when `?include=mempool` is set.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/mempool/{txid}:
    get:
      tags:
      - mempool
      summary: Mempool Tx
      operationId: getMempoolTransaction
      parameters:
      - name: txid
        in: path
        required: true
        schema:
          type: string
          title: Txid
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MempoolTxResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '404':
          description: "Entity not found. `error.code` = `not_found`. Returned on\
            \ direct entity GETs only \u2014 the `/chain/search` endpoint returns\
            \ 200 with an empty/`not_found`-shaped body instead."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '502':
          description: 'Upstream Litecoin node was reached but returned an error or
            a non-2xx status (connection failure, timeout, or error payload). `error.code`
            = `upstream_unavailable`. Returned only on routes that read live node
            state: the mempool routes (`/mempool`, `/mempool/{txid}`) and `/chain/home`
            when `?include=mempool` is set.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/mempool/feerates:
    get:
      tags:
      - mempool
      summary: Mempool Feerates
      operationId: getMempoolFeerates
      parameters:
      - name: targets
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "Comma-separated confirmation-target horizons (in blocks).\
            \ Each entry must be an integer in `[1, 1008]`; at most 10 distinct horizons\
            \ per request. Defaults to `1,3,6,24` when omitted. The response returns\
            \ one fee-rate estimate per horizon, in input order, derived from the\
            \ fee rates that confirmed in the last 144 blocks. This is a confirmed-history\
            \ reference, NOT a live mempool snapshot \u2014 partners that need live\
            \ mempool composition should use `GET /mempool` and `GET /mempool/{txid}`."
          title: Targets
        description: "Comma-separated confirmation-target horizons (in blocks). Each\
          \ entry must be an integer in `[1, 1008]`; at most 10 distinct horizons\
          \ per request. Defaults to `1,3,6,24` when omitted. The response returns\
          \ one fee-rate estimate per horizon, in input order, derived from the fee\
          \ rates that confirmed in the last 144 blocks. This is a confirmed-history\
          \ reference, NOT a live mempool snapshot \u2014 partners that need live\
          \ mempool composition should use `GET /mempool` and `GET /mempool/{txid}`."
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FeerateResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/charts/network:
    get:
      tags:
      - charts
      summary: Charts Network
      operationId: getChartsNetwork
      parameters:
      - name: metrics
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "Comma-separated metric names to include in the response. **Valid\
            \ values:** `tx_count` (count of confirmed transactions; default when\
            \ `?metrics=` is omitted), `active_addresses` (distinct addresses with\
            \ activity \u2014 **`grain=day` only** in v1; see note below), `new_addresses`\
            \ (addresses first seen), `total_output_value_atomic_units`, `avg_hashrate_hashes_per_second`\
            \ (H/s), `avg_fee_atomic_units`, `avg_block_size_bytes`. Unknown names\
            \ return 400 `bad_request`. Per-metric units and definitions are in the\
            \ data dictionary at /xtract/docs. **`active_addresses` \xD7 non-day grain\
            \ returns 400 `bad_request`** because daily distinct counts cannot be\
            \ honestly summed into weekly/monthly distincts; the rollup source is\
            \ a planned follow-on. All other metrics aggregate correctly across `day`/`week`/`month`\
            \ (sums for totals; daily-mean averages for rate/fee/size; appropriate\
            \ snapshot semantics where applicable)."
          title: Metrics
        description: "Comma-separated metric names to include in the response. **Valid\
          \ values:** `tx_count` (count of confirmed transactions; default when `?metrics=`\
          \ is omitted), `active_addresses` (distinct addresses with activity \u2014\
          \ **`grain=day` only** in v1; see note below), `new_addresses` (addresses\
          \ first seen), `total_output_value_atomic_units`, `avg_hashrate_hashes_per_second`\
          \ (H/s), `avg_fee_atomic_units`, `avg_block_size_bytes`. Unknown names return\
          \ 400 `bad_request`. Per-metric units and definitions are in the data dictionary\
          \ at /xtract/docs. **`active_addresses` \xD7 non-day grain returns 400 `bad_request`**\
          \ because daily distinct counts cannot be honestly summed into weekly/monthly\
          \ distincts; the rollup source is a planned follow-on. All other metrics\
          \ aggregate correctly across `day`/`week`/`month` (sums for totals; daily-mean\
          \ averages for rate/fee/size; appropriate snapshot semantics where applicable)."
      - name: start
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
            \ `[start, end)` \u2014 `start` is inclusive."
          title: Start
        description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
          \ `[start, end)` \u2014 `start` is inclusive."
      - name: end
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
            \ `[start, end)` \u2014 `end` is **exclusive**. Example: `start=2026-05-12&end=2026-05-15`\
            \ covers May 12, 13, 14 (NOT 15)."
          title: End
        description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
          \ `[start, end)` \u2014 `end` is **exclusive**. Example: `start=2026-05-12&end=2026-05-15`\
          \ covers May 12, 13, 14 (NOT 15)."
      - name: grain
        in: query
        required: false
        schema:
          type: string
          pattern: ^(day|week|month)$
          default: day
          title: Grain
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NetworkChartResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/charts/economic-flow:
    get:
      tags:
      - charts
      summary: Charts Economic Flow
      operationId: getChartsEconomicFlow
      parameters:
      - name: start
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
            \ `[start, end)` \u2014 `start` is inclusive."
          title: Start
        description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
          \ `[start, end)` \u2014 `start` is inclusive."
      - name: end
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
            \ `[start, end)` \u2014 `end` is **exclusive**. Example: `start=2026-05-12&end=2026-05-15`\
            \ covers May 12, 13, 14 (NOT 15)."
          title: End
        description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
          \ `[start, end)` \u2014 `end` is **exclusive**. Example: `start=2026-05-12&end=2026-05-15`\
          \ covers May 12, 13, 14 (NOT 15)."
      - name: grain
        in: query
        required: false
        schema:
          type: string
          pattern: ^(day|week|month|year)$
          default: day
          title: Grain
      - name: unit
        in: query
        required: false
        schema:
          type: string
          pattern: ^(ltc|usd)$
          default: ltc
          title: Unit
      - name: methodology
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Methodology
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EconomicFlowResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/charts/distribution:
    get:
      tags:
      - charts
      summary: Charts Distribution
      operationId: getChartsDistribution
      parameters:
      - name: type
        in: query
        required: true
        schema:
          type: string
          title: Type
      - name: window
        in: query
        required: false
        schema:
          type: string
          pattern: ^(1d|7d|30d|year)$
          default: 30d
          title: Window
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DistributionResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/charts/mweb:
    get:
      tags:
      - charts
      summary: Charts Mweb
      operationId: getChartsMweb
      parameters:
      - name: start
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
            \ `[start, end)` \u2014 `start` is inclusive."
          title: Start
        description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
          \ `[start, end)` \u2014 `start` is inclusive."
      - name: end
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
            \ `[start, end)` \u2014 `end` is **exclusive**. Example: `start=2026-05-12&end=2026-05-15`\
            \ covers May 12, 13, 14 (NOT 15)."
          title: End
        description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
          \ `[start, end)` \u2014 `end` is **exclusive**. Example: `start=2026-05-12&end=2026-05-15`\
          \ covers May 12, 13, 14 (NOT 15)."
      - name: grain
        in: query
        required: false
        schema:
          type: string
          pattern: ^(day|week|month)$
          default: day
          title: Grain
      - name: metrics
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "Comma-separated MWEB metric names. **Valid values:** `pegin_atomic_units`\
            \ (total peg-in value \u2014 transparent \u2192 MWEB), `pegout_atomic_units`\
            \ (total peg-out value \u2014 MWEB \u2192 transparent), `cumulative_balance_atomic_units`\
            \ (running MWEB pool balance at bucket close), `mweb_tx_count` (count\
            \ of MWEB transactions in the bucket; not a kernel count). When `?metrics=`\
            \ is omitted all four are returned. Unknown names return 400 `bad_request`.\
            \ Per-metric definitions are in the data dictionary at /xtract/docs."
          title: Metrics
        description: "Comma-separated MWEB metric names. **Valid values:** `pegin_atomic_units`\
          \ (total peg-in value \u2014 transparent \u2192 MWEB), `pegout_atomic_units`\
          \ (total peg-out value \u2014 MWEB \u2192 transparent), `cumulative_balance_atomic_units`\
          \ (running MWEB pool balance at bucket close), `mweb_tx_count` (count of\
          \ MWEB transactions in the bucket; not a kernel count). When `?metrics=`\
          \ is omitted all four are returned. Unknown names return 400 `bad_request`.\
          \ Per-metric definitions are in the data dictionary at /xtract/docs."
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MwebChartResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/charts/supply:
    get:
      tags:
      - charts
      summary: Charts Supply
      operationId: getChartsSupply
      parameters:
      - name: at
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: At
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplyResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/charts/market:
    get:
      tags:
      - charts
      summary: Charts Market
      operationId: getChartsMarket
      parameters:
      - name: start
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
            \ `[start, end)` \u2014 `start` is inclusive."
          title: Start
        description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
          \ `[start, end)` \u2014 `start` is inclusive."
      - name: end
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
            \ `[start, end)` \u2014 `end` is **exclusive**. Example: `start=2026-05-12&end=2026-05-15`\
            \ covers May 12, 13, 14 (NOT 15)."
          title: End
        description: "ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open\
          \ `[start, end)` \u2014 `end` is **exclusive**. Example: `start=2026-05-12&end=2026-05-15`\
          \ covers May 12, 13, 14 (NOT 15)."
      - name: quote
        in: query
        required: false
        schema:
          type: string
          pattern: ^(USD|BTC|EUR)$
          default: USD
          title: Quote
      - name: grain
        in: query
        required: false
        schema:
          type: string
          pattern: ^day$
          default: day
          title: Grain
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarketResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/developer/me:
    get:
      tags:
      - developer
      summary: Developer Me
      operationId: getDeveloperMe
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeveloperMeResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/developer/usage:
    get:
      tags:
      - developer
      summary: Developer Usage
      description: "By-endpoint \xD7 by-day usage over the last N months (max 12)."
      operationId: getDeveloperUsage
      parameters:
      - name: months
        in: query
        required: false
        schema:
          type: integer
          maximum: 12
          minimum: 1
          default: 12
          title: Months
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeveloperUsageResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
  /xtract/v1/litecoin/developer/limits:
    get:
      tags:
      - developer
      summary: Developer Limits
      description: Self-describing tier + endpoint costs (read-only catalog).
      operationId: getDeveloperLimits
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeveloperLimitsResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
        '400':
          description: 'Bad request. The `error.code` field identifies the specific
            cause: `bad_request` (general validation failure, including malformed
            dates, out-of-order ranges, and request-body validation), `range_too_large`
            (date range exceeds the per-grain cap), `ambiguous_time_range` (legacy
            `from`/`to` and new `start`/`end` supplied with differing values), or
            `invalid_include` (unsupported expansion in `?include=`).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '401':
          description: Authentication required, or the supplied Bearer token is invalid
            or revoked. `error.code` = `auth_required`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '402':
          description: 'Payment-tier gate. `error.code` identifies which gate fired:
            `subscription_required` (no active subscription on the account), `subscription_inactive`
            (subscription exists but is not active), `include_all_requires_paid_tier`
            (sandbox keys cannot request `?include=all`), `include_set_requires_paid_tier`
            (the requested include set exceeds the per-request cost cap for sandbox
            keys), `historical_scan_requires_paid_tier` (sandbox keys cannot scan
            outside the recent window), or `deep_pagination_requires_paid_tier` (sandbox
            keys cannot page beyond the depth cap).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '403':
          description: Authenticated but the key lacks the required scope. `error.code`
            = `scope_insufficient`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '422':
          description: 'Defense-in-depth: the runtime maps standard request-shape
            validation errors to 400, so partners normally see 400 instead of 422.
            This status is declared so any edge-case validation path that bypasses
            the override is still typed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '429':
          description: 'Rate limit or credit budget exceeded. `error.code` identifies
            the window: `rate_limit_exceeded` (per-second or per-minute), `quota_exceeded_daily`
            (sandbox per-day budget), or `quota_exceeded` (per-subscription-period).
            The body carries a `window` field (`second`, `minute`, `day`, or `month`)
            naming the failing limit. Responses include the standard `Retry-After`
            header.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
          headers:
            x-request-id: *id001
            RateLimit-Limit: *id002
            RateLimit-Remaining: *id003
            RateLimit-Reset: *id004
            RateLimit-Cost: *id005
            RateLimit-Policy: *id006
            Retry-After: *id007
        '500':
          description: Internal server error. `error.code` = `internal_error`. Reference
            `meta.request_id` when contacting support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
        '503':
          description: "Service or downstream data store is temporarily unavailable,\
            \ or the endpoint is not implemented in this API version. `error.code`\
            \ identifies the cause: `data_unavailable` (chain tip not yet populated),\
            \ `audit_unavailable` (request completed but audit could not be acknowledged\
            \ \u2014 safe to retry), `plan_misconfigured` (operational issue on the\
            \ API side; not a tier problem), or `endpoint_not_available` (the route\
            \ is reserved and not yet served in this version)."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            x-request-id: *id001
components:
  schemas:
    AddressResponse:
      properties:
        data:
          $ref: '#/components/schemas/AddressSummary'
        included:
          anyOf:
          - type: object
          - type: 'null'
          title: Included
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: AddressResponse
    AddressSearchSummary:
      properties:
        address:
          type: string
          title: Address
        address_type:
          anyOf:
          - type: string
            enum:
            - pubkeyhash
            - scripthash
            - witness_v0_keyhash
            - witness_v0_scripthash
            - witness_v1_taproot
            - pubkey
            - multisig
            - nulldata
            - nonstandard
            - unknown
            - mweb
          - type: 'null'
          title: Address Type
        lifetime_tx_count:
          type: integer
          title: Lifetime Tx Count
      additionalProperties: false
      type: object
      required:
      - address
      - lifetime_tx_count
      title: AddressSearchSummary
      description: '`data.summary` when `data.type == "address"`.'
    AddressSummary:
      properties:
        address:
          type: string
          title: Address
        address_type:
          anyOf:
          - type: string
            enum:
            - pubkeyhash
            - scripthash
            - witness_v0_keyhash
            - witness_v0_scripthash
            - witness_v1_taproot
            - pubkey
            - multisig
            - nulldata
            - nonstandard
            - unknown
            - mweb
          - type: 'null'
          title: Address Type
        balance_atomic_units:
          type: integer
          title: Balance Atomic Units
        first_seen_height:
          anyOf:
          - type: integer
          - type: 'null'
          title: First Seen Height
        first_seen_time:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: First Seen Time
        last_seen_height:
          anyOf:
          - type: integer
          - type: 'null'
          title: Last Seen Height
        last_seen_time:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: Last Seen Time
        lifetime_tx_count:
          type: integer
          title: Lifetime Tx Count
      additionalProperties: false
      type: object
      required:
      - address
      - balance_atomic_units
      - lifetime_tx_count
      title: AddressSummary
      description: Default response data for /chain/address/{address}.
    AddressTransactionListItem:
      properties:
        txid:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Txid
        block_height:
          type: integer
          title: Block Height
        block_time:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: Block Time
        direction:
          type: string
          enum:
          - in
          - out
          title: Direction
        value_atomic_units:
          type: integer
          title: Value Atomic Units
        is_coinbase:
          type: boolean
          title: Is Coinbase
          default: false
        is_hogex:
          type: boolean
          title: Is Hogex
          default: false
        has_mweb:
          type: boolean
          title: Has Mweb
          default: false
      additionalProperties: false
      type: object
      required:
      - txid
      - block_height
      - block_time
      - direction
      - value_atomic_units
      title: AddressTransactionListItem
    AddressTransactionListResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/AddressTransactionListItem'
          type: array
          title: Data
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
        pagination:
          $ref: '#/components/schemas/PaginationCursor'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      - pagination
      title: AddressTransactionListResponse
    BatchOutputItem:
      properties:
        txid:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Txid
        vout:
          type: integer
          title: Vout
        value_atomic_units:
          type: integer
          title: Value Atomic Units
        address:
          anyOf:
          - type: string
          - type: 'null'
          title: Address
        address_type:
          anyOf:
          - type: string
            enum:
            - pubkeyhash
            - scripthash
            - witness_v0_keyhash
            - witness_v0_scripthash
            - witness_v1_taproot
            - pubkey
            - multisig
            - nulldata
            - nonstandard
            - unknown
            - mweb
          - type: 'null'
          title: Address Type
        is_mweb:
          type: boolean
          title: Is Mweb
        block_height:
          type: integer
          title: Block Height
        spent:
          type: boolean
          title: Spent
        script_pubkey_hex:
          anyOf:
          - type: string
          - type: 'null'
          title: Script Pubkey Hex
      additionalProperties: false
      type: object
      required:
      - txid
      - vout
      - value_atomic_units
      - is_mweb
      - block_height
      - spent
      title: BatchOutputItem
      description: 'One resolved output in `BatchOutputsResponse.data[]`.


        Shape matches `OutputDefault` (the singleton `/chain/output/{txid}:{vout}`

        payload) so partner views that already render a single output can reuse

        the same item view for each batch entry.'
    BatchOutputMissing:
      properties:
        txid:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Txid
        vout:
          type: integer
          title: Vout
        error:
          type: string
          enum:
          - not_found
          const: not_found
          title: Error
      additionalProperties: false
      type: object
      required:
      - txid
      - vout
      - error
      title: BatchOutputMissing
      description: "Placeholder entry for an outpoint that did not resolve.\n\nOccupies\
        \ the same position in the response array as the unresolved\noutpoint occupied\
        \ in the request \u2014 partners can detect a miss by the\n`error` field rather\
        \ than by index-shifting against a separate list.\nThe `txid` / `vout` echo\
        \ the request token so a partner that processes\nthe response in isolation\
        \ still knows which outpoint failed."
    BatchOutputsRequest:
      properties:
        outpoints:
          items:
            type: string
          type: array
          maxItems: 100
          minItems: 1
          title: Outpoints
          description: Ordered list of outpoint tokens to resolve. Each token is `"<txid>:<vout>"`
            (64-hex txid, non-negative vout). Up to 100 tokens per request; longer
            lists must be chunked client-side.
      additionalProperties: false
      type: object
      required:
      - outpoints
      title: BatchOutputsRequest
      description: "Request body for `POST /chain/outputs/batch`.\n\n`outpoints` is\
        \ an ordered list of `\"<txid>:<vout>\"` tokens. The response\npreserves input\
        \ order \u2014 index `i` in the response corresponds to index\n`i` in the\
        \ request \u2014 so partners can zip the two arrays without extra\nbookkeeping.\
        \ Tokens repeat freely; each occurrence is resolved\nindependently and surfaces\
        \ as its own response entry."
    BatchOutputsResponse:
      properties:
        data:
          items:
            anyOf:
            - $ref: '#/components/schemas/BatchOutputItem'
            - $ref: '#/components/schemas/BatchOutputMissing'
          type: array
          title: Data
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: BatchOutputsResponse
      description: 'Envelope for `POST /chain/outputs/batch`.


        `data[]` preserves request order one-to-one. Each entry is either a

        `BatchOutputItem` (resolved) or a `BatchOutputMissing` (`error:

        "not_found"`). Partners can detect a miss with a simple

        `entry.get("error") == "not_found"` check.'
    BlockHeader:
      properties:
        height:
          type: integer
          title: Height
        hash:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Hash
        prev_hash:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Prev Hash
        merkleroot:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Merkleroot
        version:
          type: integer
          title: Version
        bits:
          type: string
          title: Bits
        difficulty:
          type: number
          title: Difficulty
        nonce:
          type: integer
          title: Nonce
        block_time:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: Block Time
        size_bytes:
          type: integer
          title: Size Bytes
        weight:
          type: integer
          title: Weight
        tx_count:
          type: integer
          title: Tx Count
        has_mweb:
          type: boolean
          title: Has Mweb
      additionalProperties: false
      type: object
      required:
      - height
      - hash
      - prev_hash
      - merkleroot
      - version
      - bits
      - difficulty
      - nonce
      - block_time
      - size_bytes
      - weight
      - tx_count
      - has_mweb
      title: BlockHeader
      description: Default response data for /chain/block/{height_or_hash}.
    BlockListItem:
      properties:
        height:
          type: integer
          title: Height
        hash:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Hash
        prev_hash:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Prev Hash
        merkleroot:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Merkleroot
        version:
          type: integer
          title: Version
        bits:
          type: string
          title: Bits
        difficulty:
          type: number
          title: Difficulty
        nonce:
          type: integer
          title: Nonce
        block_time:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: Block Time
        size_bytes:
          type: integer
          title: Size Bytes
        weight:
          type: integer
          title: Weight
        tx_count:
          type: integer
          title: Tx Count
        has_mweb:
          type: boolean
          title: Has Mweb
      additionalProperties: false
      type: object
      required:
      - height
      - hash
      - prev_hash
      - merkleroot
      - version
      - bits
      - difficulty
      - nonce
      - block_time
      - size_bytes
      - weight
      - tx_count
      - has_mweb
      title: BlockListItem
      description: 'One block header in a `/chain/blocks` range response.


        Same shape as `BlockHeader` (default `/chain/block/{height_or_hash}`

        payload) so partners that already render a single-block surface can reuse

        their item view for the list surface. `has_mweb` is derived via the same

        LEFT JOIN on the MWEB block-stats surface used by the singleton route.'
    BlockListResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/BlockListItem'
          type: array
          title: Data
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
        pagination:
          $ref: '#/components/schemas/PaginationCursor'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      - pagination
      title: BlockListResponse
      description: 'Envelope for `GET /chain/blocks?start_height=&end_height=&limit=`.


        `data` carries up to `pagination.effective_limit` `BlockListItem` rows,

        ordered by `height ASC`. `pagination` echoes the page size that was

        actually applied (test keys clamp to a smaller page than paid keys).'
    BlockResponse:
      properties:
        data:
          $ref: '#/components/schemas/BlockHeader'
        included:
          anyOf:
          - type: object
          - type: 'null'
          title: Included
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: BlockResponse
    BlockSearchSummary:
      properties:
        height:
          type: integer
          title: Height
        hash:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Hash
        block_time:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: Block Time
      additionalProperties: false
      type: object
      required:
      - height
      - hash
      - block_time
      title: BlockSearchSummary
      description: '`data.summary` when `data.type == "block"`.'
    ChainHomeData:
      properties:
        chain:
          type: string
          enum:
          - litecoin
          const: litecoin
          title: Chain
          default: litecoin
        tip_height:
          type: integer
          title: Tip Height
        tip_hash:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Tip Hash
        tip_time:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: Tip Time
        validation_summary:
          $ref: '#/components/schemas/ValidationSummary'
      additionalProperties: false
      type: object
      required:
      - tip_height
      - tip_hash
      - tip_time
      - validation_summary
      title: ChainHomeData
    ChainHomeResponse:
      properties:
        data:
          $ref: '#/components/schemas/ChainHomeData'
        included:
          anyOf:
          - type: object
          - type: 'null'
          title: Included
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: ChainHomeResponse
    DeveloperLimitsData:
      properties:
        tier:
          type: string
          enum:
          - free
          - starter
          - builder
          - growth
          - enterprise
          title: Tier
        minute_credits:
          type: integer
          title: Minute Credits
        period_credits:
          type: integer
          title: Period Credits
        endpoints:
          items:
            $ref: '#/components/schemas/EndpointLimit'
          type: array
          title: Endpoints
      additionalProperties: false
      type: object
      required:
      - tier
      - minute_credits
      - period_credits
      - endpoints
      title: DeveloperLimitsData
    DeveloperLimitsResponse:
      properties:
        data:
          $ref: '#/components/schemas/DeveloperLimitsData'
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: DeveloperLimitsResponse
    DeveloperMeData:
      properties:
        user_id:
          type: string
          title: User Id
        key_prefix:
          type: string
          pattern: ^[0-9a-f]{8}$
          title: Key Prefix
        environment:
          type: string
          enum:
          - live
          - test
          title: Environment
        plan_code:
          type: string
          title: Plan Code
        tier:
          type: string
          enum:
          - free
          - starter
          - builder
          - growth
          - enterprise
          title: Tier
        scopes:
          items:
            type: string
          type: array
          title: Scopes
        current_minute_credits_used:
          type: integer
          title: Current Minute Credits Used
        current_minute_credits_limit:
          type: integer
          title: Current Minute Credits Limit
        minute_reset_in_seconds:
          type: integer
          title: Minute Reset In Seconds
        current_period_credits_used:
          type: integer
          title: Current Period Credits Used
        current_period_credits_limit:
          type: integer
          title: Current Period Credits Limit
        period_reset_in_seconds:
          type: integer
          title: Period Reset In Seconds
        period_start:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: Period Start
        period_end:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: Period End
      additionalProperties: false
      type: object
      required:
      - user_id
      - key_prefix
      - environment
      - plan_code
      - tier
      - scopes
      - current_minute_credits_used
      - current_minute_credits_limit
      - minute_reset_in_seconds
      - current_period_credits_used
      - current_period_credits_limit
      - period_reset_in_seconds
      title: DeveloperMeData
    DeveloperMeResponse:
      properties:
        data:
          $ref: '#/components/schemas/DeveloperMeData'
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: DeveloperMeResponse
    DeveloperUsageResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/DeveloperUsageRow'
          type: array
          title: Data
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: DeveloperUsageResponse
    DeveloperUsageRow:
      properties:
        day:
          type: string
          title: Day
        endpoint:
          type: string
          title: Endpoint
        request_count:
          type: integer
          title: Request Count
        credit_cost_sum:
          type: integer
          title: Credit Cost Sum
        error_count:
          type: integer
          title: Error Count
      additionalProperties: false
      type: object
      required:
      - day
      - endpoint
      - request_count
      - credit_cost_sum
      - error_count
      title: DeveloperUsageRow
      description: "One row in /developer/usage \u2014 (key, day, endpoint) granularity."
    DistributionBucket:
      properties:
        bucket:
          type: string
          title: Bucket
          description: "Human-readable bucket label, e.g. `1 - 5`. Display string\
            \ only \u2014 programmatic consumers should key off `lower_atomic_units`\
            \ / `upper_atomic_units`."
        bucket_order:
          type: integer
          minimum: 0.0
          title: Bucket Order
          description: Zero-based ordinal position of this bucket within the snapshot;
            preserves the canonical small-to-large ordering.
        lower_atomic_units:
          type: integer
          minimum: 0.0
          title: Lower Atomic Units
          description: Inclusive lower bound of the bucket value range, in atomic
            units.
        upper_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Upper Atomic Units
          description: Exclusive upper bound of the bucket value range, in atomic
            units. `null` on the top bucket (open-ended upper bound).
        count:
          type: integer
          minimum: 0.0
          title: Count
          description: "Number of entities (addresses, transactions, \u2026) that\
            \ fall in this bucket."
        total_value_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Total Value Atomic Units
          description: Sum of the underlying value (e.g. balance, output value) contained
            in this bucket, in atomic units. Omitted for distribution types that don't
            carry a value sum.
        share:
          anyOf:
          - type: number
            maximum: 1.0
            minimum: 0.0
          - type: 'null'
          title: Share
          description: Bucket's `count` as a fraction of the snapshot's total count
            `[0.0, 1.0]`. Omitted when the denominator is zero.
      additionalProperties: false
      type: object
      required:
      - bucket
      - bucket_order
      - lower_atomic_units
      - count
      title: DistributionBucket
      description: "One row of `/charts/distribution` output \u2014 a single histogram\
        \ bucket.\n\nFields are partner-facing names. `lower_atomic_units` / `upper_atomic_units`\n\
        describe the bucket's half-open value range `[lower, upper)`; the top bucket\n\
        carries a `null` upper bound (open-ended). `total_value_atomic_units` is the\n\
        sum of the underlying value contained in the bucket (e.g. summed balance\n\
        for `type=balance`) and is optional so types that don't have a value sum\n\
        (e.g. a count-only histogram) can omit it cleanly."
    DistributionData:
      properties:
        snapshot:
          $ref: '#/components/schemas/DistributionSnapshot'
        buckets:
          items:
            $ref: '#/components/schemas/DistributionBucket'
          type: array
          title: Buckets
      additionalProperties: false
      type: object
      required:
      - snapshot
      - buckets
      title: DistributionData
    DistributionResponse:
      properties:
        data:
          $ref: '#/components/schemas/DistributionData'
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: DistributionResponse
    DistributionSnapshot:
      properties:
        type:
          type: string
          enum:
          - tx_volume
          - adjusted_tx_volume
          - balance
          - address_activity
          title: Type
          description: Distribution type this snapshot describes (mirrors the request
            `?type=` param).
        window:
          type: string
          enum:
          - 1d
          - 7d
          - 30d
          - year
          title: Window
          description: Aggregation window this snapshot describes (mirrors the request
            `?window=` param).
        snapshot_date:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
          title: Snapshot Date
          description: Date the snapshot was taken (YYYY-MM-DD, UTC).
        snapshot_height:
          type: integer
          minimum: 0.0
          title: Snapshot Height
          description: Chain height the snapshot was computed against.
        methodology_version:
          type: string
          title: Methodology Version
          description: Methodology / aggregator version string that produced the snapshot.
      additionalProperties: false
      type: object
      required:
      - type
      - window
      - snapshot_date
      - snapshot_height
      - methodology_version
      title: DistributionSnapshot
      description: "Snapshot metadata for the returned distribution \u2014 pins the\
        \ data to the\nexact point in time and chain height the histogram was computed\
        \ at."
    EconomicFlowPoint:
      properties:
        date:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
          title: Date
        adjusted_volume_atomic_units:
          type: integer
          title: Adjusted Volume Atomic Units
          description: Adjusted (deduplicated/filtered) bucket volume, in atomic units.
        adjusted_volume_usd:
          anyOf:
          - type: number
          - type: 'null'
          title: Adjusted Volume Usd
          description: adjusted_volume_atomic_units converted to USD via the bucket's
            market rate.
        total_volume_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Total Volume Atomic Units
          description: Raw bucket volume (no adjustment), in atomic units.
      additionalProperties: false
      type: object
      required:
      - date
      - adjusted_volume_atomic_units
      title: EconomicFlowPoint
    EconomicFlowResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/EconomicFlowPoint'
          type: array
          title: Data
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: EconomicFlowResponse
    EndpointLimit:
      properties:
        path:
          type: string
          title: Path
        method:
          type: string
          enum:
          - GET
          const: GET
          title: Method
        default_credit_cost:
          type: integer
          title: Default Credit Cost
        includes:
          items:
            $ref: '#/components/schemas/IncludeOption'
          type: array
          title: Includes
        min_tier:
          type: string
          enum:
          - free
          - starter
          - builder
          - growth
          - enterprise
          title: Min Tier
        test_key_access:
          type: string
          enum:
          - point
          - scan_windowed
          - hybrid
          title: Test Key Access
        max_page_size_test:
          anyOf:
          - type: integer
          - type: 'null'
          title: Max Page Size Test
        max_page_size_paid:
          anyOf:
          - type: integer
          - type: 'null'
          title: Max Page Size Paid
        available:
          type: boolean
          title: Available
          default: true
        unavailable_reason:
          anyOf:
          - type: string
          - type: 'null'
          title: Unavailable Reason
          description: "When `available` is False, this is the stable `error.code`\
            \ the endpoint returns (currently only `endpoint_not_available`). The\
            \ listed `default_credit_cost` is NOT charged while an endpoint is unavailable\
            \ \u2014 the route returns 503 before charge."
      additionalProperties: false
      type: object
      required:
      - path
      - method
      - default_credit_cost
      - includes
      - min_tier
      - test_key_access
      title: EndpointLimit
    ErrorBody:
      properties:
        code:
          type: string
          title: Code
          description: Stable machine-readable error code, e.g. 'auth_required'.
        message:
          type: string
          title: Message
          description: Human-readable explanation, never leaks internals.
      additionalProperties: true
      type: object
      required:
      - code
      - message
      title: ErrorBody
      description: "Inner error block \u2014 surfaced under `error` on 4xx/5xx envelopes."
    ErrorCode:
      type: string
      enum:
      - bad_request
      - not_found
      - forbidden
      - unauthorized
      - rate_limited
      - internal_error
      - bad_gateway
      - data_unavailable
      - service_unavailable
      - invalid_include
      - address_type_deferred
      - endpoint_not_available
      - day_only_metric
      - not_supported
      - auth_required
      - scope_insufficient
      - subscription_required
      - subscription_inactive
      - plan_misconfigured
      - rate_limit_exceeded
      - quota_exceeded
      - quota_exceeded_daily
      - include_all_requires_paid_tier
      - include_set_requires_paid_tier
      - historical_scan_requires_paid_tier
      - deep_pagination_requires_paid_tier
      - ambiguous_time_range
      - range_too_large
      - invalid_outpoint
      - upstream_unavailable
      - audit_unavailable
      title: ErrorCode
      description: "Canonical `error.code` tokens.\n\nMembers are added \u2014 never\
        \ renamed. Membership is asserted at test time\nagainst every `code=` literal\
        \ raised from `app/`."
    ErrorResponse:
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'
        meta:
          $ref: '#/components/schemas/ResponseMeta-Input'
      additionalProperties: false
      type: object
      required:
      - error
      - meta
      title: ErrorResponse
      description: 4xx / 5xx response envelope. `meta` retained for request_id correlation.
    FeerateEstimate:
      properties:
        target_blocks:
          type: integer
          maximum: 1008.0
          minimum: 1.0
          title: Target Blocks
          description: Confirmation-target horizon in blocks. Echoes the partner-supplied
            value from `?targets=`. 1 maps to the next block, larger values map to
            longer wait windows.
        sat_per_vbyte:
          type: number
          minimum: 0.0
          title: Sat Per Vbyte
          description: Historical fee-rate percentile (in sat/vB) from the last `lookback_blocks`
            confirmed blocks. Aggressive percentiles map to short target horizons;
            conservative percentiles map to long horizons. Treat as a confirmed-history
            reference, not a live mempool prediction.
      additionalProperties: false
      type: object
      required:
      - target_blocks
      - sat_per_vbyte
      title: FeerateEstimate
      description: "One row of the `/mempool/feerates` response.\n\n`target_blocks`\
        \ is the confirmation-target horizon the partner asked about\n(e.g. 1, 3,\
        \ 6, 24). `sat_per_vbyte` is the historical fee-rate percentile\nderived from\
        \ the last N confirmed blocks that maps to that horizon. This is\nnot a live\
        \ mempool snapshot \u2014 the value answers the question \"what fee rates\n\
        confirmed recently for this confirmation horizon?\" rather than predicting\
        \ a\nspecific future block. Partners that need live mempool composition should\n\
        use `GET /mempool` and `GET /mempool/{txid}`."
    FeerateResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/FeerateEstimate'
          type: array
          title: Data
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: FeerateResponse
      description: Envelope for `/mempool/feerates`.
    IncludeOption:
      properties:
        name:
          type: string
          title: Name
        credit_cost:
          type: integer
          minimum: 0.0
          title: Credit Cost
        test_key_access:
          type: string
          enum:
          - point
          - scan_windowed
          title: Test Key Access
          default: point
      additionalProperties: false
      type: object
      required:
      - name
      - credit_cost
      title: IncludeOption
    MarketCandle:
      properties:
        date:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
          title: Date
        open:
          type: number
          title: Open
        high:
          type: number
          title: High
        low:
          type: number
          title: Low
        close:
          type: number
          title: Close
        volume:
          anyOf:
          - type: number
          - type: 'null'
          title: Volume
      additionalProperties: false
      type: object
      required:
      - date
      - open
      - high
      - low
      - close
      title: MarketCandle
    MarketCurrentSpot:
      properties:
        quote:
          type: string
          title: Quote
        price:
          type: number
          title: Price
        as_of:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: As Of
      additionalProperties: false
      type: object
      required:
      - quote
      - price
      - as_of
      title: MarketCurrentSpot
    MarketData:
      properties:
        candles:
          items:
            $ref: '#/components/schemas/MarketCandle'
          type: array
          title: Candles
        current_spot:
          anyOf:
          - $ref: '#/components/schemas/MarketCurrentSpot'
          - type: 'null'
      additionalProperties: false
      type: object
      required:
      - candles
      title: MarketData
    MarketResponse:
      properties:
        data:
          $ref: '#/components/schemas/MarketData'
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: MarketResponse
    MempoolDefaultData:
      properties:
        size:
          type: integer
          title: Size
          description: Count of transactions in the mempool.
        bytes:
          type: integer
          title: Bytes
          description: Total mempool size in bytes.
        fee_histogram:
          additionalProperties:
            type: integer
          type: object
          title: Fee Histogram
          description: "Mapping of fee-rate bucket (sat/vB upper bound) \u2192 count."
      additionalProperties: false
      type: object
      required:
      - size
      - bytes
      - fee_histogram
      title: MempoolDefaultData
    MempoolResponse:
      properties:
        data:
          $ref: '#/components/schemas/MempoolDefaultData'
        included:
          anyOf:
          - type: object
          - type: 'null'
          title: Included
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: MempoolResponse
    MempoolTxData:
      properties:
        txid:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Txid
        vsize:
          type: integer
          title: Vsize
        fee_atomic_units:
          type: integer
          title: Fee Atomic Units
        fee_rate_sat_vb:
          type: number
          title: Fee Rate Sat Vb
        depends:
          items:
            type: string
          type: array
          title: Depends
        received_at:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: Received At
        current_priority:
          anyOf:
          - type: number
          - type: 'null'
          title: Current Priority
      additionalProperties: false
      type: object
      required:
      - txid
      - vsize
      - fee_atomic_units
      - fee_rate_sat_vb
      title: MempoolTxData
      description: Default response data for /mempool/{txid}.
    MempoolTxResponse:
      properties:
        data:
          $ref: '#/components/schemas/MempoolTxData'
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: MempoolTxResponse
    MwebBlockDefault:
      properties:
        block_height:
          type: integer
          title: Block Height
        hogex_txid:
          anyOf:
          - type: string
            pattern: ^[0-9a-f]{64}$
          - type: 'null'
          title: Hogex Txid
        pegin_atomic_units:
          type: integer
          title: Pegin Atomic Units
        pegout_atomic_units:
          type: integer
          title: Pegout Atomic Units
        net_flow_atomic_units:
          type: integer
          title: Net Flow Atomic Units
          description: 'Net MWEB pool flow for this block. Per LIP-0003: net_flow_atomic_units
            equals pegin_atomic_units minus pegout_atomic_units minus total_fee_value_atomic_units.
            The three component fields are co-located on this response so partners
            can recompute.'
        mweb_output_count:
          type: integer
          title: Mweb Output Count
          description: Count of MWEB outputs in this block. Does not include transparent
            outputs.
        total_fee_value_atomic_units:
          type: integer
          title: Total Fee Value Atomic Units
      additionalProperties: false
      type: object
      required:
      - block_height
      - pegin_atomic_units
      - pegout_atomic_units
      - net_flow_atomic_units
      - mweb_output_count
      - total_fee_value_atomic_units
      title: MwebBlockDefault
    MwebBlockResponse:
      properties:
        data:
          $ref: '#/components/schemas/MwebBlockDefault'
        included:
          anyOf:
          - type: object
          - type: 'null'
          title: Included
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: MwebBlockResponse
    MwebChartPoint:
      properties:
        date:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
          title: Date
          description: Bucket date (YYYY-MM-DD), UTC.
        pegin_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Pegin Atomic Units
          description: "Total MWEB peg-in value (transparent \u2192 MWEB) in the bucket,\
            \ in atomic units."
        pegout_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Pegout Atomic Units
          description: "Total MWEB peg-out value (MWEB \u2192 transparent) in the\
            \ bucket, in atomic units."
        net_flow_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Net Flow Atomic Units
          description: Net MWEB pool flow for the bucket, in atomic units. Per LIP-0003
            this is peg-in minus peg-out minus MWEB fees, summed across the bucket.
            Positive values indicate net inflow into the MWEB pool over the bucket;
            negative values indicate net outflow.
        cumulative_balance_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Cumulative Balance Atomic Units
          description: Running MWEB pool balance as of the end of the bucket. For
            grain=day this is the daily closing balance; for week/month this is the
            closing balance on the last day in the bucket. Null when no data covers
            the bucket.
        mweb_tx_count:
          anyOf:
          - type: integer
          - type: 'null'
          title: Mweb Tx Count
          description: Count of MWEB transactions in the bucket; not a kernel count.
      additionalProperties: false
      type: object
      required:
      - date
      title: MwebChartPoint
      description: One row of /charts/mweb output
    MwebChartResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/MwebChartPoint'
          type: array
          title: Data
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: MwebChartResponse
    NetworkChartPoint:
      properties:
        date:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
          title: Date
          description: Bucket date (YYYY-MM-DD), UTC.
        tx_count:
          anyOf:
          - type: integer
          - type: 'null'
          title: Tx Count
          description: Count of confirmed transactions in the bucket.
        active_addresses:
          anyOf:
          - type: integer
          - type: 'null'
          title: Active Addresses
          description: Distinct addresses that sent or received in the day. **Only
            valid at grain=day** in v1; requesting this metric at week/month grain
            returns 400 `bad_request` because daily distinct counts cannot be summed
            into a weekly/monthly distinct count without a true rollup source. The
            weekly/monthly distinct rollup is a planned follow-on.
        new_addresses:
          anyOf:
          - type: integer
          - type: 'null'
          title: New Addresses
          description: Addresses first seen in the bucket.
        total_output_value_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Total Output Value Atomic Units
          description: Sum of all transparent output values in the bucket, in atomic
            units (for Litecoin, 1e-8 LTC).
        avg_hashrate_hashes_per_second:
          anyOf:
          - type: number
          - type: 'null'
          title: Avg Hashrate Hashes Per Second
          description: Mean network hashrate over the bucket, in hashes per second
            (H/s). The value is converted at the API boundary from the underlying
            petahashes-per-second column so consumers see the canonical chain-agnostic
            unit.
        avg_fee_atomic_units:
          anyOf:
          - type: number
          - type: 'null'
          title: Avg Fee Atomic Units
          description: 'Mean transaction fee in the bucket, in atomic units. Float
            on the wire: day-grain returns the underlying daily mean; week/month/year-grain
            returns the average of daily means and can carry a fractional value.'
        avg_block_size_bytes:
          anyOf:
          - type: number
          - type: 'null'
          title: Avg Block Size Bytes
          description: "Mean block stripped-size in the bucket, in bytes. Float on\
            \ the wire for the same reason as `avg_fee_atomic_units` \u2014 week/month\
            \ averages of daily means can be fractional."
      additionalProperties: false
      type: object
      required:
      - date
      title: NetworkChartPoint
      description: '`response_model_exclude_none=True`

        at the route layer omits unrequested metrics from the wire.'
    NetworkChartResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/NetworkChartPoint'
          type: array
          title: Data
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: NetworkChartResponse
    OutputDefault:
      properties:
        txid:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Txid
        vout:
          type: integer
          title: Vout
        value_atomic_units:
          type: integer
          title: Value Atomic Units
        address:
          anyOf:
          - type: string
          - type: 'null'
          title: Address
        address_type:
          anyOf:
          - type: string
            enum:
            - pubkeyhash
            - scripthash
            - witness_v0_keyhash
            - witness_v0_scripthash
            - witness_v1_taproot
            - pubkey
            - multisig
            - nulldata
            - nonstandard
            - unknown
            - mweb
          - type: 'null'
          title: Address Type
        is_mweb:
          type: boolean
          title: Is Mweb
        block_height:
          type: integer
          title: Block Height
        spent:
          type: boolean
          title: Spent
        script_pubkey_hex:
          anyOf:
          - type: string
          - type: 'null'
          title: Script Pubkey Hex
      additionalProperties: false
      type: object
      required:
      - txid
      - vout
      - value_atomic_units
      - is_mweb
      - block_height
      - spent
      title: OutputDefault
    OutputResponse:
      properties:
        data:
          $ref: '#/components/schemas/OutputDefault'
        included:
          anyOf:
          - type: object
          - type: 'null'
          title: Included
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: OutputResponse
    PaginationCursor:
      properties:
        cursor:
          anyOf:
          - type: string
          - type: 'null'
          title: Cursor
          description: Opaque base64 cursor for the next page.
        has_more:
          type: boolean
          title: Has More
          description: True if more results exist beyond the current page.
        effective_limit:
          type: integer
          title: Effective Limit
          description: Actual page size applied for this response (may be clamped
            below requested_limit).
        requested_limit:
          anyOf:
          - type: integer
          - type: 'null'
          title: Requested Limit
          description: Partner-supplied limit, surfaced ONLY when it differs from
            effective_limit. Test-tier requests with limit above the test-key cap
            see this populated.
      additionalProperties: false
      type: object
      required:
      - has_more
      - effective_limit
      title: PaginationCursor
      description: "Pagination block emitted on paginated endpoints.\n\n`effective_limit`\
        \ and `requested_limit` make page-size clamping visible to\npartners \u2014\
        \ when a test key requests `limit=100` and we serve 20, the\nresponse shows\
        \ both so the partner is never silently throttled."
    RateLimitErrorBody:
      properties:
        code:
          allOf:
          - $ref: '#/components/schemas/ErrorCode'
          description: Stable machine-readable error code. One of `rate_limit_exceeded`
            (per-second or per-minute burst), `quota_exceeded_daily` (sandbox per-day
            budget), or `quota_exceeded` (per-subscription-period).
        message:
          type: string
          title: Message
          description: Human-readable explanation, never leaks internals.
        window:
          type: string
          enum:
          - second
          - minute
          - day
          - month
          title: Window
          description: Which rate-limit / credit-budget window tripped. `second` and
            `minute` are short-term burst windows; `day` is the sandbox smoothing
            cap; `month` is the subscription-period quota.
      additionalProperties: true
      type: object
      required:
      - code
      - message
      - window
      title: RateLimitErrorBody
      description: 'Inner `error` block for the 429 response.


        Extends the generic error body with `window`, naming which rate-limit /

        credit-budget window tripped. Partners switch on this to decide whether

        to back off briefly (`second`/`minute`) or wait for the day/period reset.'
    RateLimitErrorResponse:
      properties:
        error:
          $ref: '#/components/schemas/RateLimitErrorBody'
        meta:
          type: object
          title: Meta
          description: Standard response meta block (see ResponseMeta).
      additionalProperties: false
      type: object
      required:
      - error
      - meta
      title: RateLimitErrorResponse
      description: Full 429 response envelope. `meta` retained for request_id correlation.
    ResponseMeta-Input:
      properties:
        request_id:
          type: string
          title: Request Id
          description: Echo of x-request-id header; partner-side correlation token.
        served_at:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: Served At
          description: RFC 3339 UTC, second precision, Z suffix.
        served_from:
          type: string
          enum:
          - indexed_store
          - node
          - indexed_store+node
          - control_plane
          title: Served From
          default: indexed_store
        dataset_version:
          type: string
          title: Dataset Version
          description: Dataset schema version, e.g. 'v2.6'.
        methodology_version:
          anyOf:
          - type: string
          - type: 'null'
          title: Methodology Version
          description: Methodology registry version, present on analytics endpoints.
        credit_cost:
          type: integer
          minimum: 0.0
          title: Credit Cost
          description: Credits charged for THIS request.
        validation:
          allOf:
          - $ref: '#/components/schemas/ValidationMeta-Input'
          description: Validation certificate for this response. `scope` declares
            which domain the data belongs to; `status` declares trust. Chain endpoints
            carry a real `validated_height`; mempool/account/analytics endpoints report
            `not_applicable` in v1.
        included_expansions:
          anyOf:
          - items:
              type: string
            type: array
          - type: 'null'
          title: Included Expansions
          description: Actually-included ?include= expansion names (parent auto-add
            applied). The expansion payloads themselves are under top-level `included`.
      additionalProperties: false
      type: object
      required:
      - request_id
      - served_at
      - dataset_version
      - credit_cost
      - validation
      title: ResponseMeta
      description: '`meta` block emitted on every response (success and error).'
    ResponseMeta-Output:
      properties:
        request_id:
          type: string
          title: Request Id
          description: Echo of x-request-id header; partner-side correlation token.
        served_at:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: Served At
          description: RFC 3339 UTC, second precision, Z suffix.
        served_from:
          type: string
          enum:
          - indexed_store
          - node
          - indexed_store+node
          - control_plane
          title: Served From
          default: indexed_store
        dataset_version:
          type: string
          title: Dataset Version
          description: Dataset schema version, e.g. 'v2.6'.
        methodology_version:
          anyOf:
          - type: string
          - type: 'null'
          title: Methodology Version
          description: Methodology registry version, present on analytics endpoints.
        credit_cost:
          type: integer
          minimum: 0.0
          title: Credit Cost
          description: Credits charged for THIS request.
        validation:
          allOf:
          - $ref: '#/components/schemas/ValidationMeta-Output'
          description: Validation certificate for this response. `scope` declares
            which domain the data belongs to; `status` declares trust. Chain endpoints
            carry a real `validated_height`; mempool/account/analytics endpoints report
            `not_applicable` in v1.
        included_expansions:
          anyOf:
          - items:
              type: string
            type: array
          - type: 'null'
          title: Included Expansions
          description: Actually-included ?include= expansion names (parent auto-add
            applied). The expansion payloads themselves are under top-level `included`.
      additionalProperties: false
      type: object
      required:
      - request_id
      - served_at
      - dataset_version
      - credit_cost
      - validation
      title: ResponseMeta
      description: '`meta` block emitted on every response (success and error).'
    SearchData:
      properties:
        type:
          type: string
          enum:
          - block
          - transaction
          - address
          - not_found
          title: Type
        match:
          anyOf:
          - type: string
          - type: 'null'
          title: Match
        summary:
          anyOf:
          - $ref: '#/components/schemas/BlockSearchSummary'
          - $ref: '#/components/schemas/TransactionSearchSummary'
          - $ref: '#/components/schemas/AddressSearchSummary'
          - type: 'null'
          title: Summary
      additionalProperties: false
      type: object
      required:
      - type
      title: SearchData
    SearchResponse:
      properties:
        data:
          $ref: '#/components/schemas/SearchData'
        included:
          anyOf:
          - type: object
          - type: 'null'
          title: Included
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: SearchResponse
    SupplyData:
      properties:
        issued_supply_atomic_units:
          type: integer
          title: Issued Supply Atomic Units
        circulating_supply_atomic_units:
          type: integer
          title: Circulating Supply Atomic Units
        current_subsidy_atomic_units:
          type: integer
          title: Current Subsidy Atomic Units
        next_halving_height:
          type: integer
          title: Next Halving Height
        next_halving_at_estimate:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: Next Halving At Estimate
        at_height:
          type: integer
          title: At Height
      additionalProperties: false
      type: object
      required:
      - issued_supply_atomic_units
      - circulating_supply_atomic_units
      - current_subsidy_atomic_units
      - next_halving_height
      - at_height
      title: SupplyData
    SupplyResponse:
      properties:
        data:
          $ref: '#/components/schemas/SupplyData'
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: SupplyResponse
    TransactionDefault:
      properties:
        txid:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Txid
        block_height:
          anyOf:
          - type: integer
          - type: 'null'
          title: Block Height
        block_hash:
          anyOf:
          - type: string
            pattern: ^[0-9a-f]{64}$
          - type: 'null'
          title: Block Hash
        block_time:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: Block Time
        fee_atomic_units:
          anyOf:
          - type: integer
          - type: 'null'
          title: Fee Atomic Units
        vsize:
          type: integer
          title: Vsize
        weight:
          anyOf:
          - type: integer
          - type: 'null'
          title: Weight
        version:
          type: integer
          title: Version
        locktime:
          type: integer
          title: Locktime
          description: Transaction nLockTime. Values less than 500,000,000 represent
            block height; values 500,000,000 or above represent Unix epoch seconds
            (BIP 113).
        input_count:
          type: integer
          title: Input Count
        output_count:
          type: integer
          title: Output Count
        total_output_value_atomic_units:
          type: integer
          title: Total Output Value Atomic Units
        is_coinbase:
          type: boolean
          title: Is Coinbase
        is_hogex:
          type: boolean
          title: Is Hogex
        has_mweb:
          type: boolean
          title: Has Mweb
      additionalProperties: false
      type: object
      required:
      - txid
      - vsize
      - version
      - locktime
      - input_count
      - output_count
      - total_output_value_atomic_units
      - is_coinbase
      - is_hogex
      - has_mweb
      title: TransactionDefault
      description: Default response data for /chain/transaction/{txid}.
    TransactionResponse:
      properties:
        data:
          $ref: '#/components/schemas/TransactionDefault'
        included:
          anyOf:
          - type: object
          - type: 'null'
          title: Included
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: TransactionResponse
    TransactionSearchSummary:
      properties:
        txid:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Txid
        block_height:
          anyOf:
          - type: integer
          - type: 'null'
          title: Block Height
        block_time:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: Block Time
      additionalProperties: false
      type: object
      required:
      - txid
      title: TransactionSearchSummary
      description: '`data.summary` when `data.type == "transaction"`.'
    ValidationMeta-Input:
      properties:
        scope:
          type: string
          enum:
          - chain
          - mempool
          - analytics
          - account
          title: Scope
        status:
          type: string
          enum:
          - validated
          - lagging
          - stale
          - unvalidated
          - not_applicable
          - unknown
          title: Status
        validated_height:
          anyOf:
          - type: integer
          - type: 'null'
          title: Validated Height
        validated_at:
          anyOf:
          - type: string
            pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          - type: 'null'
          title: Validated At
        lag_blocks:
          anyOf:
          - type: integer
          - type: 'null'
          title: Lag Blocks
      additionalProperties: false
      type: object
      required:
      - scope
      - status
      title: ValidationMeta
      description: "Wire-facing validation block \u2014 `meta.validation` on every\
        \ response.\n\nPinned `@model_serializer(mode=\"plain\")` returning a manually-built\
        \ dict\n(V.6.c collapsed ladder). This is **recursion-proof by construction**:\n\
        `mode=\"plain\"` short-circuits the parent walker entirely, so\n`response_model_exclude_none=True`\
        \ at the route layer cannot strip the\nexplicit nulls that V.7 self-certification\
        \ depends on. Do NOT call\n`self.model_dump(...)` from inside the serializer\
        \ \u2014 that would re-enter\nserialization and re-create the recursion we're\
        \ defending against."
    ValidationMeta-Output:
      type: object
      title: ValidationMeta
      description: "Wire-facing validation block \u2014 `meta.validation` on every\
        \ response.\n\nPinned `@model_serializer(mode=\"plain\")` returning a manually-built\
        \ dict\n(V.6.c collapsed ladder). This is **recursion-proof by construction**:\n\
        `mode=\"plain\"` short-circuits the parent walker entirely, so\n`response_model_exclude_none=True`\
        \ at the route layer cannot strip the\nexplicit nulls that V.7 self-certification\
        \ depends on. Do NOT call\n`self.model_dump(...)` from inside the serializer\
        \ \u2014 that would re-enter\nserialization and re-create the recursion we're\
        \ defending against."
    ValidationStatus:
      properties:
        validated_height:
          type: integer
          minimum: 0.0
          title: Validated Height
          description: Highest block height covered by the active validation checkpoint.
        validated_hash:
          type: string
          pattern: ^[0-9a-f]{64}$
          title: Validated Hash
          description: Block hash at `validated_height` for the active checkpoint.
        is_valid:
          type: boolean
          title: Is Valid
          description: True for the active checkpoint by construction; included for
            explicit partner-side assertion.
        checkpoint_created_at:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
          title: Checkpoint Created At
          description: Timestamp the active checkpoint was minted by the indexer.
        source_validation_run_id:
          anyOf:
          - type: integer
          - type: 'null'
          title: Source Validation Run Id
          description: Audit-trail link to the validation_runs row that produced this
            checkpoint. Null if the row predates run-id propagation.
      additionalProperties: false
      type: object
      required:
      - validated_height
      - validated_hash
      - is_valid
      - checkpoint_created_at
      title: ValidationStatus
      description: "Current canonical validation status \u2014 the active checkpoint\
        \ as\nminted by the indexer's per-block validation pass."
    ValidationStatusResponse:
      properties:
        data:
          $ref: '#/components/schemas/ValidationStatus'
        meta:
          $ref: '#/components/schemas/ResponseMeta-Output'
      additionalProperties: false
      type: object
      required:
      - data
      - meta
      title: ValidationStatusResponse
    ValidationSummary:
      properties:
        status:
          type: string
          enum:
          - validated
          - lagging
          - stale
          - unvalidated
          - not_applicable
          - unknown
          title: Status
        validated_height:
          anyOf:
          - type: integer
          - type: 'null'
          title: Validated Height
        lag_blocks:
          anyOf:
          - type: integer
          - type: 'null'
          title: Lag Blocks
      additionalProperties: false
      type: object
      required:
      - status
      title: ValidationSummary
      description: "Display mirror under `data.validation_summary` on `/chain/home`.\n\
        \nStrict subset of `meta.validation` (omits `scope` \u2014 `/chain/home` is\n\
        always `scope:\"chain\"`). **Single-sourced from the same\n`ValidationSnapshot`\
        \ that populates `meta.validation`** (V.4) \u2014 handlers\nMUST NOT compute\
        \ these fields independently."
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
security:
- bearerAuth: []
