{"openapi":"3.1.0","info":{"title":"ForceX Xtract API","summary":"Quality-first Litecoin data — 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`.\n\n**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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/xtract/v1/litecoin/chain/validation":{"get":{"tags":["chain"],"summary":"Chain Validation","description":"Current active validation checkpoint as a single scalar payload.\n\nBy database invariant exactly one row carries `is_valid = TRUE` at any\nmoment; this endpoint surfaces that row. Returns 503\n`data_unavailable` when no active checkpoint exists (cold-start or\nindexer mid-rebaseline).","operationId":"getChainValidation","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationStatusResponse"}}},"headers":{"x-request-id":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"404":{"description":"Entity not found. `error.code` = `not_found`. Returned on direct entity GETs only — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"404":{"description":"Entity not found. `error.code` = `not_found`. Returned on direct entity GETs only — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"404":{"description":"Entity not found. `error.code` = `not_found`. Returned on direct entity GETs only — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/xtract/v1/litecoin/chain/address/{address}/transactions":{"get":{"tags":["chain"],"summary":"Address Transactions","description":"Paginated transaction history for an address.\n\nCursor-stable: the cursor pins the chain height at which the page was\nissued, so a partner walking many pages sees a consistent snapshot even\nas 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"404":{"description":"Entity not found. `error.code` = `not_found`. Returned on direct entity GETs only — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/xtract/v1/litecoin/chain/search":{"get":{"tags":["chain"],"summary":"Search","description":"Resolver: tries block → transaction → 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"404":{"description":"Entity not found. `error.code` = `not_found`. Returned on direct entity GETs only — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"404":{"description":"Entity not found. `error.code` = `not_found`. Returned on direct entity GETs only — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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 — 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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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 — **`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` × 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 — **`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` × 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)` — `start` is inclusive.","title":"Start"},"description":"ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open `[start, end)` — `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)` — `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)` — `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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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)` — `start` is inclusive.","title":"Start"},"description":"ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open `[start, end)` — `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)` — `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)` — `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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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)` — `start` is inclusive.","title":"Start"},"description":"ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open `[start, end)` — `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)` — `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)` — `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 — transparent → MWEB), `pegout_atomic_units` (total peg-out value — MWEB → 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 — transparent → MWEB), `pegout_atomic_units` (total peg-out value — MWEB → 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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)` — `start` is inclusive.","title":"Start"},"description":"ISO date (YYYY-MM-DD) or ISO-Z timestamp. Range is half-open `[start, end)` — `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)` — `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)` — `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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/xtract/v1/litecoin/developer/usage":{"get":{"tags":["developer"],"summary":"Developer Usage","description":"By-endpoint × 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}},"/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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."},"RateLimit-Limit":{"schema":{"type":"string"},"description":"Per-window credit limits, RFC 9239 draft format. Post-auth responses only."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Credits remaining on the most-restrictive window. Post-auth responses only."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the most-restrictive window resets. Post-auth responses only."},"RateLimit-Cost":{"schema":{"type":"integer"},"description":"Credits charged for this request. Post-auth responses only."},"RateLimit-Policy":{"schema":{"type":"string"},"description":"Informational — names the limiting window. Post-auth responses only."},"Retry-After":{"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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}},"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 — 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":{"schema":{"type":"string"},"description":"Echo of the request_id; partner correlation token. Emitted on every response, including all error statuses."}}}}}}},"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[]`.\n\nShape matches `OutputDefault` (the singleton `/chain/output/{txid}:{vout}`\npayload) so partner views that already render a single output can reuse\nthe 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 — 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 — index `i` in the response corresponds to index\n`i` in the request — 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`.\n\n`data[]` preserves request order one-to-one. Each entry is either a\n`BatchOutputItem` (resolved) or a `BatchOutputMissing` (`error:\n\"not_found\"`). Partners can detect a miss with a simple\n`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.\n\nSame shape as `BlockHeader` (default `/chain/block/{height_or_hash}`\npayload) so partners that already render a single-block surface can reuse\ntheir item view for the list surface. `has_mweb` is derived via the same\nLEFT 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=`.\n\n`data` carries up to `pagination.effective_limit` `BlockListItem` rows,\nordered by `height ASC`. `pagination` echoes the page size that was\nactually 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 — (key, day, endpoint) granularity."},"DistributionBucket":{"properties":{"bucket":{"type":"string","title":"Bucket","description":"Human-readable bucket label, e.g. `1 - 5`. Display string only — 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, …) 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 — a single histogram bucket.\n\nFields are partner-facing names. `lower_atomic_units` / `upper_atomic_units`\ndescribe the bucket's half-open value range `[lower, upper)`; the top bucket\ncarries a `null` upper bound (open-ended). `total_value_atomic_units` is the\nsum of the underlying value contained in the bucket (e.g. summed balance\nfor `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 — 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 — 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 — 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 — 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 — the value answers the question \"what fee rates\nconfirmed recently for this confirmation horizon?\" rather than predicting a\nspecific future block. Partners that need live mempool composition should\nuse `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) → 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 → 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 → 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` — week/month averages of daily means can be fractional."}},"additionalProperties":false,"type":"object","required":["date"],"title":"NetworkChartPoint","description":"`response_model_exclude_none=True`\nat 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 — 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.\n\nExtends the generic error body with `window`, naming which rate-limit /\ncredit-budget window tripped. Partners switch on this to decide whether\nto 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 — `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 — 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 — `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 — 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 — 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` — `/chain/home` is\nalways `scope:\"chain\"`). **Single-sourced from the same\n`ValidationSnapshot` that populates `meta.validation`** (V.4) — handlers\nMUST NOT compute these fields independently."}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}}},"security":[{"bearerAuth":[]}]}