{"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.\n\n**Encoding profile.** Responses are JSON as specified by RFC 8259 / ISO/IEC 21778 (UTF-8, no comments, no NaN/Infinity). Integers are emitted as JSON numbers at their exact value with no fractional part; some totals (cumulative atomic-unit totals inside `current` objects) exceed 2^53 and can exceed 2^64, so consumers must parse integers with arbitrary precision rather than as IEEE-754 doubles. Model Context Protocol tool projections render those registered big-integer fields as decimal strings; the REST contract does not. Explicit `null` means *unavailable or not applicable for this request*; an absent optional key means *not requested or not emitted at this grain* (see each route's field descriptions).","termsOfService":"https://forcex.com/terms","contact":{"name":"ForceX Support","url":"https://forcex.com/support"},"license":{"name":"Proprietary"},"version":"1.1.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"}],"description":"Comma-separated expansions: `mempool`, `recent_blocks`, `recent_transactions`, `tip_stats`. `all` expands to every token. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`.","title":"Include"},"description":"Comma-separated expansions: `mempool`, `recent_blocks`, `recent_transactions`, `tip_stats`. `all` expands to every token. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`."},{"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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/tx/{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\n[A13 Wave A S5 — conditional GET]: request flow is authenticate →\nCONTEXT PREPARATION (subscription period + rate-limit context stashed\nONCE, no Lua) → build the ONE coherent snapshot → weak canonical-\ndigest ETag → evaluate If-None-Match PRE-CHARGE → match ⇒ 304 (zero\ncredits, zero refunds, ordinary success count) / miss ⇒ the normal\ncharge (reusing the SAME stashed context) + 200. Both carry ETag +\nCache-Control: private, no-cache + Vary: Authorization.\n\nBy database invariant exactly one row carries `is_valid = TRUE`;\n503 `data_unavailable` when none exists (cold-start or 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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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."}}},"304":{"description":"Not Modified — the If-None-Match value matches the current weak ETag. No body; zero credits charged; ETag + Cache-Control: private, no-cache + Vary: Authorization headers are carried exactly as on 200.","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/history":{"get":{"tags":["chain"],"summary":"Chain Validation History","description":"Checkpoint lineage: by-id lookup or bounded recent list.\n\nZERO-credit trust surface (D-D ruling — free at every tier; auth\nrequired; the shared free-family limiter is the abuse bound). There\nis NO as-of-time mode: activation intervals are not retained\n(reactivation clears prior invalidation state), so \"active at time T\"\ncannot be truthfully reconstructed — a checkpoint_id change is an\ninspection anchor, and this route is the inspection.","operationId":"getChainValidationHistory","parameters":[{"name":"checkpoint_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Direct lookup of ONE checkpoint by id (the value meta.validation.checkpoint_id carries). When present, `limit` must be omitted.","title":"Checkpoint Id"},"description":"Direct lookup of ONE checkpoint by id (the value meta.validation.checkpoint_id carries). When present, `limit` must be omitted."},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Bounded recent list, newest-first (default 20, max 100). Mutually exclusive with checkpoint_id.","title":"Limit"},"description":"Bounded recent list, newest-first (default 20, max 100). Mutually exclusive with checkpoint_id."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckpointHistoryResponse"}}},"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}],"description":"Comma-separated expansions: `classification`, `mweb`, `stats`, `transactions`, `transactions.inputs`, `transactions.outputs`. `all` expands to every token. `classification` requires `transactions` (auto-added); `transactions.inputs` requires `transactions` (auto-added); `transactions.outputs` requires `transactions` (auto-added). `classification` attaches `Classification` records (see components) — the analytics-registry rows the handler returns, one per active methodology, an empty array when none exist. `transactions` is capped (see `transactions_limit` / `transactions_truncated` in `included`) and is withheld with 503 `data_unavailable` when the block's transaction list cannot be certified against its header. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`.","title":"Include"},"description":"Comma-separated expansions: `classification`, `mweb`, `stats`, `transactions`, `transactions.inputs`, `transactions.outputs`. `all` expands to every token. `classification` requires `transactions` (auto-added); `transactions.inputs` requires `transactions` (auto-added); `transactions.outputs` requires `transactions` (auto-added). `classification` attaches `Classification` records (see components) — the analytics-registry rows the handler returns, one per active methodology, an empty array when none exist. `transactions` is capped (see `transactions_limit` / `transactions_truncated` in `included`) and is withheld with 503 `data_unavailable` when the block's transaction list cannot be certified against its header. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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` must not exceed the snapshot's\n`validated_height` — a request beyond it returns **400 `bad_request`**\nnaming the current validated height (seams-sweep doc fix 2026-08-18:\nthe earlier text claimed a silent clamp; the actual behavior is the\nexplicit 400, which is the honest contract — partners are TOLD the\nvalidated bound rather than silently served less than they asked for).\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; Free-tier keys are further clamped to the Free 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; Free-tier keys are further clamped to the Free 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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}],"description":"Comma-separated expansions: `classification`, `inputs`, `outputs`. `all` expands to every token. `classification` attaches `Classification` records (see components) — the analytics-registry rows the handler returns, one per active methodology, an empty array when none exist. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`.","title":"Include"},"description":"Comma-separated expansions: `classification`, `inputs`, `outputs`. `all` expands to every token. `classification` attaches `Classification` records (see components) — the analytics-registry rows the handler returns, one per active methodology, an empty array when none exist. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}],"description":"Comma-separated expansions: `recent_transactions`, `stats`. `all` expands to every token. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`.","title":"Include"},"description":"Comma-separated expansions: `recent_transactions`, `stats`. `all` expands to every token. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}],"description":"Comma-separated expansions: `classification`, `spend`. `classification` attaches `Classification` records (see components) — the analytics-registry rows the handler returns, one per active methodology, an empty array when none exist. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`.","title":"Include"},"description":"Comma-separated expansions: `classification`, `spend`. `classification` attaches `Classification` records (see components) — the analytics-registry rows the handler returns, one per active methodology, an empty array when none exist. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}],"description":"Comma-separated expansions; this route accepts none in v1.","title":"Include"},"description":"Comma-separated expansions; this route accepts none in v1."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}],"description":"Comma-separated expansions: `outputs`, `peg_links`. `all` expands to every token. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`.","title":"Include"},"description":"Comma-separated expansions: `outputs`, `peg_links`. `all` expands to every token. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}],"description":"Comma-separated expansions: `next_block`, `transactions`. `all` expands to every token. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`.","title":"Include"},"description":"Comma-separated expansions: `next_block`, `transactions`. `all` expands to every token. unknown tokens return 400 `invalid_include`; the expansions actually served are listed in `meta.included_expansions`."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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/tx/{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/tx/{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/tx/{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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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/mempool/tx/{txid}":{"get":{"tags":["mempool"],"summary":"Mempool Tx","operationId":"getMempoolTransaction","parameters":[{"name":"txid","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{64}$","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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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/tx/{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/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 (default when `?metrics=` is omitted: `tx_count`). **Valid values by family** — activity: `tx_count`, `tx_count_excluding_coinbase`, `block_count`, `avg_transactions_per_block`; addresses: `active_addresses`, `sending_addresses`, `receiving_addresses` (all three **`grain=day` only**; see note below), `new_addresses`; value: `total_output_value_atomic_units`, `economic_output_value_atomic_units` (mechanics-excluded), `avg_transaction_value_atomic_units`, `median_transaction_value_atomic_units` (**day only**), `max_transaction_value_atomic_units`; fees: `total_fee_atomic_units`, `avg_fee_atomic_units`, `median_fee_atomic_units` (**day only**), `avg_fee_rate_atomic_units_per_byte`, `min_fee_rate_atomic_units_per_byte`, `max_fee_rate_atomic_units_per_byte`; mining & chain: `subsidy_atomic_units` (node-computed protocol subsidy), `coinbase_output_value_atomic_units` (actually claimed; can be less than subsidy plus fees), `avg_difficulty`, `avg_hashrate_hashes_per_second` (H/s), `avg_block_size_bytes`, `avg_block_time_seconds`, `max_block_time_seconds`. Unknown names return 400 `bad_request`. Per-metric units, populations and definitions are the field descriptions of `NetworkChartPoint` in the OpenAPI document (`/xtract/openapi.json`). **Day-only metrics × non-day grain return 400 `bad_request`** — daily distinct counts cannot be honestly summed and daily medians cannot be recomposed into bucket medians; refusing is the honest move. All other metrics aggregate correctly across `day`/`week`/`month` (sums for totals; exact recomposition where the identity is provable; daily-mean averages otherwise, so documented in each field description).","title":"Metrics"},"description":"Comma-separated metric names to include in the response (default when `?metrics=` is omitted: `tx_count`). **Valid values by family** — activity: `tx_count`, `tx_count_excluding_coinbase`, `block_count`, `avg_transactions_per_block`; addresses: `active_addresses`, `sending_addresses`, `receiving_addresses` (all three **`grain=day` only**; see note below), `new_addresses`; value: `total_output_value_atomic_units`, `economic_output_value_atomic_units` (mechanics-excluded), `avg_transaction_value_atomic_units`, `median_transaction_value_atomic_units` (**day only**), `max_transaction_value_atomic_units`; fees: `total_fee_atomic_units`, `avg_fee_atomic_units`, `median_fee_atomic_units` (**day only**), `avg_fee_rate_atomic_units_per_byte`, `min_fee_rate_atomic_units_per_byte`, `max_fee_rate_atomic_units_per_byte`; mining & chain: `subsidy_atomic_units` (node-computed protocol subsidy), `coinbase_output_value_atomic_units` (actually claimed; can be less than subsidy plus fees), `avg_difficulty`, `avg_hashrate_hashes_per_second` (H/s), `avg_block_size_bytes`, `avg_block_time_seconds`, `max_block_time_seconds`. Unknown names return 400 `bad_request`. Per-metric units, populations and definitions are the field descriptions of `NetworkChartPoint` in the OpenAPI document (`/xtract/openapi.json`). **Day-only metrics × non-day grain return 400 `bad_request`** — daily distinct counts cannot be honestly summed and daily medians cannot be recomposed into bucket medians; refusing is the honest move. All other metrics aggregate correctly across `day`/`week`/`month` (sums for totals; exact recomposition where the identity is provable; daily-mean averages otherwise, so documented in each field description)."},{"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":"include_current","in":"query","required":false,"schema":{"type":"boolean","description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated.","default":false,"title":"Include Current"},"description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated."},{"name":"current_metrics","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated CURRENT-window metric selection from the governed current registry (superset of ?metrics=). Only meaningful with include_current=true; omitted = the full registry. Unknown names return 400 with the valid list. No per-metric charge.","title":"Current Metrics"},"description":"Comma-separated CURRENT-window metric selection from the governed current registry (superset of ?metrics=). Only meaningful with include_current=true; omitted = the full registry. Unknown names return 400 with the valid list. No per-metric charge."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}},{"name":"include_current","in":"query","required":false,"schema":{"type":"boolean","description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated.","default":false,"title":"Include Current"},"description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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)$","description":"Snapshot window. `year` is the supported and default value (a balance distribution is a state snapshot); legacy 1d/7d/30d return 503 data_unavailable.","default":"year","title":"Window"},"description":"Snapshot window. `year` is the supported and default value (a balance distribution is a state snapshot); legacy 1d/7d/30d return 503 data_unavailable."},{"name":"include_current","in":"query","required":false,"schema":{"type":"boolean","description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated.","default":false,"title":"Include Current"},"description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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-age-distribution":{"get":{"tags":["charts"],"summary":"Charts Supply Age Distribution","description":"Supply Age Distribution — the transparent UTXO set bucketed into 11\ncoin-age bands per period-end snapshot (HODL waves). It mirrors the Xamine reader's DATA semantics (11 bands,\ncollapse to the latest derivation run, displaced rows excluded,\nperiod-end for week/month) — NOT its service architecture. Readiness is\nCH-native + fail-closed (see `supply_age_latest_date`). Distinct from\n`/charts/supply` (a point-in-time supply scalar).","operationId":"getChartsSupplyAgeDistribution","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":"include_current","in":"query","required":false,"schema":{"type":"boolean","description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated.","default":false,"title":"Include Current"},"description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplyAgeDistributionResponse"}}},"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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 the field descriptions of `MwebChartPoint` in the OpenAPI document (`/xtract/openapi.json`).","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 the field descriptions of `MwebChartPoint` in the OpenAPI document (`/xtract/openapi.json`)."},{"name":"include_current","in":"query","required":false,"schema":{"type":"boolean","description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated.","default":false,"title":"Include Current"},"description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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","description":"Litecoin supply at the tip, or at an optional historical ``at`` reference.\n\n``at`` accepts a bare block height (exact lookup, e.g. ``at=3134692``) or an\nISO-8601 date/timestamp (the last block at or before that time). A future\ntimestamp resolves to the current tip. Invalid ``at`` → 400 bad_request; a\nheight beyond the tip, or a time before genesis → 404 not_found.\n\n``issued_supply_atomic_units`` — deterministic scheduled/protocol issuance from\nthe block-subsidy halving schedule (excludes fees). The same \"Scheduled\" figure\nfx-api / Xplorer report and the node's coinbase schedule mints.\n\n``circulating_supply_atomic_units`` — node-matching circulating supply: the\nactive validation checkpoint's ``node_equivalent_utxo_total`` (= the Litecoin\nnode's ``gettxoutsetinfo.total_amount`` × 100_000_000, validated via LVR-014),\nthe same \"Circulating\" source fx-api / Xplorer use. Excludes the genesis\ncoinbase (50 LTC, unspendable) and cumulative nulldata (OP_RETURN) burns.\n**Latest-only:** reported only when ``at`` is omitted; historical responses\ncarry ``null`` rather than pairing historical issued with the current\ncheckpoint value. Supply-age and MWEB charts are validation cross-checks, NOT\nthe circulating source. **When no active checkpoint carries the node figure,\n``circulating_supply_atomic_units`` is ``null`` — never a schedule-derived\nsubstitute — while ``issued_supply_atomic_units`` is always present.**","operationId":"getChartsSupply","parameters":[{"name":"at","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional historical reference: a bare block height (exact, e.g. `3134692`) or an ISO-8601 date/timestamp (resolves to the last block at or before that time). Omit for the latest snapshot.","title":"At"},"description":"Optional historical reference: a bare block height (exact, e.g. `3134692`) or an ISO-8601 date/timestamp (resolves to the last block at or before that time). Omit for the latest snapshot."},{"name":"include_current","in":"query","required":false,"schema":{"type":"boolean","description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated.","default":false,"title":"Include Current"},"description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}},{"name":"include_current","in":"query","required":false,"schema":{"type":"boolean","description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated.","default":false,"title":"Include Current"},"description":"Attach the additive `current` member: the in-progress current window and/or state snapshots with explicit as-of provenance (height, hash, time, stability). Defaults to false — the pre-existing response is byte-identical when omitted. Unsupported current calculations return an explicit `status=unavailable` object with a governed `reason_code`; nothing is fabricated."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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","description":"Key identity + LIVE quota counters for the calling key's scope.\n\nScope (accounting semantics, 2026-07-03): `current_period_credits_used`\nreads the LIVE Redis quota counter for THIS key's scope — environment-\nscoped (live and test never share a counter) and anchored to the current\nsubscription period. It is the enforcement-side number, updated\nsynchronously at charge time. The user-wide reporting rollup (all keys,\nboth environments, async Postgres) is `/developer/usage`.","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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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).\n\nScope (accounting semantics, 2026-07-03): this is the ASYNCHRONOUS\nPostgres daily rollup, USER-WIDE — rows span all the caller's API keys\nand both environments unless `environment` is given; each row carries\nits `environment` + `key_prefix`. The LIVE quota counter for the\ncurrent key's scope is `/developer/me` (`current_period_credits_used`).\nCredits land here durably via the charge-stream replay (within ~1s of\nthe charge in steady state).","operationId":"getDeveloperUsage","parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"default":12,"title":"Months"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"enum":["live","test"],"type":"string"},{"type":"null"}],"description":"Restrict rows to keys of one environment (live | test). Default: rows span ALL your API keys and BOTH environments.","title":"Environment"},"description":"Restrict rows to keys of one environment (live | test). Default: rows span ALL your API keys and BOTH environments."}],"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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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` (Free-tier keys cannot request `?include=all`), `include_set_requires_paid_tier` (the requested include set exceeds the per-request cost cap for Free-tier keys), `historical_scan_requires_paid_tier` (legacy test keys cannot scan outside the recent window), or `deep_pagination_requires_paid_tier` (Free-tier 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` (Free-tier 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"}},"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"}],"format":"date-time","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"}],"format":"date-time","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$","format":"date-time","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"},"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"}},"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$","format":"date-time","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$","format":"date-time","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"},"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"}},"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$","format":"date-time","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$","format":"date-time","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"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"ChainHomeResponse"},"ChartCurrent":{"properties":{"window":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Window","description":"In-progress `time_window` object or `null`. `kind`, `status`, `stability` and `reason_code` take values from the published vocabularies `CurrentObjectKind`, `CurrentObjectStatus`, `CurrentStability` and `CurrentReasonCode` (components)."},"snapshots":{"items":{"type":"object"},"type":"array","title":"Snapshots","description":"`state_snapshot` objects (or explicit `unavailable` objects). `kind`, `status`, `stability` and `reason_code` take values from the published vocabularies `CurrentObjectKind`, `CurrentObjectStatus`, `CurrentStability` and `CurrentReasonCode` (components)."},"validated_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Validated Height","description":"Validation checkpoint height from the same coherent read (§5.1)."},"lag_blocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lag Blocks","description":"Indexed tip height minus validated height."}},"additionalProperties":false,"type":"object","title":"ChartCurrent","description":""},"CheckpointHistoryItem":{"properties":{"checkpoint_id":{"type":"integer","title":"Checkpoint Id"},"validated_height":{"type":"integer","title":"Validated Height"},"validated_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Validated Hash"},"created_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","format":"date-time","title":"Created At"},"is_valid":{"type":"boolean","title":"Is Valid"},"invalidated_at":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"},{"type":"null"}],"format":"date-time","title":"Invalidated At"},"invalidated_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invalidated Reason"},"parent_checkpoint_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Checkpoint Id"},"source_validation_run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Validation Run Id"}},"additionalProperties":false,"type":"object","required":["checkpoint_id","validated_height","validated_hash","created_at","is_valid"],"title":"CheckpointHistoryItem","description":"One checkpoint lineage row. A `checkpoint_id` CHANGE in\n`meta.validation` is an INSPECTION ANCHOR — 'something superseded;\ninspect here' — not standalone proof of retreat (design r2 ruling).\nNo as-of-time lookup exists: activation intervals are not retained."},"CheckpointHistoryResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CheckpointHistoryItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"CheckpointHistoryResponse"},"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"}},"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"}],"format":"date-time","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"}],"format":"date-time","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"}},"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"}},"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"},"environment":{"anyOf":[{"type":"string","enum":["live","test"]},{"type":"null"}],"title":"Environment"},"key_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Prefix"}},"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.\n\nRows span ALL the user's API keys and BOTH environments (the rollup is\nuser-wide); `environment` + `key_prefix` identify which key produced\neach row. Null only for rows whose key has since been deleted."},"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"},"current":{"anyOf":[{"$ref":"#/components/schemas/ChartCurrent"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"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}$","format":"date","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}$","format":"date","title":"Date"},"adjusted_volume_atomic_units":{"type":"integer","title":"Adjusted Volume Atomic Units","description":"Adjusted (deduplicated/filtered) bucket volume, in atomic units: the estimated payment value of the bucket's transparent, non-coinbase, non-HogEx transactions after change outputs and internal transfers are removed per the methodology. MWEB-interior transfers are confidential by design and are excluded — they are invisible to this series."},"adjusted_volume_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Adjusted Volume Usd","description":"USD value of adjusted_volume_atomic_units — methodology `usd_v1_daily_close_observed`: each day converts at that day's OBSERVED Kraken USD daily-close candle (synthetic/filled candles excluded), banker's-rounded to 2 decimal places per day; week/month/year buckets are the SUM of the converted days. Null when any day in the bucket lacks an observed candle (chiefly pre-2018 history) — never interpolated, never partial."},"total_volume_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Volume Atomic Units","description":"Raw bucket volume (no adjustment), in atomic units. Gross (undeduplicated) output value of the bucket's transparent, non-coinbase, non-HogEx transactions. MWEB-interior transfers are confidential by design and are excluded."}},"additionalProperties":false,"type":"object","required":["date","adjusted_volume_atomic_units"],"title":"EconomicFlowPoint"},"EconomicFlowResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/EconomicFlowPoint"},"type":"array","title":"Data"},"current":{"anyOf":[{"$ref":"#/components/schemas/ChartCurrent"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"EconomicFlowResponse"},"EndpointLimit":{"properties":{"path":{"type":"string","title":"Path"},"method":{"type":"string","enum":["GET","POST"],"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":{"allOf":[{"$ref":"#/components/schemas/ErrorCode"}],"description":"Stable machine-readable error code, e.g. 'auth_required'. One of the published `ErrorCode` values."},"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","rate_limiter_unavailable","tip_unavailable","source_incoherent","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","methodology_unknown","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"}},"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/tx/{txid}`."},"FeerateResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FeerateEstimate"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"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}$","format":"date","title":"Date","description":"Candle day (YYYY-MM-DD, UTC). One candle per UTC day."},"open":{"type":"number","title":"Open","description":"First traded price of the UTC day, in the quote currency (see `data.current_spot.quote`)."},"high":{"type":"number","title":"High","description":"Highest traded price of the UTC day, in the quote currency."},"low":{"type":"number","title":"Low","description":"Lowest traded price of the UTC day, in the quote currency."},"close":{"type":"number","title":"Close","description":"Last traded price of the UTC day, in the quote currency. A day without observed trades may carry a synthetic previous-close fill; such fills are excluded from `adjusted_volume_usd` conversions."},"volume":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume","description":"Traded base-asset (LTC) volume of the UTC day; `null` when the source reports none."},"provider":{"type":"string","title":"Provider","description":"Identifier of the market-data provider this candle was observed from, exactly as stored with the candle (e.g. the venue id). Provider selection is unchanged: the field names the source, it does not choose it."}},"additionalProperties":false,"type":"object","required":["date","open","high","low","close","provider"],"title":"MarketCandle","description":"One daily OHLCV candle of the LTC market series in the requested quote currency."},"MarketCurrentSpot":{"properties":{"quote":{"type":"string","title":"Quote","description":"Quote currency of `price`."},"price":{"type":"number","title":"Price","description":"Last traded price in the quote currency."},"as_of":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","format":"date-time","title":"As Of","description":"Poll time of the ticker (UTC, second precision, Z)."},"provider":{"type":"string","title":"Provider","description":"Identifier of the market-data provider the ticker was polled from, exactly as stored with the ticker row."}},"additionalProperties":false,"type":"object","required":["quote","price","as_of","provider"],"title":"MarketCurrentSpot","description":"Most recent spot ticker in the requested quote currency; withheld (absent) beyond the staleness ceiling."},"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"},"current":{"anyOf":[{"$ref":"#/components/schemas/ChartCurrent"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"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"}},"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"}],"format":"date-time","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/tx/{txid}."},"MempoolTxResponse":{"properties":{"data":{"$ref":"#/components/schemas/MempoolTxData"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"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"},"mweb_fee_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mweb Fee Atomic Units","description":"Canonical alias of total_fee_value_atomic_units: MWEB-side fees for this block, in atomic units."},"mweb_tx_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mweb Tx Count","description":"MWEB transactions in this block's extension block."},"pegin_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pegin Count","description":"Count of peg-in transactions in this block."},"pegout_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pegout Count","description":"Count of peg-out transactions in this block."},"internal_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Internal Count","description":"Count of MWEB-internal (confidential) transactions in this block."},"mweb_input_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mweb Input Count","description":"MWEB inputs in this block."},"mweb_txo_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mweb Txo Count","description":"MWEB TXOs in this block."},"pool_balance_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pool Balance Atomic Units","description":"MWEB pool balance AFTER this block, in atomic units. Point-in-time state — never summed across blocks."},"block_hash":{"anyOf":[{"type":"string","pattern":"^[0-9a-f]{64}$"},{"type":"null"}],"title":"Block Hash","description":"Canonical block hash at this height (as-of identity)."},"block_time":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"},{"type":"null"}],"format":"date-time","title":"Block Time","description":"Timestamp of the canonical block at this height: UTC, second precision, ISO-8601 with `Z` suffix — the instant is normalized to UTC, never relabelled. `null` when the block identity is unavailable."}},"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"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"MwebBlockResponse"},"MwebChartPoint":{"properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","format":"date","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"},"current":{"anyOf":[{"$ref":"#/components/schemas/ChartCurrent"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"MwebChartResponse"},"NetworkChartPoint":{"properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","format":"date","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, coinbase transactions included (see `tx_count_excluding_coinbase`). Transparent transactions only: MWEB-interior transactions are confidential by design and are not counted. Week/month/year buckets are the sum of the daily counts."},"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":"Transparent addresses whose first on-chain appearance falls in the bucket. MWEB addresses are confidential by design and are never counted. Week/month/year buckets are the sum of the daily counts."},"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."},"block_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Block Count","description":"Count of blocks whose block time falls in the bucket (UTC). Week/month/year buckets are the sum of the daily counts."},"tx_count_excluding_coinbase":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tx Count Excluding Coinbase","description":"Count of confirmed non-coinbase transactions in the bucket."},"economic_output_value_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Economic Output Value Atomic Units","description":"Mechanics-excluded gross transparent output value in the bucket, in atomic units: excludes coinbase outputs, HogEx integrating transactions, and peg-in venue-boundary transactions. Still gross — change outputs and self-churn are included. For change-adjusted payment volume use /charts/economic-flow."},"total_fee_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Fee Atomic Units","description":"Sum of indexed transaction-row fee_value in the bucket, in atomic units. In a 19-block sample spanning MWEB activation through recent sampled blocks, indexed transaction-row fee sums matched Litecoin Core getblockstats.totalfee, with observed MWEB kernel fees entering exactly once through the HogEx fee."},"coinbase_output_value_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Coinbase Output Value Atomic Units","description":"Total value actually claimed through coinbase outputs in the bucket, in atomic units — source-literal, no derivation. Distinct from `subsidy_atomic_units` (the scheduled amount): claimed = subsidy plus ALL fees minus any miner underclaim. Fee-sum completeness is verified on a 19-block sample (MWEB activation through recent sampled blocks), so a scheduled-vs-claimed gap derived from these fields is sample-supported, not universally proven."},"subsidy_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subsidy Atomic Units","description":"Node-computed protocol subsidy scheduled in the bucket, in atomic units (per-block getblockstats.subsidy, summed). Genesis day reports 0 — the node treats the genesis coinbase as unspendable and reports no subsidy for height 0. Distinct from `coinbase_output_value_atomic_units` (the amount actually claimed)."},"sending_addresses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sending Addresses","description":"Distinct addresses that sent in the day. **grain=day only** — no exact weekly/monthly distinct rollup exists; other grains return 400."},"receiving_addresses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Receiving Addresses","description":"Distinct addresses that received in the day. **grain=day only** — no exact weekly/monthly distinct rollup exists; other grains return 400."},"median_transaction_value_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Transaction Value Atomic Units","description":"Median non-coinbase transaction output value for the day, in atomic units. **grain=day only** — bucket medians cannot be recomposed from daily medians; other grains return 400. Null on days with no non-coinbase transactions; a null value is omitted from that row on the wire (`response_model_exclude_none`)."},"median_fee_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Fee Atomic Units","description":"Median non-coinbase transaction fee for the day, in atomic units. **grain=day only** — bucket medians cannot be recomposed from daily medians; other grains return 400. Null on days with no non-coinbase transactions; a null value is omitted from that row on the wire (`response_model_exclude_none`)."},"max_transaction_value_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Transaction Value Atomic Units","description":"Largest non-coinbase transaction output value in the bucket, in atomic units. Null when the bucket has no non-coinbase transactions, in which case the field is omitted from that row on the wire (the bucket maximum is exact: max of daily maxima)."},"max_block_time_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Block Time Seconds","description":"Longest observed inter-block interval in the bucket, in seconds. Intervals are computed within UTC days: each day's first block has no prior same-day block, so its boundary interval is recorded as a clamped 0 rather than crossing midnight — a small disclosed artifact of the stored daily series."},"min_fee_rate_atomic_units_per_byte":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Fee Rate Atomic Units Per Byte","description":"Lowest positive fee rate in the bucket, in atomic units per virtual byte. Zero-fee transactions are excluded by definition; null when no positive-fee transaction exists in the bucket (omitted from that row on the wire)."},"max_fee_rate_atomic_units_per_byte":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Fee Rate Atomic Units Per Byte","description":"Highest fee rate in the bucket, in atomic units per virtual byte. Null when the bucket has no non-coinbase transactions (omitted from that row on the wire)."},"avg_transactions_per_block":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Transactions Per Block","description":"Transactions per block. Day grain returns the stored daily value (rounded to 2 decimal places); week/month recomposes exactly as total transactions divided by total blocks (unrounded)."},"avg_transaction_value_atomic_units":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Transaction Value Atomic Units","description":"Mean non-coinbase transaction output value, in atomic units. Day grain returns the stored integer daily mean; week/month recomposes exactly as non-coinbase value total divided by non-coinbase transaction count and can be fractional. Null when the bucket has no non-coinbase transactions (omitted from that row on the wire)."},"avg_block_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Block Time Seconds","description":"Day-weighted mean inter-block interval, in seconds (average of daily means at week/month). Carries a small disclosed low-bias: each UTC day's first block contributes a clamped 0 boundary interval (~0.2% on a typical day)."},"avg_difficulty":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Difficulty","description":"Day-weighted mean network difficulty (average of daily means at week/month)."},"avg_fee_rate_atomic_units_per_byte":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Fee Rate Atomic Units Per Byte","description":"Day-weighted mean fee rate, in atomic units per virtual byte (average of daily means at week/month — no stored numerator exists for exact recomposition). Null when the bucket has no non-coinbase transactions (omitted from that row on the wire)."}},"additionalProperties":false,"type":"object","required":["date"],"title":"NetworkChartPoint","description":"Wire types per implementation_phaseA.md §5 (V30):\nfloat for averages/difficulty/fee-rates (fractional under bucket\nrecomposition or NUMERIC storage), int for counts/totals/medians/maxima."},"NetworkChartResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/NetworkChartPoint"},"type":"array","title":"Data"},"current":{"anyOf":[{"$ref":"#/components/schemas/ChartCurrent"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"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"}},"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. Free-tier requests with limit above the Free-tier page 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` (Free-tier 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 Free-tier 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":{"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$","format":"date-time","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"}],"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"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"SearchResponse"},"SupplyAgeBand":{"properties":{"age_bucket":{"type":"string","title":"Age Bucket","description":"Canonical age-band short code (the band id), e.g. `<1d`, `1y-2y`, `7y+`. Programmatic consumers should key off this code; `display_label` is the human caption."},"band_order":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Band Order","description":"Zero-based canonical position of the band within the snapshot (youngest=0 … oldest=10). Preserves the fixed young→old ordering."},"display_label":{"type":"string","title":"Display Label","description":"Human-readable band name, e.g. `1 year to 2 years`. Display string only."},"output_count":{"type":"integer","minimum":0.0,"title":"Output Count","description":"Number of transparent UTXOs whose coin age falls in this band as of the snapshot."},"value_atomic_units":{"type":"integer","minimum":0.0,"title":"Value Atomic Units","description":"Total value held by UTXOs in this band, in atomic units (for Litecoin, 1e-8 LTC)."},"cumulative_output_count":{"type":"integer","minimum":0.0,"title":"Cumulative Output Count","description":"Running count of UTXOs in this band and all younger bands (cumulative young→old)."},"cumulative_value_atomic_units":{"type":"integer","minimum":0.0,"title":"Cumulative Value Atomic Units","description":"Running value in this band and all younger bands, in atomic units."},"share":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Share","description":"This band's `value_atomic_units` as a fraction `[0.0, 1.0]` of the snapshot's total transparent-UTXO value. Omitted when the snapshot total value is zero. Computed deterministically from the band values."}},"additionalProperties":false,"type":"object","required":["age_bucket","band_order","display_label","output_count","value_atomic_units","cumulative_output_count","cumulative_value_atomic_units"],"title":"SupplyAgeBand","description":"One coin-age band within a single supply-age snapshot."},"SupplyAgeDistributionData":{"properties":{"grain":{"type":"string","enum":["day","week","month"],"title":"Grain","description":"Snapshot grain (mirrors the request `?grain=`). week/month carry the period-end snapshot, not a sum."},"latest_available_date":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"format":"date","title":"Latest Available Date","description":"The dataset's published watermark (last exported UTC day). The freshest snapshot the dataset can serve. `null` if no watermark is published. Surfaced here because the response envelope `meta` has no watermark field."},"disclosure":{"type":"string","title":"Disclosure","description":"Mandatory methodology disclosure: the population is transparent spendable UTXOs only (MWEB peg carriers, OP_RETURN, and the genesis coinbase excluded) — not total supply."},"snapshots":{"items":{"$ref":"#/components/schemas/SupplyAgeSnapshot"},"type":"array","title":"Snapshots","description":"Period-end supply-age snapshots over the requested range, ordered oldest→newest by `bucket_start`."}},"additionalProperties":false,"type":"object","required":["grain","disclosure","snapshots"],"title":"SupplyAgeDistributionData"},"SupplyAgeDistributionResponse":{"properties":{"data":{"$ref":"#/components/schemas/SupplyAgeDistributionData"},"current":{"anyOf":[{"$ref":"#/components/schemas/ChartCurrent"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"SupplyAgeDistributionResponse"},"SupplyAgeSnapshot":{"properties":{"bucket_start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","format":"date","title":"Bucket Start","description":"Period anchor date (YYYY-MM-DD, UTC). For `grain=day` this equals `bucket_end`; for week/month it is the period start (ISO-Monday week / month start)."},"bucket_end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","format":"date","title":"Bucket End","description":"The actual snapshot date the band values are as-of (YYYY-MM-DD, UTC) — the latest daily snapshot within the period. Period-END semantics: week/month values are the closing snapshot, never a sum across the period."},"total_output_count":{"type":"integer","minimum":0.0,"title":"Total Output Count","description":"Total transparent UTXOs across all 11 bands in this snapshot (the `share`/count denominator)."},"total_value_atomic_units":{"type":"integer","minimum":0.0,"title":"Total Value Atomic Units","description":"Total transparent-UTXO value across all 11 bands in this snapshot, in atomic units (the `share` denominator)."},"bands":{"items":{"$ref":"#/components/schemas/SupplyAgeBand"},"type":"array","title":"Bands","description":"The 11 canonical age bands in young→old order."}},"additionalProperties":false,"type":"object","required":["bucket_start","bucket_end","total_output_count","total_value_atomic_units","bands"],"title":"SupplyAgeSnapshot","description":"One period-end snapshot of the supply-age distribution across 11 bands."},"SupplyData":{"properties":{"issued_supply_atomic_units":{"type":"integer","title":"Issued Supply Atomic Units","description":"Deterministic scheduled (protocol) issuance through `at_height`, in atomic units: the sum of block subsidies under the Litecoin halving schedule. Excludes fees (recycled, not issued). Always present."},"circulating_supply_atomic_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Circulating Supply Atomic Units","description":"Node-equivalent circulating supply, in atomic units: the active validation checkpoint's node UTXO-set total (the node's own `gettxoutsetinfo` accounting, cross-checked on cadence). Excludes the genesis coinbase (unspendable) and cumulative OP_RETURN burns, so it is slightly below issued supply. Latest-only: `null` for a historical `at`, and `null` whenever no active checkpoint carries the node figure — never a schedule-derived substitute."},"current_subsidy_atomic_units":{"type":"integer","title":"Current Subsidy Atomic Units","description":"Block subsidy in force at `at_height`, in atomic units (per the halving schedule)."},"next_halving_height":{"type":"integer","title":"Next Halving Height","description":"First block height of the next subsidy halving epoch after `at_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"}],"format":"date-time","title":"Next Halving At Estimate","description":"SCHEDULE estimate of the next halving time: block_time(at_height) + (next_halving_height − at_height) × 150 s (Litecoin's governed target interval). Anchored at the represented block, so historical `at` requests report the estimate as known from that point. Not a prediction from recently observed block times."},"at_height":{"type":"integer","title":"At Height","description":"Block height the figures are computed at: the tip, or the height resolved from `at`."}},"additionalProperties":false,"type":"object","required":["issued_supply_atomic_units","current_subsidy_atomic_units","next_halving_height","at_height"],"title":"SupplyData","description":"`/charts/supply` data block.\n\nA28 seq 8 W1 (governing plan §5 C3): `circulating_supply_atomic_units` is\nemitted as an EXPLICIT `null` whenever it is unavailable — the route sets\n`response_model_exclude_none=True`, so the wrap serializer below re-inserts\nthe key after the parent walker has stripped it. An absent key would be\nindistinguishable from a stripped field (record 140-1); a schedule-derived\nsubstitute under the circulating name is forbidden (B-9). The field schema\nis still published with its properties (`publish_field_schema`)."},"SupplyResponse":{"properties":{"data":{"$ref":"#/components/schemas/SupplyData"},"current":{"anyOf":[{"$ref":"#/components/schemas/ChartCurrent"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"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"}],"format":"date-time","title":"Block Time"},"confirmations":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Confirmations","description":"as_of_height − block_height + 1 against the SAME pinned tip stamped below (never a second tip). Confirmed-only route ⇒ minimum 1."},"stability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stability","description":"'provisional' below the deployed reorg-safe depth (2016), 'reorg_safe' at/above — the same label the current-data surfaces carry; zero-based depth = confirmations − 1."},"as_of_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"As Of Height","description":"EXACT tip height these confirmation facts were computed against."},"as_of_hash":{"anyOf":[{"type":"string","pattern":"^[0-9a-f]{64}$"},{"type":"null"}],"title":"As Of Hash","description":"Hash-anchor of that tip."},"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"}},"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"}],"format":"date-time","title":"Block Time"}},"additionalProperties":false,"type":"object","required":["txid"],"title":"TransactionSearchSummary","description":"`data.summary` when `data.type == \"transaction\"`."},"ValidationMeta":{"properties":{"scope":{"type":"string","enum":["chain","mempool","analytics","account"],"title":"Scope","description":"Data domain the response belongs to: `chain` (indexed chain store), `mempool`, `analytics`, or `account`."},"status":{"type":"string","enum":["validated","lagging","stale","unvalidated","not_applicable","unknown"],"title":"Status","description":"Trust state of the served data: `validated` (covered by the active checkpoint), `lagging` (served height ahead of the checkpoint), `stale`, `unvalidated`, `not_applicable` (mempool/account/analytics scopes in v1), or `unknown`."},"validated_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Validated Height","description":"Height covered by the active validation checkpoint; `null` (explicit) when no checkpoint applies to this scope."},"validated_hash":{"anyOf":[{"type":"string","pattern":"^[0-9a-f]{64}$"},{"type":"null"}],"title":"Validated Hash","description":"Block hash at `validated_height` as recorded by the SAME active checkpoint row that supplies `validated_height` and `checkpoint_id` (never the indexed tip's hash); `null` when no checkpoint applies."},"validated_at":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"},{"type":"null"}],"format":"date-time","title":"Validated At","description":"When the active checkpoint was created (UTC, second precision, Z); `null` when none applies."},"lag_blocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lag Blocks","description":"Indexed tip height minus `validated_height`; `null` when no checkpoint applies."},"checkpoint_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checkpoint Id","description":"Row id of the active checkpoint — an inspection anchor (an id change means a checkpoint was superseded; see /chain/validation/history); `null` on non-chain scopes and when no checkpoint exists."}},"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."},"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$","format":"date-time","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"}},"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."},"CurrentObjectKind":{"type":"string","title":"CurrentObjectKind","enum":["time_window","state_snapshot"],"description":"Shape of a `current` object: a half-open UTC `time_window` [window_start, window_end) or a point-in-time `state_snapshot`."},"CurrentObjectStatus":{"type":"string","title":"CurrentObjectStatus","enum":["available","unavailable"],"description":"`available` objects carry `values` and provenance; `unavailable` objects carry a `reason_code` and never a fabricated value."},"CurrentStability":{"type":"string","title":"CurrentStability","enum":["provisional","reorg_safe"],"description":"`provisional` until every represented block is beyond the deployed reorg-safe depth; `reorg_safe` afterwards. Never asserted directly by a route."},"CurrentReasonCode":{"type":"string","title":"CurrentReasonCode","enum":["canonicality_unresolved","exact_aggregation_unavailable","no_data","outside_requested_range","source_lagging","source_unavailable","unsupported_granularity"],"description":"Governed reason an `unavailable` current object was withheld: `source_unavailable`, `source_lagging` (stale source), `exact_aggregation_unavailable`, `unsupported_granularity`, `outside_requested_range`, `no_data`, `canonicality_unresolved`."},"CurrentGranularity":{"type":"string","title":"CurrentGranularity","enum":["day","month","rolling_24h","week","year"],"description":"Granularity of a `time_window` current object."},"Classification":{"additionalProperties":false,"description":"One classification record sourced from the analytics registry — the\nshape the `?include=classification` expansion actually returns.\n\nSurfaced as `included.classification[]` on `/chain/transaction/{txid}` and\n`/chain/output/{txid}:{vout}`, and as `classification[]` on every entry of\n`included.transactions[]` on `/chain/block/{height_or_hash}` (records for\nthe RETURNED transactions only — see `classification_scope`). A single\ntransaction or output can carry multiple records — one per active\nmethodology that has emitted a row for that entity; an entity with no\nanalytics rows carries an empty array.\n\nFields:\n  - `methodology_id`   stable integer identifier for the methodology family\n    (one id per registered methodology, independent of version).\n  - `methodology_name` partner-facing name of the methodology family.\n  - `classification_value` the assigned label (e.g. `payment`, `change`,\n    `change_likely`, `uncertain`). Free-form lowercase token.\n  - `version` methodology version that emitted the row (e.g. `v2_ch_flow`).","properties":{"methodology_id":{"description":"Stable integer identifier of the methodology family (one id per registered methodology, independent of version).","minimum":1,"title":"Methodology Id","type":"integer"},"methodology_name":{"description":"Partner-facing name of the methodology family.","title":"Methodology Name","type":"string"},"classification_value":{"description":"The assigned label as emitted by the methodology (lowercase token, e.g. `payment`, `change`, `change_likely`, `uncertain`). The label vocabulary belongs to the methodology version.","title":"Classification Value","type":"string"},"version":{"description":"Methodology version that emitted the record.","title":"Version","type":"string"}},"required":["methodology_id","methodology_name","classification_value","version"],"title":"Classification","type":"object"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}}},"security":[{"bearerAuth":[]}]}