{"openapi":"3.1.0","info":{"title":"SteelSwap API","description":"Market-data, routing, and transaction-building API for Cardano DEXs.\n\nTwo families share one host:\n\n- **SteelSwap V2** (`/api/v2/…`) — the first-party API: swap quoting and unsigned transaction building, order history, token / pair / DEX reference data, ADA fx rates, batcher health, and the partner fee dashboard.\n- **TapTools-compatible** (`/api/v2/taptools/…`) — mirrors the TapTools v2 request and response shapes, so an existing client switches over by changing only the base URL.\n\nThis reference is served at `/redoc`; the machine-readable schema is at `/openapi.json`.\n\n### Conventions\n\n- **Token unit** — a token is identified by its on-chain `unit`: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName`. ADA is the sentinel unit `lovelace`.\n- **Casing** — JSON body fields and query parameters are `camelCase`.\n- **Timestamps** — unix epoch **seconds**, unless a field's own description says otherwise (the batcher status sparkline reports milliseconds).\n- **Amounts, TapTools-compatible family** — prices, balances, and supplies are decimal-adjusted numbers; a raw ledger quantity (a UTxO asset's `quantity`) is a base-unit integer string.\n- **Amounts, SteelSwap V2 family** — an amount is a `{unit, amount}` pair whose JSON type carries the scale: an **integer** (request) or **decimal string** (response) is base units, a **JSON number** is a decimal-adjusted display amount. Send either; a decimal amount for a token whose decimals are unknown is rejected with `422` (`unknown_decimals`).\n- **Pagination, TapTools-compatible family** — `page` (1-based, default `1`) and `perPage` (max `100`).\n- **Pagination, SteelSwap V2 family** — either `limit` plus an opaque `cursor` (the response envelope is `{items, cursor}`; `cursor` is omitted on the last page), or `limit` plus a numeric `offset` on the fee endpoints.\n- **Caching** — several reference reads send `Cache-Control` and a strong `ETag`; repeat the tag on `If-None-Match` to get a `304`. The DEX catalog returns logo paths relative to this host, served under `/resources`.\n\n### Authentication\n\nWhen the deployment enables auth, data routes in **both** families require a credential. Anything that authenticates differently is called out on the section that owns it — the batcher health probe is public, and the partner fee endpoints gate per endpoint (below). Supply the credential on **exactly one** of these request headers:\n\n- `Authorization: Bearer <key>`\n- `x-api-key: <key>`\n\nPresenting both is rejected with `400` (the two are never compared). A missing or unrecognised credential returns `401`. An exhausted burst limit or daily quota returns `429` with a `Retry-After` header in seconds.\n\nThe partner fee endpoints under `/api/v2/fees` authenticate per endpoint instead: the partner-facing reads accept a wallet session token on `X-Session-Token` (issued after a CIP-8 login) **or** a durable API key, and resolve to the caller's own account; the `/api/v2/fees/admin/…` reads require an administrator credential and name their target with `?partner=<slug>`.\n\n### Errors\n\n- **SteelSwap V2** returns one flat body — `{\"error\": \"<machine_code>\", \"message\": \"<human text>\", …}` — with any extra context as camelCase siblings, so a client writes a single error reader.\n- **TapTools-compatible** routes keep the upstream status-only shape (`{\"detail\": \"…\"}`) with no reason detail, so a drop-in client's error handling is unchanged.\n\nEvery response carries an `X-Request-Id` header (an inbound value is reused when you send one) — quote it when reporting a problem.","version":"2.0.0.dev0"},"paths":{"/api/v2/tokens/metadata":{"post":{"tags":["V2 Tokens"],"summary":"Batch token metadata (cacheable)","description":"Resolve the metadata for a batch of on-chain token units.\n\nReturns ``{tokens: [...]}`` — one ``TokenRef`` per unit that resolved, ordered\nby its first occurrence in ``units``. Duplicate, unknown and malformed units\nare dropped, so a batch that resolves nothing is ``{\"tokens\": []}``, never an\nerror. Token metadata changes rarely, so the response carries a long-lived\n``Cache-Control`` (1 hour) and a content ``ETag`` over the exact body; sending\nthat tag back as ``If-None-Match`` yields ``304 Not Modified``.","operationId":"token_metadata_api_v2_tokens_metadata_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetadataRequest"},"examples":{"pair":{"summary":"Both sides of an ADA / SNEK trade","value":{"units":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]}},"single":{"summary":"One token","value":{"units":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetadataResponse"},"example":{"tokens":[{"unit":"lovelace","policyId":"","assetName":"","decimals":6,"decimalsKnown":true,"ticker":"ADA","name":"Cardano"},{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","policyId":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f","assetName":"534e454b","decimals":0,"decimalsKnown":true,"ticker":"SNEK","name":"Snek"}]}}}},"304":{"description":"The submitted ``If-None-Match`` matched the current content ``ETag`` — the cached copy is still current."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/tokens/list":{"get":{"tags":["V2 Tokens"],"summary":"Ranked, searchable token list","description":"Return a ranked, searchable, paginated page of tokens for a token selector.\n\nThe universe is every token with an ADA pair. The full ranked list (by\n``sort``) is assembled once and briefly cached, then narrowed by ``search``\nand sliced by ``limit`` / ``cursor``; ``cursor`` is omitted from the response\non the last page. Each row carries the token metadata, the ``verified`` flag,\nand ADA-denominated ``priceAda`` / ``liquidityAda`` / ``volume24hAda`` — each\nof the three omitted when the metric is unknown for that token. The response\nis safe to cache for a minute.","operationId":"token_list_api_v2_tokens_list_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Tokens per page — 1 to 200, default 50.","default":50,"title":"Limit"},"description":"Tokens per page — 1 to 200, default 50."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor taken from the previous page's ``cursor``; omit it for the first page. It encodes a position in the ranked, filtered list, so it is only meaningful when ``sort``, ``search`` and ``verifiedOnly`` are unchanged. A malformed cursor is a ``400``.","title":"Cursor"},"description":"Opaque cursor taken from the previous page's ``cursor``; omit it for the first page. It encodes a position in the ranked, filtered list, so it is only meaningful when ``sort``, ``search`` and ``verifiedOnly`` are unchanged. A malformed cursor is a ``400``."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive substring match on the token ticker or name, or an exact match on its ``unit``. Applied after ranking and before paging; an empty or whitespace-only value is ignored. No match yields an empty page, not a ``404``.","title":"Search"},"description":"Case-insensitive substring match on the token ticker or name, or an exact match on its ``unit``. Applied after ranking and before paging; an empty or whitespace-only value is ignored. No match yields an empty page, not a ``404``."},{"name":"sort","in":"query","required":false,"schema":{"enum":["liquidity","volume24h","virtualTvl"],"type":"string","description":"Ranking metric over the ADA-tradeable universe: ``liquidity`` (default, ADA liquidity), ``volume24h`` (trailing 24h ADA volume) or ``virtualTvl`` (latest per-token virtual TVL). All three rank the same set of tokens — only the order differs.","default":"liquidity","title":"Sort"},"description":"Ranking metric over the ADA-tradeable universe: ``liquidity`` (default, ADA liquidity), ``volume24h`` (trailing 24h ADA volume) or ``virtualTvl`` (latest per-token virtual TVL). All three rank the same set of tokens — only the order differs."},{"name":"verifiedOnly","in":"query","required":false,"schema":{"type":"boolean","description":"Restrict the list to curated tokens — verified by SteelSwap or listed in the Cardano Token Registry. Default ``true``; pass ``false`` to include the whole ADA-tradeable universe.","default":true,"title":"Verifiedonly"},"description":"Restrict the list to curated tokens — verified by SteelSwap or listed in the Cardano Token Registry. Default ``true``; pass ``false`` to include the whole ADA-tradeable universe."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_TokenListItem_"},"example":{"items":[{"token":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","policyId":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f","assetName":"534e454b","decimals":0,"decimalsKnown":true,"ticker":"SNEK","name":"Snek"},"verified":true,"priceAda":0.001234,"liquidityAda":1234567.89,"volume24hAda":98765.43}],"cursor":"NTA="}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/swap/estimate":{"post":{"tags":["V2 Swap"],"summary":"Quote a swap","description":"Quote a swap in either direction against live pool state.\n\nSend exactly one complete side. ``{input, outputUnit}`` fixes what you offer\nand predicts what you receive; ``{inputUnit, output}`` fixes what you want to\nreceive and predicts what you must offer. A body carrying both sides — or\nneither — is rejected with ``422``.\n\nThe quote is solved against current reserves and may be split across several\nvenues, which is what ``split`` reports. ``fees.service`` is the exact fee the\nmatching build will charge: it is resolved from the same authenticated caller,\nso a quote and its build never disagree about the fee.\n\nAmounts follow the JSON type. An integer is base units; a float is a human\namount, scaled by the token's decimals. A request that used a float gets every\namount back decimal-adjusted; a token whose decimals are unknown is ``422\nunknown_decimals``.\n\nSet ``allInclusive`` to treat the ADA ``input`` as the total leaving the\nwallet: the batcher fee, the deposits, the service fee and a 1 ADA network\nbuffer are netted out of it and the returned ``input`` is the smaller amount\nactually swapped. ADA input only — any other shape is ``422\nall_inclusive_unsupported``, and a total too small to cover the overhead is\n``422 insufficient_input``.\n\nA pair with no usable route is ``404 no_route``.","operationId":"estimate_api_v2_swap_estimate_post","parameters":[{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set to ``token`` to add a top-level ``tokens`` array carrying the metadata — ticker, name, decimals, logo — of every unit named anywhere in the response. Any other value is ignored and the key is omitted.","examples":["token"],"title":"Expand"},"description":"Set to ``token`` to add a top-level ``tokens`` array carrying the metadata — ticker, name, decimals, logo — of every unit named anywhere in the response. Any other value is ignored and the key is omitted."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateRequest"},"examples":{"inputFixed":{"summary":"Input-amount — offer 100 ADA, quote what comes back","description":"Send ``input`` (the offered asset and amount) together with ``outputUnit`` (the token you want). The response's ``output`` is the predicted receive.","value":{"input":{"unit":"lovelace","amount":100000000},"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}},"outputFixed":{"summary":"Output-amount — receive exactly 41000 SNEK, quote the ADA needed","description":"Send ``inputUnit`` (the token you offer) together with ``output`` (the asset and amount you want). The response's ``input`` is the offer required. Never send both sides: a both-sides or neither-side body is rejected with 422.","value":{"inputUnit":"lovelace","output":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":41000}}},"decimalAmount":{"summary":"Decimal amounts — offer 100.5 ADA instead of 100500000 lovelace","description":"A JSON float is a human amount: the server scales it to base units using the token's decimals, and echoes EVERY amount in the response as a decimal-adjusted JSON number instead of a base-unit string. A token whose decimals are unknown is rejected with 422 ``unknown_decimals``.","value":{"input":{"unit":"lovelace","amount":100.5},"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}},"allInclusive":{"summary":"All-inclusive — 100 ADA is the total that leaves the wallet","description":"With ``allInclusive`` the ADA ``input`` is the total debit: the batcher fee, the per-leg deposit, the SteelSwap fee and a 1 ADA network buffer are netted out of it, and the response's ``input`` is the smaller amount actually swapped. ADA input only. ``ignore`` additionally drops the named DEX brands from routing.","value":{"input":{"unit":"lovelace","amount":100000000},"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","allInclusive":true,"ignore":["Spectrum"]}}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/swap/routes/dag":{"get":{"tags":["V2 Swap"],"summary":"Candidate routing DAG between two tokens","description":"Reconstruct the structure-only routing DAG between two units.\n\nLoads the routing graph, enumerates every token path (≤ ``maxHops``) and the\npool edges that compose them, and returns the typed :class:`RouteDag`. A\nno-route pair is a 200 *empty* DAG (``total_paths == 0``), not a 404 — a\nstructure query, not a missing resource. Briefly cacheable (the route set\nshifts as pools change).","operationId":"routes_dag_api_v2_swap_routes_dag_get","parameters":[{"name":"inputUnit","in":"query","required":true,"schema":{"type":"string","description":"On-chain unit of the token being sold — the ``policyId`` concatenated with the hex-encoded ``assetName``, or ``lovelace`` for ADA. A unit absent from the routing graph yields an empty DAG, not an error.","examples":["lovelace"],"title":"Inputunit"},"description":"On-chain unit of the token being sold — the ``policyId`` concatenated with the hex-encoded ``assetName``, or ``lovelace`` for ADA. A unit absent from the routing graph yields an empty DAG, not an error."},{"name":"outputUnit","in":"query","required":true,"schema":{"type":"string","description":"On-chain unit of the token being bought — the ``policyId`` concatenated with the hex-encoded ``assetName``, or ``lovelace`` for ADA.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Outputunit"},"description":"On-chain unit of the token being bought — the ``policyId`` concatenated with the hex-encoded ``assetName``, or ``lovelace`` for ADA."},{"name":"maxHops","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Longest route depth to enumerate, in pool hops. Defaults to 3 and is CLAMPED to at most 4 — a larger value is silently reduced, not rejected.","examples":[3],"default":3,"title":"Maxhops"},"description":"Longest route depth to enumerate, in pool hops. Defaults to 3 and is CLAMPED to at most 4 — a larger value is silently reduced, not rejected."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteDag"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/swap/assemble":{"post":{"tags":["V2 Swap"],"summary":"Assemble the building blocks of a swap transaction","description":"Return the transaction building blocks for ``req``.\n\nReuses ``/swap/build``'s resolution, but instead of finalizing a tx it\nemits the script/order inputs, outputs + datums, redeemers (as templates\n+ patches), required signers, and reference inputs so the caller assembles,\nbalances, and signs the tx itself. Babel and router legs are out of scope\nin v1: a router leg raises ``422 route_not_assemblable``; babel resolves\nthe ADA-fee path and does not surface here.","operationId":"assemble_api_v2_swap_assemble_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildRequest"},"examples":{"inputFixed":{"summary":"Input-amount build with a 0.5% slippage floor","description":"``expectedOutput`` is the output you were quoted. The build re-solves against live pools and returns 409 ``quote_changed`` if the fresh output falls below that figure minus ``slippageBps``. ``utxos`` is omitted here, so the server funds the transaction from ``addressSource``'s own unspent outputs.","value":{"input":{"unit":"lovelace","amount":100000000},"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","expectedOutput":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":41000},"slippageBps":50,"ttlSeconds":600,"addressSource":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"}},"outputFixedWithCancels":{"summary":"Output-amount build that also cancels two resting orders","description":"An output-amount build MUST carry ``expectedInput``: the output is pinned, so the output floor protects nothing and the quoted input becomes the ceiling instead. ``cancelUtxos`` folds resting orders the same wallet owns into the same transaction, and their reclaimed value helps fund the swap.","value":{"inputUnit":"lovelace","output":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":41000},"expectedInput":{"unit":"lovelace","amount":100000000},"expectedOutput":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":41000},"slippageBps":100,"addressSource":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","cancelUtxos":[{"txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txIndex":0},{"txHash":"9c1b6a04c6a1a0f8f5b0c3d9e2a7148b3f6c0d51e8a94b27d3c6f0a815e4b7d2","txIndex":1}]}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssembleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/swap/build":{"post":{"tags":["V2 Swap"],"summary":"Build an unsigned swap transaction","description":"Build an unsigned swap tx from ``req`` (keyless build path).\n\nRe-solves the estimate, verifies it against the client's ``expectedOutput``\nslippage floor, resolves the live pools + collateral, and assembles the\nunsigned transaction via ``build_service.build_swap`` (a fresh per-request\nOgmios chain context, reusing the ATC seam). The fee channel is derived from\nthe authenticated ``principal`` (a partner fee or the SteelSwap service fee) —\nnever a request field. ``build_swap`` owns the resolve → verify → assemble\nsequence; the pycardano build runs inline within the request. Known failures\nmap through ``_build_failed`` to the bare flat error: no route → ``404\nno_route``; a moved quote → ``409 quote_changed`` (carrying the fresh quote);\nun-buildable input → ``422 invalid_build``; an unreachable node → ``503\nchain_unavailable``. The in-build cancel verdicts map too: a cancel\non a DEX outside the Ogmios-validated allowlist → ``422\ncancel_not_supported_in_build``; a mixed Plutus version → ``422\nmixed_script_version``; an owner != funder cancel → ``422 cancel_owner_mismatch``.","operationId":"build_api_v2_swap_build_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildRequest"},"examples":{"inputFixed":{"summary":"Input-amount build with a 0.5% slippage floor","description":"``expectedOutput`` is the output you were quoted. The build re-solves against live pools and returns 409 ``quote_changed`` if the fresh output falls below that figure minus ``slippageBps``. ``utxos`` is omitted here, so the server funds the transaction from ``addressSource``'s own unspent outputs.","value":{"input":{"unit":"lovelace","amount":100000000},"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","expectedOutput":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":41000},"slippageBps":50,"ttlSeconds":600,"addressSource":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"}},"outputFixedWithCancels":{"summary":"Output-amount build that also cancels two resting orders","description":"An output-amount build MUST carry ``expectedInput``: the output is pinned, so the output floor protects nothing and the quoted input becomes the ceiling instead. ``cancelUtxos`` folds resting orders the same wallet owns into the same transaction, and their reclaimed value helps fund the swap.","value":{"inputUnit":"lovelace","output":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":41000},"expectedInput":{"unit":"lovelace","amount":100000000},"expectedOutput":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":41000},"slippageBps":100,"addressSource":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","cancelUtxos":[{"txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txIndex":0},{"txHash":"9c1b6a04c6a1a0f8f5b0c3d9e2a7148b3f6c0d51e8a94b27d3c6f0a815e4b7d2","txIndex":1}]}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/swap/notify":{"post":{"tags":["V2 Swap"],"summary":"Register a just-submitted swap tx as pending","description":"Surface a just-broadcast swap tx as a ``MEMPOOL`` order until it is ingested.\n\nThe frontend calls this the instant it submits the signed swap tx, so the orders\nview can show it as pending during the seconds-to-minutes window before the\non-chain listener indexes it. The tx CBOR is re-parsed and its id recomputed;\na ``txHash`` that does not match the CBOR is a ``400`` (the marker key cannot be\nspoofed onto a foreign tx). The marker is Redis-only and self-expiring\n(:mod:`steelswap.api.native.swap_pending`): its EX is sized from the tx's\n``invalid_hereafter`` deadline (+ a grace) so it lapses on its own with no reaper,\nand the write is idempotent (``SET NX``) so a repeat notify is a no-op. Attribution\nis identity-only via ``resolve_swap_principal`` (never a 401): the partner id (when\na partner key was presented) rides on the marker, and the submitter's stake\ncredential — inferred from the tx outputs — indexes the tx per-wallet so the orders\nLIST can find it. Returns ``204``.","operationId":"notify_api_v2_swap_notify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifyRequest"},"examples":{"submitted":{"summary":"A swap transaction just broadcast to the network","description":"``txHash`` must be the id recomputed from ``txCbor``; a mismatch is rejected.","value":{"txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txCbor":"84a600d9010281825820754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be900018182583900"}}}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/swap/cancel":{"post":{"tags":["V2 Swap"],"summary":"Build unsigned cancel transactions for resting orders","description":"Build unsigned cancel transactions for resting orders.\n\nResolves each ``OrderRef`` against the silver ``Order`` table, partitions the\nstill-cancellable orders by Plutus version (V1-hash vs V2/V3-inline — a single\ntx cannot mix the two witness styles), and returns **one unsigned transaction\nper non-empty bucket** (the client signs + submits via CIP-30). Anything not\ncancellable (not indexed yet, already executed, an unsupported dex) rides back\nin ``skipped`` rather than failing the request — so an all-skipped batch is a\n``200`` with ``transactions: []``, not an error. Reuses the same fresh\nper-request Ogmios context the build path uses; the resolve → partition →\nper-bucket build is owned by ``cancel_service.cancel_orders`` (the pycardano\nassembly runs inline).\nKnown build failures map through ``_build_failed`` to the bare flat error:\nun-buildable input → ``422 invalid_build``; an unreachable node → ``503\nchain_unavailable``.","operationId":"cancel_api_v2_swap_cancel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/steelswap__api__native__schemas__CancelRequest"},"examples":{"twoOrders":{"summary":"Cancel two resting orders","description":"Each ref names the transaction that CREATED the order plus that order output's index. Refs that cannot be cancelled come back under ``skipped``; they never fail the request.","value":{"orders":[{"txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txIndex":0},{"txHash":"9c1b6a04c6a1a0f8f5b0c3d9e2a7148b3f6c0d51e8a94b27d3c6f0a815e4b7d2","txIndex":1}],"changeAddress":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","ttlSeconds":600}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/batcher/status":{"get":{"tags":["V2 Batcher"],"summary":"Per-protocol batcher health","description":"Return the current batcher health for every tracked protocol.\n\n``protocols`` always carries one entry per tracked protocol, in a fixed order,\neach with its ``status`` (``QUIET`` / ``HEALTHY`` / ``WARN`` / ``DOWN``) and\nthe resolved WARN / DOWN block thresholds it is judged against. ``status`` and\nthe live-demand fields are omitted for a protocol that has not been snapshotted\nyet (a quiet protocol, or a restart window) — an absent field is missing data,\nnever an error. ``currentSlot`` / ``currentBlock`` / ``currentAt`` are the\nchain-tip snapshot the demand ages are measured against, and are themselves\nomitted when no tip has been recorded.\n\nWith ``expand=history`` each protocol also carries ``history`` — a\nworst-status-per-bucket sparkline over ``window`` slots split into ``buckets``\nbuckets. A protocol with no samples in the window has no ``history``. The body\nturns over roughly once per block and is cacheable for a few seconds.","operationId":"batcher_status_api_v2_batcher_status_get","parameters":[{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass ``history`` to attach the bucketed status sparkline to every protocol. Any other value behaves exactly like omitting it — the current status only, served from cache without a history scan.","title":"Expand"},"description":"Pass ``history`` to attach the bucketed status sparkline to every protocol. Any other value behaves exactly like omitting it — the current status only, served from cache without a history scan."},{"name":"window","in":"query","required":false,"schema":{"type":"integer","maximum":604800,"minimum":1,"description":"How far back the sparkline reaches, in slots (one slot is about one second): 1 to 604800 (about 7 days, the retention limit), default 86400 (about 1 day). Measured back from the newest recorded history sample rather than from the chain tip. Ignored unless ``expand=history``.","default":86400,"title":"Window"},"description":"How far back the sparkline reaches, in slots (one slot is about one second): 1 to 604800 (about 7 days, the retention limit), default 86400 (about 1 day). Measured back from the newest recorded history sample rather than from the chain tip. Ignored unless ``expand=history``."},{"name":"buckets","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"How many buckets the window is divided into: 1 to 500, default 96. Each bucket spans ``window / buckets`` slots (rounded down, at least one) and reports the worst status seen inside it. A bucket with no recorded sample is absent, so fewer points than requested may come back. Ignored unless ``expand=history``.","default":96,"title":"Buckets"},"description":"How many buckets the window is divided into: 1 to 500, default 96. Each bucket spans ``window / buckets`` slots (rounded down, at least one) and reports the worst status seen inside it. A bucket with no recorded sample is absent, so fewer points than requested may come back. Ignored unless ``expand=history``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatcherHealthResponse"},"example":{"protocols":[{"protocol":"Minswap","status":"HEALTHY","lastClearedSlot":141234500,"lastClearedAt":1750000291000,"demandCount":3,"oldestDemandAgeBlocks":1,"oldestDemandAgeSeconds":24,"warnThresholdBlocks":3,"downThresholdBlocks":10},{"protocol":"SundaeSwap","status":"QUIET","lastClearedSlot":141233900,"lastClearedAt":1750000291000,"warnThresholdBlocks":3,"downThresholdBlocks":10}],"currentSlot":141234560,"currentBlock":11220334,"currentAt":1750000351000}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fx/ada":{"get":{"tags":["V2 FX"],"summary":"ADA price in a quote currency","description":"Return the current price of 1 ADA in ``quote``, plus its 24h change.\n\nThis is an fx rate — what one ADA is worth in an outside currency — not a\ntoken price. ``quote`` is echoed back upper-cased and ``price`` is the live\nspot; ``asOf`` is the unix second (not a slot) the spot was read.\n\n``change24h`` is the fractional move against the reference rate 24 hours ago,\nso ``0.0182`` means +1.82% and a negative value means ADA is down. The\nreference is the recorded fx close nearest at or before that instant; when no\nsuch bar exists the live spot stands in for it, which makes the change read\n``0``. Requesting ``ADA`` likewise yields a ``price`` of ``1.0`` and a\n``change24h`` of ``0``.","operationId":"ada_price_api_v2_fx_ada_get","parameters":[{"name":"quote","in":"query","required":false,"schema":{"type":"string","description":"Quote currency, case-insensitive: ``ADA``, ``USD``, ``EUR``, ``BTC`` or ``ETH``. Default ``USD``; ``ADA`` is the trivial base and always prices at ``1.0``. Anything else is a ``400``.","default":"USD","title":"Quote"},"description":"Quote currency, case-insensitive: ``ADA``, ``USD``, ``EUR``, ``BTC`` or ``ETH``. Default ``USD``; ``ADA`` is the trivial base and always prices at ``1.0``. Anything else is a ``400``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdaPrice"},"example":{"quote":"USD","price":0.4231,"change24h":0.0182,"asOf":1750000351}}}},"400":{"description":"``quote`` is not a supported currency."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dexes":{"get":{"tags":["V2 DEXes"],"summary":"Supported DEX catalog","description":"Return every DEX the aggregator supports.\n\nEach entry carries the ``id`` used to identify that DEX elsewhere in the API\n(for example on a route leg), its display ``name``, its ``type`` — ``amm`` for\npool-based venues, ``orderbook`` for order-matched ones — and a served\n``logoUrl`` path. The list is not paginated: it is a small static catalog that\nchanges only with a deployment, so the body carries a long ``Cache-Control``\n(1 hour) and a content ``ETag``; sending that tag back as ``If-None-Match``\nyields ``304 Not Modified``. Filtering to a type with no members returns an\nempty ``items`` array.","operationId":"list_dexes_api_v2_dexes_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Keep only DEXes of one type: ``amm`` or ``orderbook`` (case-insensitive). Omit it for the whole catalog; any other value is a ``400``.","title":"Type"},"description":"Keep only DEXes of one type: ``amm`` or ``orderbook`` (case-insensitive). Omit it for the whole catalog; any other value is a ``400``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DexList"},"example":{"items":[{"id":"Minswap","name":"Minswap","type":"amm","logoUrl":"/resources/img/dex/minswap.png"},{"id":"SundaeSwapV3","name":"SundaeSwap V3","type":"amm","logoUrl":"/resources/img/dex/sundaeswap-v3.png"},{"id":"GeniusYield","name":"GeniusYield","type":"orderbook","logoUrl":"/resources/img/dex/geniusyield.png"}]}}}},"304":{"description":"The submitted ``If-None-Match`` matched the current content ``ETag`` — the cached catalog is still current."},"400":{"description":"``type`` was neither ``amm`` nor ``orderbook``."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/pairs":{"get":{"tags":["V2 Pairs"],"summary":"Ranked trading pairs","description":"Return a ranked, paginated page of ADA-quoted trading pairs.\n\nEvery pair is ``(ADA, tokenB)``: ``tokenA`` is always the ``lovelace``\nsentinel, and ``priceAda`` is the ADA price of ``tokenB``. The full ranked\nlist (by ``sort``) is assembled once and briefly cached, then sliced by\n``limit`` / ``cursor``; ``cursor`` is omitted from the response on the last\npage. ``poolCount`` is how many pools back the pair; ``priceAda`` /\n``liquidityAda`` / ``volume24hAda`` are ADA-denominated and each omitted when\nunknown. The response is safe to cache for a minute.","operationId":"list_pairs_api_v2_pairs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Pairs per page — 1 to 200, default 50.","default":50,"title":"Limit"},"description":"Pairs per page — 1 to 200, default 50."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor taken from the previous page's ``cursor``; omit it for the first page. It encodes a position in the ranked list, so it is only meaningful when ``sort`` and ``token`` are unchanged. A malformed cursor is a ``400``.","title":"Cursor"},"description":"Opaque cursor taken from the previous page's ``cursor``; omit it for the first page. It encodes a position in the ranked list, so it is only meaningful when ``sort`` and ``token`` are unchanged. A malformed cursor is a ``400``."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Narrow the listing to the one pair whose ``tokenB`` is this on-chain unit (``policyIdHex + assetNameHex``). ADA is always ``tokenA``, so passing ``lovelace`` is a no-op and returns the full list. A unit with no ADA pair yields an empty page.","title":"Token"},"description":"Narrow the listing to the one pair whose ``tokenB`` is this on-chain unit (``policyIdHex + assetNameHex``). ADA is always ``tokenA``, so passing ``lovelace`` is a no-op and returns the full list. A unit with no ADA pair yields an empty page."},{"name":"sort","in":"query","required":false,"schema":{"enum":["liquidity","volume24h"],"type":"string","description":"Ranking metric: ``liquidity`` (default, ADA liquidity) or ``volume24h`` (trailing 24h ADA volume).","default":"liquidity","title":"Sort"},"description":"Ranking metric: ``liquidity`` (default, ADA liquidity) or ``volume24h`` (trailing 24h ADA volume)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PairItem_"},"example":{"items":[{"tokenA":{"unit":"lovelace","policyId":"","assetName":"","decimals":6,"decimalsKnown":true,"ticker":"ADA","name":"Cardano"},"tokenB":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","policyId":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f","assetName":"534e454b","decimals":0,"decimalsKnown":true,"ticker":"SNEK","name":"Snek"},"poolCount":7,"priceAda":0.001234,"liquidityAda":1234567.89,"volume24hAda":98765.43}],"cursor":"NTA="}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/orders":{"get":{"tags":["V2 Orders"],"summary":"A wallet's logical swap orders","description":"Page a wallet's orders, newest first.\n\nEach item is one logical order — a submission with its split-swap executions\nand any continuation or cross-protocol forwarding folded into it. The list is\nlean: ``legs`` and ``route`` are omitted unless ``expand`` asks for them.\n\nAn order that has been broadcast but not yet indexed appears as a ``MEMPOOL``\nitem at the head of the FIRST page only; it carries no execution detail and is\nreplaced by the real order as soon as it is on chain. Such items are added on\ntop of the page, so a first page can hold more than ``limit`` entries. Later\npages, and any request that filters by ``dex`` or by a ``status`` set that\nexcludes ``MEMPOOL``, leave them out.\n\nA wallet with no orders — including an address that has never been seen on\nchain — returns an empty ``items`` array with a ``200``, never an error.","operationId":"list_orders_api_v2_orders_get","parameters":[{"name":"addresses","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"minItems":1,"description":"The wallet to look up: one or more bech32 base, enterprise or stake addresses, either repeated (``?addresses=a&addresses=b``) or comma-joined. Each is matched on its payment credential and its stake credential, so any address of the same wallet finds the same orders even after the receiving key rotates. Addresses that cannot be decoded, and credentials never seen on chain, are simply ignored.","title":"Addresses"},"description":"The wallet to look up: one or more bech32 base, enterprise or stake addresses, either repeated (``?addresses=a&addresses=b``) or comma-joined. Each is matched on its payment credential and its stake credential, so any address of the same wallet finds the same orders even after the receiving key rotates. Addresses that cannot be decoded, and credentials never seen on chain, are simply ignored."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Keep only orders whose overall ``status`` is one of these values — ``OPEN``, ``LIMIT``, ``PARTIALLY_FILLED``, ``PARTIALLY_CANCELLED``, ``FILLED``, ``CANCELLED``, ``ERROR``, ``MIXED``, ``MEMPOOL``. Repeatable; matched against the aggregate over the whole order, not against any single execution. ``ROLLED_BACK`` is the one aggregate value that cannot be listed — a rolled-back order is excluded from this endpoint — so filtering on it returns nothing.","title":"Status"},"description":"Keep only orders whose overall ``status`` is one of these values — ``OPEN``, ``LIMIT``, ``PARTIALLY_FILLED``, ``PARTIALLY_CANCELLED``, ``FILLED``, ``CANCELLED``, ``ERROR``, ``MIXED``, ``MEMPOOL``. Repeatable; matched against the aggregate over the whole order, not against any single execution. ``ROLLED_BACK`` is the one aggregate value that cannot be listed — a rolled-back order is excluded from this endpoint — so filtering on it returns nothing."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Keep only orders whose transaction was tagged with this app brand on chain, lower-cased — for example ``steelswap``, ``minswap``, ``dexhunter``, ``sundaeswap``, or ``other`` for a tag that is not recognised. Best-effort: transactions carrying no tag at all have no brand, so any value here silently excludes them.","title":"Source"},"description":"Keep only orders whose transaction was tagged with this app brand on chain, lower-cased — for example ``steelswap``, ``minswap``, ``dexhunter``, ``sundaeswap``, or ``other`` for a tag that is not recognised. Best-effort: transactions carrying no tag at all have no brand, so any value here silently excludes them."},{"name":"dex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Keep only orders with at least one execution on this venue. The value is the internal order-class name (for example ``MinswapV2CPPState`` or ``GeniusYieldOrderState``), NOT the display label that ``legs[].dex`` carries. Mempool orders have no execution yet, so this filter always excludes them.","title":"Dex"},"description":"Keep only orders with at least one execution on this venue. The value is the internal order-class name (for example ``MinswapV2CPPState`` or ``GeniusYieldOrderState``), NOT the display label that ``legs[].dex`` carries. Mempool orders have no execution yet, so this filter always excludes them."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor taken from the previous page's ``cursor``; omit it for the first page. A malformed cursor is a ``400``.","title":"Cursor"},"description":"Opaque cursor taken from the previous page's ``cursor``; omit it for the first page. A malformed cursor is a ``400``."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Orders per page — 1 to 100, default 25. Counts logical orders, not executions; the ``status`` and ``dex`` filters are applied after paging, so a page may come back shorter than this while a further ``cursor`` is still returned.","default":25,"title":"Limit"},"description":"Orders per page — 1 to 100, default 25. Counts logical orders, not executions; the ``status`` and ``dex`` filters are applied after paging, so a page may come back shorter than this while a further ``cursor`` is still returned."},{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated set of the heavy fields to inline: ``legs``, ``route``, or ``legs,route``. Omitted by default to keep the list small; unrecognised names are ignored.","title":"Expand"},"description":"Comma-separated set of the heavy fields to inline: ``legs``, ``route``, or ``legs,route``. Omitted by default to keep the list small; unrecognised names are ignored."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_OrderGroup_"},"example":{"items":[{"txHash":"e5b71c0d4938a2f6c1057be3d92a48f07c6b153ad82e94f01b3c5d6e7f809a2b","blockSlot":0,"blockIndex":0,"timeSec":1750000402,"status":"MEMPOOL","orderType":"SWAP","pair":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"offer":[],"minReceive":[],"received":[],"legCount":0},{"txHash":"b1d407e2a95c3186f0b4d72e59a3c810f6b5d2e47a09c1358f6e2b4d7a091c3e","blockSlot":141234120,"blockIndex":3,"timeSec":1750000351,"status":"PARTIALLY_FILLED","orderType":"SWAP","pair":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"source":{"brand":"steelswap","partner":"eternl"},"offer":[{"unit":"lovelace","amount":"250000000"}],"minReceive":[{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":"198000000"}],"received":[{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":"81250000"}],"remaining":[{"unit":"lovelace","amount":"150000000"}],"legCount":3},{"txHash":"3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f6071","blockSlot":141230880,"blockIndex":41,"timeSec":1749996671,"status":"FILLED","orderType":"SWAP","pair":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"source":{"brand":"minswap"},"offer":[{"unit":"lovelace","amount":"100000000"}],"minReceive":[{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":"80000000"}],"received":[{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":"81250000"}],"legCount":2}],"cursor":"MTQxMjMwODgwOjQxOjg4NzcyMTA="}}}},"400":{"description":"``cursor`` is malformed."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/orders/{tx_hash}":{"get":{"tags":["V2 Orders"],"summary":"One logical order by its root create-tx hash","description":"Return one logical order, fully expanded, by the transaction that opened it.\n\nThe response always carries ``legs`` and ``route`` — this endpoint takes no\n``expand``. The transaction hash is public on chain and is the only thing\nneeded to read the order: there is no owner check, so the caller does not have\nto prove ownership of the wallet.\n\nA hash that is not valid hex, and a transaction that opened no order, both\nreturn ``404``. An order that has been broadcast but is not indexed yet\nresolves to its ``MEMPOOL`` form — ``status`` ``MEMPOOL``, zeroed block\ncoordinates, no amounts and no legs — until the chain catches up.","operationId":"get_order_api_v2_orders__tx_hash__get","parameters":[{"name":"tx_hash","in":"path","required":true,"schema":{"type":"string","description":"Hex hash of the transaction that OPENED the order — the ``txHash`` the list endpoint returns, not the hash of a later continuation or forwarding transaction.","examples":["3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f6071"],"title":"Tx Hash"},"description":"Hex hash of the transaction that OPENED the order — the ``txHash`` the list endpoint returns, not the hash of a later continuation or forwarding transaction."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderGroup"},"example":{"txHash":"3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f60718","blockSlot":141234560,"blockIndex":12,"timeSec":1750000351,"status":"FILLED","orderType":"SWAP","pair":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"source":{"brand":"steelswap"},"offer":[{"unit":"lovelace","amount":"100000000"}],"minReceive":[{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":"80000000"}],"received":[{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":"81250000"}],"legCount":2,"legs":[{"kind":"ammSwap","dex":"Minswap","txHash":"3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f60718","status":"FILLED","offer":{"unit":"lovelace","amount":"60000000"},"received":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":"48800000"},"poolId":"6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2"},{"kind":"ammSwap","dex":"SundaeSwapV3","txHash":"3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f60718","status":"FILLED","offer":{"unit":"lovelace","amount":"40000000"},"received":{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","amount":"32450000"},"poolId":"0be55d262b29f564998ff81efe21bdc0022621c12f1cfa4a1b2c3d4e5f607182"}],"route":{"inputUnit":"lovelace","outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","totalPaths":1,"isAcyclic":true,"nodes":[{"kind":"token","unit":"lovelace"},{"kind":"token","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}],"legs":[{"kind":"ammSwap","poolId":"6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2","dex":"Minswap","from":"lovelace","to":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},{"kind":"ammSwap","poolId":"0be55d262b29f564998ff81efe21bdc0022621c12f1cfa4a1b2c3d4e5f607182","dex":"SundaeSwapV3","from":"lovelace","to":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}],"paths":[["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]]}}}}},"404":{"description":"No order is rooted at that transaction, or the hash is not valid hex."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fees/account":{"get":{"tags":["V2 Fees"],"summary":"Fee-collection account status","description":"Live lovelace balance, disbursement threshold, and payout readiness.\n\nReturns what the account currently holds at its fee address, split into\n``claimable`` (orders resolved — payable now) and ``held`` (still tied to\nresting orders), together with its ``threshold`` and the ``shouldDistribute``\nflag. Every amount is lovelace.\n\nAn account with no fee stream of its own returns the zero-state — ``feeAddress``\n``null`` and every amount ``\"0\"`` — rather than an error.","operationId":"account_api_v2_fees_account_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Recompute the balances now instead of serving the cached snapshot. The underlying scan of the fee address is slow, so the default (``false``) returns a snapshot up to 45 seconds old; ``true`` forces a fresh scan and replaces the cached value. Expect a noticeably slower response when set.","default":false,"title":"Refresh"},"description":"Recompute the balances now instead of serving the cached snapshot. The underlying scan of the fee address is slow, so the default (``false``) returns a snapshot up to 45 seconds old; ``true`` forces a fresh scan and replaces the cached value. Expect a noticeably slower response when set."},{"name":"partner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account.","title":"Partner"},"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``.","title":"X-Session-Token"},"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fees/payouts":{"get":{"tags":["V2 Fees"],"summary":"On-chain payout history + lifetime total","description":"One page of on-chain payouts, plus the lifetime total ever paid out.\n\nPayouts are the disbursements that landed at the account's reward address,\nnewest first. Alongside the page, ``totalPaid`` gives the lifetime lovelace sum\nover every payout and ``total`` the number of payout transactions across all\npages, so both figures stay stable while paging.\n\nAn account with no reward address set, or with no fee stream, returns the\nzero-state rather than an error.","operationId":"payouts_api_v2_fees_payouts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"How many payouts to return in this page. Clamped to ``1..100`` inclusive — a value outside that range is clamped, not rejected.","default":25,"title":"Limit"},"description":"How many payouts to return in this page. Clamped to ``1..100`` inclusive — a value outside that range is clamped, not rejected."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","description":"How many payouts to skip before the page, counting from the most recent. A negative value is clamped to ``0``. An offset past the end returns an empty ``payouts`` list with ``total`` unchanged.","default":0,"title":"Offset"},"description":"How many payouts to skip before the page, counting from the most recent. A negative value is clamped to ``0``. An offset past the end returns an empty ``payouts`` list with ``total`` unchanged."},{"name":"partner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account.","title":"Partner"},"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``.","title":"X-Session-Token"},"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fees/summary":{"get":{"tags":["V2 Fees"],"summary":"All-time fee totals","description":"All-time fee-output count and total lovelace collected for the account.\n\nCovers the account's entire history — no date window and no pagination. An\naccount that has never collected a fee returns ``txCount`` ``0`` and\n``feeValue`` ``\"0\"``.","operationId":"summary_api_v2_fees_summary_get","parameters":[{"name":"partner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account.","title":"Partner"},"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``.","title":"X-Session-Token"},"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fees/bars":{"get":{"tags":["V2 Fees"],"summary":"Per-period fee bars (day/week/month)","description":"Time-bucketed fee revenue for the account — the dashboard chart series.\n\nReturns one bar per bucket that had fee activity, oldest first, each carrying\nthe bucket's fee-output count and its lovelace total. ``period`` selects both\nthe bucket size and the length of the look-back window, so this is a recent\nwindow rather than the full history. ``bars`` is empty when nothing was\ncollected in the window.","operationId":"bars_api_v2_fees_bars_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"enum":["day","week","month"],"type":"string","description":"Bucket granularity, which also fixes the look-back window the bars cover: ``day`` returns daily buckets over the last 7 days, ``week`` weekly buckets (each starting Monday) over the last 49 days, and ``month`` monthly buckets over the last 182 days. The lower bound is inclusive and the window runs to the most recently indexed block. Buckets with no fee activity are omitted rather than returned as zero.","default":"day","title":"Period"},"description":"Bucket granularity, which also fixes the look-back window the bars cover: ``day`` returns daily buckets over the last 7 days, ``week`` weekly buckets (each starting Monday) over the last 49 days, and ``month`` monthly buckets over the last 182 days. The lower bound is inclusive and the window runs to the most recently indexed block. Buckets with no fee activity are omitted rather than returned as zero."},{"name":"partner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account.","title":"Partner"},"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``.","title":"X-Session-Token"},"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeBarsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fees/history":{"get":{"tags":["V2 Fees"],"summary":"Paged fee-bearing tx history","description":"One page of the fee-bearing transactions attributed to the account.\n\nEntries are ordered newest first by block time, each carrying the transaction\nhash, its block time in unix seconds, and the lovelace fee it produced.\n``total`` reports the number of fee outputs across all pages, so a client can\npage the full history; it is unaffected by ``limit`` / ``offset``.","operationId":"history_api_v2_fees_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"How many transactions to return in this page. Clamped to ``1..100`` inclusive — a value outside that range is clamped, not rejected.","default":25,"title":"Limit"},"description":"How many transactions to return in this page. Clamped to ``1..100`` inclusive — a value outside that range is clamped, not rejected."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","description":"How many transactions to skip before the page, counting from the most recent. A negative value is clamped to ``0``. An offset past the end returns an empty ``entries`` list with ``total`` unchanged.","default":0,"title":"Offset"},"description":"How many transactions to skip before the page, counting from the most recent. A negative value is clamped to ``0``. An offset past the end returns an empty ``entries`` list with ``total`` unchanged."},{"name":"partner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account.","title":"Partner"},"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``.","title":"X-Session-Token"},"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fees/admin/{source}/summary":{"get":{"tags":["V2 Fees"],"summary":"All-time fee totals for an internal source (admin)","description":"All-time fee-output count and total lovelace for one internal fee stream.\n\nThe admin counterpart of the account summary, reading the SteelSwap-internal\n``service`` / ``atc`` streams instead of a partner's. Restricted to an\nowner/admin credential; an unknown ``source`` is ``404``.","operationId":"admin_summary_api_v2_fees_admin__source__summary_get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","description":"Which internal fee stream to read: ``service`` (the SteelSwap service fee) or ``atc`` (the already-collected ATC desk fees). Any other value returns ``404``.","examples":["service"],"title":"Source"},"description":"Which internal fee stream to read: ``service`` (the SteelSwap service fee) or ``atc`` (the already-collected ATC desk fees). Any other value returns ``404``."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fees/admin/{source}/bars":{"get":{"tags":["V2 Fees"],"summary":"Per-period fee bars for an internal source (admin)","description":"Time-bucketed fee revenue for one internal fee stream.\n\nThe admin counterpart of the account bars, reading the SteelSwap-internal\n``service`` / ``atc`` streams instead of a partner's; ``period`` behaves\nidentically. Restricted to an owner/admin credential; an unknown ``source`` is\n``404``.","operationId":"admin_bars_api_v2_fees_admin__source__bars_get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","description":"Which internal fee stream to read: ``service`` (the SteelSwap service fee) or ``atc`` (the already-collected ATC desk fees). Any other value returns ``404``.","examples":["service"],"title":"Source"},"description":"Which internal fee stream to read: ``service`` (the SteelSwap service fee) or ``atc`` (the already-collected ATC desk fees). Any other value returns ``404``."},{"name":"period","in":"query","required":false,"schema":{"enum":["day","week","month"],"type":"string","description":"Bucket granularity, which also fixes the look-back window the bars cover: ``day`` returns daily buckets over the last 7 days, ``week`` weekly buckets (each starting Monday) over the last 49 days, and ``month`` monthly buckets over the last 182 days. The lower bound is inclusive and the window runs to the most recently indexed block. Buckets with no fee activity are omitted rather than returned as zero.","default":"day","title":"Period"},"description":"Bucket granularity, which also fixes the look-back window the bars cover: ``day`` returns daily buckets over the last 7 days, ``week`` weekly buckets (each starting Monday) over the last 49 days, and ``month`` monthly buckets over the last 182 days. The lower bound is inclusive and the window runs to the most recently indexed block. Buckets with no fee activity are omitted rather than returned as zero."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeBarsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fees/admin/{source}/history":{"get":{"tags":["V2 Fees"],"summary":"Recent fee-bearing txs for an internal source (admin)","description":"The most recent fee-bearing transactions for one internal fee stream.\n\nUnpaged: it always returns the newest 50 entries (or fewer), with no ``limit``\n/ ``offset``. ``total`` still reports the stream's full fee-output count.\nRestricted to an owner/admin credential; an unknown ``source`` is ``404``.","operationId":"admin_history_api_v2_fees_admin__source__history_get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","description":"Which internal fee stream to read: ``service`` (the SteelSwap service fee) or ``atc`` (the already-collected ATC desk fees). Any other value returns ``404``.","examples":["service"],"title":"Source"},"description":"Which internal fee stream to read: ``service`` (the SteelSwap service fee) or ``atc`` (the already-collected ATC desk fees). Any other value returns ``404``."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/quote":{"get":{"tags":["Token"],"summary":"Quote price","description":"Current price of 1 ADA in the requested currency (`ADA`, `USD`, `EUR`, `BTC`, `ETH`).","operationId":"token_quote_api_v2_taptools_token_quote_get","parameters":[{"name":"quote","in":"query","required":false,"schema":{"type":"string","description":"Currency the returned values are denominated in: `ADA`, `USD`, `EUR`, `BTC` or `ETH` (case-insensitive). Anything else is rejected with `400 unsupported quote currency`.","examples":["ADA"],"default":"ADA","title":"Quote"},"description":"Currency the returned values are denominated in: `ADA`, `USD`, `EUR`, `BTC` or `ETH` (case-insensitive). Anything else is rejected with `400 unsupported quote currency`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenQuote"},"example":{"price":0.1638}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/quote/available":{"get":{"tags":["Token"],"summary":"Available quote currencies","description":"Currencies supported by the quote-price endpoint.","operationId":"token_quote_available_api_v2_taptools_token_quote_available_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Token Quote Available Api V2 Taptools Token Quote Available Get"},"example":["ADA","USD","EUR","BTC","ETH"]}}}}}},"/api/v2/taptools/token/prices":{"post":{"tags":["Token"],"summary":"Token prices","description":"Spot price in ADA per whole token for each requested unit. The body is a JSON array of token units, at most 100 per request — more is `400 max 100 tokens per request`. The response is a SPARSE map: a unit appears only when it has an ADA price, so malformed units, unindexed tokens, tokens with no ADA pair, and `lovelace` itself are simply absent. An empty request array returns `{}`.","operationId":"token_prices_api_v2_taptools_token_prices_post","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Units","description":"Token units to price (max 100 per request)."},"examples":{"batch":{"summary":"Three mainnet tokens in one request","value":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d","0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854"]},"single":{"summary":"A single token","value":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"number"},"type":"object","title":"Response Token Prices Api V2 Taptools Token Prices Post"},"example":{"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b":0.00230011906466846}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/prices/chg":{"get":{"tags":["Token"],"summary":"Token price percent change","description":"Fractional price change of a token (vs ADA) over the requested timeframes. The response is a SPARSE map of timeframe to fractional change (e.g. 0.024 = +2.4%): a timeframe is omitted when the token has no indexed close at or before that cutoff, and an unpriced or unindexed token yields `{}`.","operationId":"token_prices_chg_api_v2_taptools_token_prices_chg_get","parameters":[{"name":"timeframes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated subset of `5m`, `1h`, `4h`, `6h`, `24h`, `7d`, `30d`, `60d`, `90d` — for example `24h,7d`. Omit for all nine. Unrecognised labels are ignored rather than rejected.","examples":["24h,7d"],"title":"Timeframes"},"description":"Comma-separated subset of `5m`, `1h`, `4h`, `6h`, `24h`, `7d`, `30d`, `60d`, `90d` — for example `24h,7d`. Omit for all nine. Unrecognised labels are ignored rather than rejected."},{"name":"unit","in":"query","required":true,"schema":{"type":"string","description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"number"},"title":"Response Token Prices Chg Api V2 Taptools Token Prices Chg Get"},"example":{"5m":0.0,"1h":0.002479351522877815,"4h":0.0034405383083175867,"6h":-0.019801079374852537,"24h":-0.016519102760705007,"7d":0.08114044834708678,"30d":0.1025482392983248,"60d":0.1648610364764187,"90d":0.3299463554967006}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Token"],"summary":"Token price percent change, batched (SteelSwap extension)","description":"**SteelSwap extension** (not part of the TapTools API). Batch variant of `GET /token/prices/chg`: fractional price change (vs ADA) for many units over the requested timeframes in one request. `units` is capped at 100; `timeframes` defaults to all (5m, 1h, 4h, 6h, 24h, 7d, 30d, 60d, 90d). The response is a SPARSE nested map `{unit: {timeframe: chg}}` — a unit or timeframe with missing data is omitted (e.g. 0.024 = +2.4%).","operationId":"token_prices_chg_batch_api_v2_taptools_token_prices_chg_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPriceChangeBatchRequest"},"examples":{"batch":{"summary":"Three tokens over two timeframes","value":{"units":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d","0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854"],"timeframes":["24h","7d"]}},"allTimeframes":{"summary":"One token, every timeframe (omit `timeframes`)","value":{"units":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]}}}}}},"responses":{"200":{"description":"Fractional change per timeframe, keyed by the requested unit. A unit with no indexed price is absent from the map entirely, so a three-unit request can return fewer than three keys.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"number"}},"title":"Response Token Prices Chg Batch Api V2 Taptools Token Prices Chg Post"},"example":{"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b":{"24h":-0.016519102760705007,"7d":0.08114044834708678}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/decimals":{"post":{"tags":["Token"],"summary":"Token decimals (SteelSwap extension)","description":"**SteelSwap extension** (not part of the TapTools API). Decimal places for each requested unit, from the off-chain token registry. The body is a JSON array of token units, at most 100 per request — more is `400 max 100 tokens per request`. The response is a SPARSE map: a unit is present ONLY when its decimals are known — a unit absent from the map has UNKNOWN decimals (NOT zero), so it must not be decimal-adjusted. Request casing is echoed back as the map key.","operationId":"token_decimals_api_v2_taptools_token_decimals_post","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Units","description":"Token units to look up decimals for (max 100 per request)."},"examples":{"batch":{"summary":"Three mainnet tokens in one request","value":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d","0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854"]}}}},"required":true},"responses":{"200":{"description":"Known decimals keyed by the requested unit. Units whose decimals are unknown are absent.","content":{"application/json":{"schema":{"additionalProperties":{"type":"integer"},"type":"object","title":"Response Token Decimals Api V2 Taptools Token Decimals Post"},"example":{"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b":0}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/ohlcv":{"get":{"tags":["Token"],"summary":"Token price OHLCV","description":"Trended open/high/low/close/volume data for a token, priced in ADA and aggregated across pools, returned oldest candle first. `unit` is required (the TapTools `onchainID` per-pool variant is not implemented and returns `400`). A token with no indexed ADA pair returns an empty array.","operationId":"token_ohlcv_api_v2_taptools_token_ohlcv_get","parameters":[{"name":"interval","in":"query","required":true,"schema":{"type":"string","description":"Candle resolution. One of `5m`, `15m`, `30m`, `1h`, `4h`, `1d`, `1w` — the directly-stored resolutions. The TapTools resample-only intervals (`3m`, `2h`, `6h`, `12h`, `3d`, `1M`) are rejected with `400 unsupported interval`.","examples":["1d"],"title":"Interval"},"description":"Candle resolution. One of `5m`, `15m`, `30m`, `1h`, `4h`, `1d`, `1w` — the directly-stored resolutions. The TapTools resample-only intervals (`3m`, `2h`, `6h`, `12h`, `3d`, `1M`) are rejected with `400 unsupported interval`."},{"name":"unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."},{"name":"onchainID","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Per-pool OHLCV by pool id. NOT implemented — supplying it is rejected with `400 onchainID not yet supported`. Use `unit`.","title":"Onchainid"},"description":"Per-pool OHLCV by pool id. NOT implemented — supplying it is rejected with `400 onchainID not yet supported`. Use `unit`."},{"name":"numIntervals","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Cap on the number of candles returned, taken from the most recent end of the series. Omit for every stored candle at this resolution.","examples":[30],"title":"Numintervals"},"description":"Cap on the number of candles returned, taken from the most recent end of the series. Omit for every stored candle at this resolution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenOHLCV"},"title":"Response Token Ohlcv Api V2 Taptools Token Ohlcv Get"},"example":[{"time":1781654400,"open":0.0023663597299704744,"high":0.0024618505159747905,"low":0.002329895617950462,"close":0.002337201613461359,"volume":271504.1438160005},{"time":1781740800,"open":0.0023363811007762214,"high":0.0023472180351890516,"low":0.002254063547035854,"close":0.002294117796859333,"volume":317935.05839800084},{"time":1781827200,"open":0.00229422202504673,"high":0.00230011906466846,"low":0.00229422202504673,"close":0.00230011906466846,"volume":4039.786247000535}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/links":{"get":{"tags":["Token"],"summary":"Token links","description":"Social and website links for a token.","operationId":"token_links_api_v2_taptools_token_links_get","parameters":[{"name":"unit","in":"query","required":true,"schema":{"type":"string","description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenLinks"},"example":{"logo":"iVBORw0KGgoAAAANSUhEUgAABLAAAASwCAMAAADc/0P9AAAC…(base64-encoded PNG, truncated)","telegram":"https://t.me/snekcoinada","twitter":"https://twitter.com/snekcoinada","website":"https://linktr.ee/snekcoinada"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/pools":{"get":{"tags":["Token"],"summary":"Token liquidity pools","description":"Active liquidity pools that include the token, with the amount of each side locked. Supply a token `unit` or a specific pool `onchainID` — neither is `400 unit or onchainID required`. Only pools whose latest state is still active are returned; a token or pool id with no active pool returns an empty array.","operationId":"token_pools_api_v2_taptools_token_pools_get","parameters":[{"name":"unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."},{"name":"onchainID","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A single pool's on-chain id — the `onchainID` this endpoint returns (its length varies by DEX). Takes precedence over `unit` when both are supplied.","examples":["96c31772282e6ae5c629120471c5bbcdef538226b31b97d74c50ca3c"],"title":"Onchainid"},"description":"A single pool's on-chain id — the `onchainID` this endpoint returns (its length varies by DEX). Takes precedence over `unit` when both are supplied."},{"name":"adaOnly","in":"query","required":false,"schema":{"type":"integer","description":"Set to `1` to keep only ADA-paired pools; `0` (the default) returns every pair. Any non-zero value is treated as `1`.","examples":[0],"default":0,"title":"Adaonly"},"description":"Set to `1` to keep only ADA-paired pools; `0` (the default) returns every pair. Any non-zero value is treated as `1`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenPool"},"title":"Response Token Pools Api V2 Taptools Token Pools Get"},"example":[{"tokenA":"lovelace","tokenATicker":"ADA","tokenB":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","tokenBTicker":"SNEK","lpTokenUnit":"","onchainID":"96c31772282e6ae5c629120471c5bbcdef538226b31b97d74c50ca3c","tokenALocked":87185.267197,"tokenBLocked":37974334.0,"exchange":"VyFinance"},{"tokenA":"lovelace","tokenATicker":"ADA","tokenB":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","tokenBTicker":"SNEK","lpTokenUnit":"","onchainID":"e0302560ced2fdcbfcb2602697df970cd0d6a38f94b32703f51c312b000de140cacb7fd5f5b84bf876d40dc60d4991c72112d78d76132b1fb769e6ad","tokenALocked":51899.217099,"tokenBLocked":22641291.0,"exchange":"SundaeSwap V3"}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/top/liquidity":{"get":{"tags":["Token"],"summary":"Top liquidity tokens","description":"Tokens ranked by ADA-denominated liquidity, highest first.","operationId":"token_top_liquidity_api_v2_taptools_token_top_liquidity_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404.","examples":[1],"default":1,"title":"Page"},"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404."},{"name":"perPage","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page, 1-100.","examples":[20],"default":10,"title":"Perpage"},"description":"Items per page, 1-100."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TopLiquidityToken"},"title":"Response Token Top Liquidity Api V2 Taptools Token Top Liquidity Get"},"example":[{"unit":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d","ticker":"USDM","price":6.12096438799256,"liquidity":19210069.920432},{"unit":"fe7c786ab321f41c654ef6c1af7b3250a613c24e4213e0425a7ae45655534441","ticker":"USDA","price":6.099709216504663,"liquidity":15220188.318},{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","ticker":"NIGHT","price":0.1892384931923829,"liquidity":14850658.52863}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/virtual-tvl":{"get":{"tags":["Token"],"summary":"Per-token virtual TVL ranking (SteelSwap extension)","description":"**SteelSwap extension** (not part of the TapTools API). Tokens ranked by virtual TVL — effective ADA liquidity including side routes — highest first. `ratio` is virtual / real (0 when real is 0).","operationId":"token_virtual_tvl_api_v2_taptools_token_virtual_tvl_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Number of ranked tokens to return, 1-500.","examples":[100],"default":100,"title":"Limit"},"description":"Number of ranked tokens to return, 1-500."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenVirtualTvl"},"title":"Response Token Virtual Tvl Api V2 Taptools Token Virtual Tvl Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/top/volume":{"get":{"tags":["Token"],"summary":"Top volume tokens","description":"Tokens ranked by ADA-denominated trading volume over a timeframe, highest first.","operationId":"token_top_volume_api_v2_taptools_token_top_volume_get","parameters":[{"name":"timeframe","in":"query","required":false,"schema":{"type":"string","description":"Rolling lookback window. One of `15m`, `1h`, `4h`, `12h`, `24h`, `7d`, `30d`, `90d`, `180d`, `1y`, `all`; anything else is rejected with `400 unsupported timeframe`.","examples":["24h"],"default":"24h","title":"Timeframe"},"description":"Rolling lookback window. One of `15m`, `1h`, `4h`, `12h`, `24h`, `7d`, `30d`, `90d`, `180d`, `1y`, `all`; anything else is rejected with `400 unsupported timeframe`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404.","examples":[1],"default":1,"title":"Page"},"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404."},{"name":"perPage","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page, 1-100.","examples":[20],"default":20,"title":"Perpage"},"description":"Items per page, 1-100."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TopVolumeToken"},"title":"Response Token Top Volume Api V2 Taptools Token Top Volume Get"},"example":[{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","ticker":"NIGHT","price":0.18898813514389542,"volume":1197763.3131950009},{"unit":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d","ticker":"USDM","price":6.1212214574169,"volume":806985.512614998},{"unit":"fe7c786ab321f41c654ef6c1af7b3250a613c24e4213e0425a7ae45655534441","ticker":"USDA","price":6.099706453912152,"volume":511494.034885997}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/trades":{"get":{"tags":["Token"],"summary":"Token trades","description":"Market-wide feed of filled DEX trades, newest first by default; pass `unit` to restrict it to one token. Each trade is oriented with the non-ADA side as `tokenA` and ADA as `tokenB`, `action` is the trader's side, and `price` is ADA per `tokenA`.","operationId":"token_trades_api_v2_taptools_token_trades_get","parameters":[{"name":"timeframe","in":"query","required":false,"schema":{"type":"string","description":"Rolling lookback window for the trade feed. One of `1h`, `4h`, `24h`, `7d`, `30d`, `90d`, `180d`, `1y`, `all`; anything else is rejected with `400 unsupported timeframe`. Ignored when `from` is supplied.","examples":["30d"],"default":"30d","title":"Timeframe"},"description":"Rolling lookback window for the trade feed. One of `1h`, `4h`, `24h`, `7d`, `30d`, `90d`, `180d`, `1y`, `all`; anything else is rejected with `400 unsupported timeframe`. Ignored when `from` is supplied."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string","description":"Sort key: `time` (the fill time) or `amount` (the trade's ADA side). Anything else is rejected with `400 unsupported sortBy`.","examples":["time"],"default":"time","title":"Sortby"},"description":"Sort key: `time` (the fill time) or `amount` (the trade's ADA side). Anything else is rejected with `400 unsupported sortBy`."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"Sort direction, `asc` or `desc`. Anything else is rejected with `400 unsupported order`.","examples":["desc"],"default":"desc","title":"Order"},"description":"Sort direction, `asc` or `desc`. Anything else is rejected with `400 unsupported order`."},{"name":"unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."},{"name":"minAmount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum trade size in ADA (whole ADA, not lovelace), measured on the trade's ADA side. Omit for no minimum.","examples":[100],"title":"Minamount"},"description":"Minimum trade size in ADA (whole ADA, not lovelace), measured on the trade's ADA side. Omit for no minimum."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Unix timestamp (seconds) to start from. When set it REPLACES the `timeframe` cutoff, so only trades filled at or after this time are returned.","examples":[1781654400],"title":"From"},"description":"Unix timestamp (seconds) to start from. When set it REPLACES the `timeframe` cutoff, so only trades filled at or after this time are returned."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404.","examples":[1],"default":1,"title":"Page"},"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404."},{"name":"perPage","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page, 1-100.","examples":[20],"default":20,"title":"Perpage"},"description":"Items per page, 1-100."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenTrade"},"title":"Response Token Trades Api V2 Taptools Token Trades Get"},"example":[{"action":"buy","address":"addr1qyzpj7f89x9vxvmjrepwf68nyz8e4pyw0s086kjzwm9u0xt34h2m9ujcp594lmapd0nj8wzfmgc3efgymg6vvpuah8es2l4wmf","exchange":"Minswap V2","hash":"c78fbebd70cb0f8b238bb4b3db05e0659822c46a36da7d7bc41cfde236e924af","lpTokenUnit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c2ffadbb87144e875749122e0bbb9f535eeaa7f5660c6c4a91bcc4121e477f08d","price":0.0023395205854416313,"time":1781826152,"tokenA":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","tokenAAmount":213719.0,"tokenAName":"SNEK","tokenB":"","tokenBAmount":500.0,"tokenBName":"ADA"},{"action":"buy","address":"addr1qyu5yhy34lpfwan66gjwk7y4ec4vwjp6z4xg9k5vj89t48xqrmzmntkel6wpnp38sfqm9ga7emx5ucel79ykm0qk3wgql3t6js","exchange":"Minswap","hash":"dd702407a1472d9310211c0e6fbd4e95aecd7792b3030fbd93e4d7e15d185179","lpTokenUnit":"","price":0.0023179447556499902,"time":1781819912,"tokenA":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","tokenAAmount":181195.0,"tokenAName":"SNEK","tokenB":"","tokenBAmount":420.0,"tokenBName":"ADA"}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/trading/stats":{"get":{"tags":["Token"],"summary":"Trading stats","description":"Aggregated buy/sell activity for a token over a timeframe. A buy is ADA into the token, a sell is the token into ADA; `buyVolume` and `sellVolume` are ADA, and `buyers` / `sellers` count distinct traders. A token with no trades in the window returns zeros, not a 404.","operationId":"token_trading_stats_api_v2_taptools_token_trading_stats_get","parameters":[{"name":"timeframe","in":"query","required":false,"schema":{"type":"string","description":"Rolling lookback window. One of `15m`, `1h`, `4h`, `12h`, `24h`, `7d`, `30d`, `90d`, `180d`, `1y`, `all`; anything else is rejected with `400 unsupported timeframe`.","examples":["24h"],"default":"24h","title":"Timeframe"},"description":"Rolling lookback window. One of `15m`, `1h`, `4h`, `12h`, `24h`, `7d`, `30d`, `90d`, `180d`, `1y`, `all`; anything else is rejected with `400 unsupported timeframe`."},{"name":"unit","in":"query","required":true,"schema":{"type":"string","description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenTradingStats"},"example":{"buyVolume":166362.234315,"buyers":40,"buys":163,"sellVolume":201853.832431,"sellers":35,"sells":160}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/top/mcap":{"get":{"tags":["Token"],"summary":"Top market cap tokens","description":"Tokens ranked by market cap (or fully-diluted valuation), highest first. Candidates are the top 250 tokens by liquidity; a candidate with no ADA price is skipped, so fewer than 250 tokens can be returned.","operationId":"token_top_mcap_api_v2_taptools_token_top_mcap_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","description":"Ranking metric: `fdv` sorts by fully-diluted valuation, and any other value (including the default `mcap`) sorts by market cap.","examples":["mcap"],"default":"mcap","title":"Type"},"description":"Ranking metric: `fdv` sorts by fully-diluted valuation, and any other value (including the default `mcap`) sorts by market cap."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404.","examples":[1],"default":1,"title":"Page"},"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404."},{"name":"perPage","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page, 1-100.","examples":[20],"default":20,"title":"Perpage"},"description":"Items per page, 1-100."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TopMcapToken"},"title":"Response Token Top Mcap Api V2 Taptools Token Top Mcap Get"},"example":[{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","ticker":"SNEK","price":0.00230011906466846,"circSupply":76715880000.0,"totalSupply":76715880000.0,"mcap":176455658.15,"fdv":176455658.15}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/mcap":{"get":{"tags":["Token"],"summary":"Market cap","description":"Market-cap metrics for a token: price, circulating and total supply, market cap, and fully-diluted valuation.","operationId":"token_mcap_api_v2_taptools_token_mcap_get","parameters":[{"name":"unit","in":"query","required":true,"schema":{"type":"string","description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenMcap"},"example":{"ticker":"SNEK","price":0.00230011906466846,"circSupply":76715880000.0,"totalSupply":76715880000.0,"mcap":176455658.15,"fdv":176455658.15}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/indicators":{"get":{"tags":["Token"],"summary":"Token price indicators","description":"A technical indicator computed over the token's ADA close series at the requested candle resolution, returned as a flat array of at most `items` values, oldest first. Warmup candles are fetched behind the requested window and dropped from the front, so a token with too little history returns fewer values — or an empty array. Each tuning parameter applies only to the indicators listed on it; the rest are ignored.","operationId":"token_indicators_api_v2_taptools_token_indicators_get","parameters":[{"name":"unit","in":"query","required":true,"schema":{"type":"string","description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."},{"name":"interval","in":"query","required":true,"schema":{"type":"string","description":"Candle resolution. One of `5m`, `15m`, `30m`, `1h`, `4h`, `1d`, `1w` — the directly-stored resolutions. The TapTools resample-only intervals (`3m`, `2h`, `6h`, `12h`, `3d`, `1M`) are rejected with `400 unsupported interval`.","examples":["1d"],"title":"Interval"},"description":"Candle resolution. One of `5m`, `15m`, `30m`, `1h`, `4h`, `1d`, `1w` — the directly-stored resolutions. The TapTools resample-only intervals (`3m`, `2h`, `6h`, `12h`, `3d`, `1M`) are rejected with `400 unsupported interval`."},{"name":"indicator","in":"query","required":false,"schema":{"type":"string","description":"Which indicator to compute: `ma` (simple moving average), `ema` (exponential moving average), `rsi` (Wilder-smoothed relative strength index), `macd` (the MACD line, fast EMA minus slow EMA — the signal line and histogram are not returned), `bb` (the Bollinger middle band, i.e. the simple moving average) or `bbw` (Bollinger band width, `(upper - lower) / middle`). Anything else is rejected with `400 unsupported indicator`.","examples":["rsi"],"default":"ma","title":"Indicator"},"description":"Which indicator to compute: `ma` (simple moving average), `ema` (exponential moving average), `rsi` (Wilder-smoothed relative strength index), `macd` (the MACD line, fast EMA minus slow EMA — the signal line and histogram are not returned), `bb` (the Bollinger middle band, i.e. the simple moving average) or `bbw` (Bollinger band width, `(upper - lower) / middle`). Anything else is rejected with `400 unsupported indicator`."},{"name":"items","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of values to return, 1-1000, most recent last.","examples":[100],"default":100,"title":"Items"},"description":"Maximum number of values to return, 1-1000, most recent last."},{"name":"length","in":"query","required":false,"schema":{"type":"integer","description":"Lookback window in candles. Applies to `ma`, `ema`, `rsi`, `bb` and `bbw`; `macd` uses `fastLength` / `slowLength` instead.","examples":[14],"default":14,"title":"Length"},"description":"Lookback window in candles. Applies to `ma`, `ema`, `rsi`, `bb` and `bbw`; `macd` uses `fastLength` / `slowLength` instead."},{"name":"smoothingFactor","in":"query","required":false,"schema":{"type":"integer","description":"Numerator of the EMA smoothing constant `factor / (1 + length)`. Applies to `ema` only.","examples":[2],"default":2,"title":"Smoothingfactor"},"description":"Numerator of the EMA smoothing constant `factor / (1 + length)`. Applies to `ema` only."},{"name":"fastLength","in":"query","required":false,"schema":{"type":"integer","description":"Fast EMA window for `macd`, in candles. Ignored otherwise.","examples":[12],"default":12,"title":"Fastlength"},"description":"Fast EMA window for `macd`, in candles. Ignored otherwise."},{"name":"slowLength","in":"query","required":false,"schema":{"type":"integer","description":"Slow EMA window for `macd`, in candles. Ignored otherwise.","examples":[26],"default":26,"title":"Slowlength"},"description":"Slow EMA window for `macd`, in candles. Ignored otherwise."},{"name":"signalLength","in":"query","required":false,"schema":{"type":"integer","description":"Signal-line window for `macd`. Because the flat array carries only the MACD line, this affects the warmup depth rather than the values themselves. Ignored by every other indicator.","examples":[9],"default":9,"title":"Signallength"},"description":"Signal-line window for `macd`. Because the flat array carries only the MACD line, this affects the warmup depth rather than the values themselves. Ignored by every other indicator."},{"name":"stdMult","in":"query","required":false,"schema":{"type":"integer","description":"Standard-deviation multiplier for the Bollinger bands. Affects `bbw`; `bb` returns the middle band, which the multiplier does not move.","examples":[2],"default":2,"title":"Stdmult"},"description":"Standard-deviation multiplier for the Bollinger bands. Affects `bbw`; `bb` returns the middle band, which the multiplier does not move."},{"name":"quote","in":"query","required":false,"schema":{"type":"string","description":"Reserved for currency conversion. The series is ADA-denominated regardless of what is passed; no other currency is applied yet.","examples":["ADA"],"default":"ADA","title":"Quote"},"description":"Reserved for currency conversion. The series is ADA-denominated regardless of what is passed; no other currency is applied yet."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"},"title":"Response Token Indicators Api V2 Taptools Token Indicators Get"},"example":[64.33431199691086,63.56255737029008,61.758664878836676,59.08089836693234,59.34532114560088]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/holders":{"get":{"tags":["Token"],"summary":"Token holders","description":"Total number of holders of a token. Addresses under one stake key are aggregated into a single holder.","operationId":"token_holders_api_v2_taptools_token_holders_get","parameters":[{"name":"unit","in":"query","required":true,"schema":{"type":"string","description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenHolders"},"example":{"holders":39990}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/token/holders/top":{"get":{"tags":["Token"],"summary":"Top token holders","description":"Top holders of a token, by amount held, highest first. Addresses under one stake key are aggregated into a single holder.","operationId":"token_holders_top_api_v2_taptools_token_holders_top_get","parameters":[{"name":"unit","in":"query","required":true,"schema":{"type":"string","description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404.","examples":[1],"default":1,"title":"Page"},"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404."},{"name":"perPage","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page, 1-100.","examples":[20],"default":20,"title":"Perpage"},"description":"Items per page, 1-100."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenTopHolder"},"title":"Response Token Holders Top Api V2 Taptools Token Holders Top Get"},"example":[{"address":"Ae2tdPwUPEZKnykUqXyYQxqJSnADNkm4ELUnyqZUBHcCrNJVDqozLYCt9Jv","amount":2554404077.0},{"address":"stake17xymqg9ghp0ff5r00p57wfhrhgs5gk426t77pdjayjm247cs6j5p0","amount":1847132689.0},{"address":"stake1uxd5jxns935zjp6lswke9upwdzz634ukfwwcapk02x8sgfcas4spp","amount":1800793070.0}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/market/stats":{"get":{"tags":["Market & Integration"],"summary":"Market stats","description":"Aggregated market stats: 24h DEX volume and the count of active addresses (sent or received any tx in the last 24h; addresses sharing a stake key count as one). `quote` selects the currency for `dexVolume` (ADA, USD, EUR, ETH, BTC; default ADA).","operationId":"market_stats_api_v2_taptools_market_stats_get","parameters":[{"name":"quote","in":"query","required":false,"schema":{"type":"string","description":"Currency the returned values are denominated in: `ADA`, `USD`, `EUR`, `BTC` or `ETH` (case-insensitive). Anything else is rejected with `400 unsupported quote currency`.","examples":["ADA"],"default":"ADA","title":"Quote"},"description":"Currency the returned values are denominated in: `ADA`, `USD`, `EUR`, `BTC` or `ETH` (case-insensitive). Anything else is rejected with `400 unsupported quote currency`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketStats"},"example":{"activeAddresses":9831,"dexVolume":0.0}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/market/total-mcap":{"get":{"tags":["Market & Integration"],"summary":"Total market cap (SteelSwap extension)","description":"**SteelSwap extension** (not part of the TapTools API). Chain-wide total market cap in ADA — the sum of circulating supply * ADA price over tokens with KNOWN registry supply and an ADA price. `tokenCount` is the number of contributing tokens; tokens without registry supply or an ADA price are excluded, so this is a conservative floor.","operationId":"market_total_mcap_api_v2_taptools_market_total_mcap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotalMarketCap"}}}}}}},"/api/v2/taptools/integration/latest-block":{"get":{"tags":["Market & Integration"],"summary":"Latest block","description":"The most recently indexed block.","operationId":"integration_latest_block_api_v2_taptools_integration_latest_block_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationBlock"},"example":{"block":{"blockNumber":13568151,"blockTimestamp":1781834053}}}}}}}},"/api/v2/taptools/integration/block":{"get":{"tags":["Market & Integration"],"summary":"Block","description":"A block by `number`, or the most recent block at or before a unix `timestamp`.","operationId":"integration_block_api_v2_taptools_integration_block_get","parameters":[{"name":"number","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Block height. Takes precedence over `timestamp` when both are given; a height that is not indexed is `404`.","examples":[13568151],"title":"Number"},"description":"Block height. Takes precedence over `timestamp` when both are given; a height that is not indexed is `404`."},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Unix timestamp in seconds. Resolves to the most recent block at or before it; a timestamp older than the indexed range is `404`.","examples":[1781834053],"title":"Timestamp"},"description":"Unix timestamp in seconds. Resolves to the most recent block at or before it; a timestamp older than the indexed range is `404`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationBlock"},"example":{"block":{"blockNumber":13568151,"blockTimestamp":1781834053}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/integration/events":{"get":{"tags":["Market & Integration"],"summary":"Events","description":"Swap events over an inclusive block range for the TradingView UDF feed. Each event is oriented to the pool's asset0/asset1 (canonical token order, lovelace first) with the legs placed In/Out from the POOL's perspective, and amounts and reserves rendered as decimal-adjusted strings. A range with no swaps returns an empty `events` array; a range whose bounds are not indexed is `404`.","operationId":"integration_events_api_v2_taptools_integration_events_get","parameters":[{"name":"fromBlock","in":"query","required":true,"schema":{"type":"integer","minimum":0,"description":"First block height of the range, inclusive.","examples":[13568100],"title":"Fromblock"},"description":"First block height of the range, inclusive."},{"name":"toBlock","in":"query","required":true,"schema":{"type":"integer","minimum":0,"description":"Last block height of the range, inclusive. A `toBlock` below `fromBlock` yields an empty `events` array.","examples":[13568151],"title":"Toblock"},"description":"Last block height of the range, inclusive. A `toBlock` below `fromBlock` yields an empty `events` array."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of events to return, 1-1000.","examples":[1000],"default":1000,"title":"Limit"},"description":"Maximum number of events to return, 1-1000."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationEvents"},"example":{"events":[{"block":{"blockNumber":188945431,"blockTimestamp":1780511722},"txnId":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txnIndex":3,"eventIndex":188945431000000,"maker":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","pairId":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c7dd6988c5a86693c76aeec1ea94afa41770be0de21a775ca7a2a1eabdb6a0171","eventType":"swap","amount0":"142950000.0","amount1":"30000000.0","asset0In":"0.0","asset0Out":"142950000.0","asset1In":"30000000.0","asset1Out":"0.0","reserves":{"asset0":"4633769495377.0","asset1":"965003106804.0"}}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/integration/exchange":{"get":{"tags":["Market & Integration"],"summary":"Exchange","description":"Metadata for one exchange (DEX) in the catalog. Unknown ids are `404`.","operationId":"integration_exchange_api_v2_taptools_integration_exchange_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"Exchange id: a 1-based index into the exchange catalog, assigned in alphabetical order of the internal DEX identifiers. Discover ids by walking `1` upwards until a `404`, rather than hardcoding them.","examples":["1"],"title":"Id"},"description":"Exchange id: a 1-based index into the exchange catalog, assigned in alphabetical order of the internal DEX identifiers. Discover ids by walking `1` upwards until a `404`, rather than hardcoding them."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationExchange"},"example":{"exchange":{"id":"1","name":"CSWAP","logoURL":"/resources/img/dex/cswap.png"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/integration/asset":{"get":{"tags":["Market & Integration"],"summary":"Asset","description":"Metadata and supply for a native asset. Supply comes from the off-chain registry when it has one, otherwise from the on-chain net mint. An asset with neither a registry entry nor any mint is `404`.","operationId":"integration_asset_api_v2_taptools_integration_asset_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"Asset unit: `policyId` (56 hex chars) concatenated with the hex-encoded `assetName`. Malformed input is `400 invalid id`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Id"},"description":"Asset unit: `policyId` (56 hex chars) concatenated with the hex-encoded `assetName`. Malformed input is `400 invalid id`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationAsset"},"example":{"asset":{"id":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","name":"Snek","symbol":"SNEK","totalSupply":76715880000.0,"circulatingSupply":76715880000.0}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/integration/pair":{"get":{"tags":["Market & Integration"],"summary":"Pair","description":"A liquidity pair (pool) by id. `asset0Id` / `asset1Id` are the pool's two units in canonical order, lovelace first. An unknown id is `404`.","operationId":"integration_pair_api_v2_taptools_integration_pair_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"The pool's on-chain id — the same value `/token/pools` returns as `onchainID`. Its length varies by DEX.","examples":["96c31772282e6ae5c629120471c5bbcdef538226b31b97d74c50ca3c"],"title":"Id"},"description":"The pool's on-chain id — the same value `/token/pools` returns as `onchainID`. Its length varies by DEX."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationPair"},"example":{"pair":{"id":"96c31772282e6ae5c629120471c5bbcdef538226b31b97d74c50ca3c","dexKey":"VyFi","asset0Id":"lovelace","asset1Id":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","createdAtBlockNumber":92386337,"createdAtBlockTimestamp":1683952628}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/transaction/utxos":{"get":{"tags":["Onchain"],"summary":"Transaction UTxOs","description":"The inputs and outputs of a transaction.","operationId":"transaction_utxos_api_v2_taptools_transaction_utxos_get","parameters":[{"name":"hash","in":"query","required":true,"schema":{"type":"string","description":"Hex-encoded transaction hash (32 bytes, 64 hex chars). Non-hex input is `400 invalid tx hash`; a hash with no indexed transaction is `404`.","examples":["754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9"],"title":"Hash"},"description":"Hex-encoded transaction hash (32 bytes, 64 hex chars). Non-hex input is `400 invalid tx hash`; a hash with no indexed transaction is `404`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionUtxos"},"example":{"hash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","inputs":[{"hash":"003b4163f8885b7457b9cf7ac30c64eaf80ff7f702e0adf6277634211ef1c7d6","index":2,"lovelace":"413165399","assets":[]},{"hash":"f05b65641b41bfb3371f8b07b091733967353dda3707f73f1e3ee8fbdf981673","index":0,"lovelace":"2750000","assets":[{"unit":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d","quantity":"30000000"}]}],"outputs":[{"hash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","index":2,"lovelace":"413249364","assets":[]},{"hash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","index":1,"lovelace":"4633773995377","assets":[{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c4d5350","quantity":"1"},{"unit":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d","quantity":"965003189289"},{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c7dd6988c5a86693c76aeec1ea94afa41770be0de21a775ca7a2a1eabdb6a0171","quantity":"9223370340714043882"}]}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/asset/supply":{"get":{"tags":["Onchain"],"summary":"Asset supply","description":"On-chain supply of a native asset, in base units.","operationId":"asset_supply_endpoint_api_v2_taptools_asset_supply_get","parameters":[{"name":"unit","in":"query","required":true,"schema":{"type":"string","description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSupply"},"example":{"supply":76715880000}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/address/utxos":{"get":{"tags":["Onchain"],"summary":"Address UTxOs","description":"Unspent outputs at an `address` (or `paymentCred`), paginated with `page`/`perPage` (max 100 per page).","operationId":"address_utxos_api_v2_taptools_address_utxos_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A Cardano payment address (`addr1...`, or a Byron base58 address), matched verbatim against the on-chain address set. Stake addresses are NOT accepted here — use `paymentCred` to match every address sharing one payment credential.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"],"title":"Address"},"description":"A Cardano payment address (`addr1...`, or a Byron base58 address), matched verbatim against the on-chain address set. Stake addresses are NOT accepted here — use `paymentCred` to match every address sharing one payment credential."},{"name":"paymentCred","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hex-encoded payment credential (28-byte key or script hash, 56 hex chars) — an alternative to `address`, matching every address built on that credential. Supply exactly one of `address` / `paymentCred`: omitting both is `400`, and non-hex input is `400 invalid paymentCred`.","examples":["68daa2abfd7e7ff5c92cc919865190e2593a7cce6374e9c4ce6e093a"],"title":"Paymentcred"},"description":"Hex-encoded payment credential (28-byte key or script hash, 56 hex chars) — an alternative to `address`, matching every address built on that credential. Supply exactly one of `address` / `paymentCred`: omitting both is `400`, and non-hex input is `400 invalid paymentCred`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404.","examples":[1],"default":1,"title":"Page"},"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404."},{"name":"perPage","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page, 1-100.","examples":[20],"default":100,"title":"Perpage"},"description":"Items per page, 1-100."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Utxo"},"title":"Response Address Utxos Api V2 Taptools Address Utxos Get"},"example":[{"hash":"32bb8e40705b6188063f72e419c2a149a7a19fc86a7d606ccdb3f24da0e277ba","index":3,"lovelace":"1830040","assets":[{"unit":"8fef2d34078659493ce161a6c7fba4b56afefa8535296a5743f6958741414441","quantity":"188098478"}]},{"hash":"caa04eedb236d48c5599a97aebfcb9af0f695e759c32fad5f0ba9d7393bb77ab","index":4,"lovelace":"1959630","assets":[{"unit":"8fef2d34078659493ce161a6c7fba4b56afefa8535296a5743f6958741414441","quantity":"37118847"},{"unit":"f13ac4d66b3ee19a6aa0f2a22298737bd907cc95121662fc971b5275535452494b45","quantity":"1"}]}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/address/info":{"get":{"tags":["Onchain"],"summary":"Address summary","description":"Aggregate ADA and native-asset holdings at an `address` (or `paymentCred`).","operationId":"address_info_api_v2_taptools_address_info_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A Cardano payment address (`addr1...`, or a Byron base58 address), matched verbatim against the on-chain address set. Stake addresses are NOT accepted here — use `paymentCred` to match every address sharing one payment credential.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"],"title":"Address"},"description":"A Cardano payment address (`addr1...`, or a Byron base58 address), matched verbatim against the on-chain address set. Stake addresses are NOT accepted here — use `paymentCred` to match every address sharing one payment credential."},{"name":"paymentCred","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hex-encoded payment credential (28-byte key or script hash, 56 hex chars) — an alternative to `address`, matching every address built on that credential. Supply exactly one of `address` / `paymentCred`: omitting both is `400`, and non-hex input is `400 invalid paymentCred`.","examples":["68daa2abfd7e7ff5c92cc919865190e2593a7cce6374e9c4ce6e093a"],"title":"Paymentcred"},"description":"Hex-encoded payment credential (28-byte key or script hash, 56 hex chars) — an alternative to `address`, matching every address built on that credential. Supply exactly one of `address` / `paymentCred`: omitting both is `400`, and non-hex input is `400 invalid paymentCred`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressInfo"},"example":{"address":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","paymentCred":"68daa2abfd7e7ff5c92cc919865190e2593a7cce6374e9c4ce6e093a","lovelace":"323455390","assets":[{"unit":"08fa422e42f84bd3c274f82452f6395215824f7795cd621b2fcc48fd724f5054","value":"1"},{"unit":"1ad4f068a49bbf0d4f05335cadeca0519cef34cc1b2bc35b2e5739ae434f434b","value":"1515997"},{"unit":"1ddcb9c9de95361565392c5bdff64767492d61a96166cb16094e54be4f5054","value":"20275083454"}],"stakeAddress":"stake1u8ghqrk4ug768sy0qlrv69qxv3aezw9lt98tp4akkfuw44cf55jye"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/wallet/portfolio/positions":{"get":{"tags":["Wallet"],"summary":"Portfolio positions","description":"A wallet's current holdings with supporting market data: `adaBalance` is the lovelace held expressed in ADA, `adaValue` is that plus the ADA value of every priced position, and `liquidValue` currently mirrors `adaValue` (no depth or slippage model is applied yet). Fungible positions are priced from the latest ADA close; LP positions are decomposed into their two underlying sides by pool share. NFTs are counted in `numNFTs` but not valued, so `positionsNft` is always empty.","operationId":"wallet_positions_api_v2_taptools_wallet_portfolio_positions_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"type":"string","description":"A Cardano payment address (`addr1...`) or stake address (`stake1...`). A stake address is expanded to the whole wallet delegating to it; a payment address covers that address alone. An address with no on-chain history yields an empty result, not a 404.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"],"default":"","title":"Address"},"description":"A Cardano payment address (`addr1...`) or stake address (`stake1...`). A stake address is expanded to the whole wallet delegating to it; a payment address covers that address alone. An address with no on-chain history yields an empty result, not a 404."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPositions"},"example":{"adaBalance":323.45539,"adaValue":323.45539,"liquidValue":323.45539,"numFTs":34,"numNFTs":11,"positionsFt":[{"unit":"5dac8536653edc12f6f5e1045d8164b9f59998d3bdc300fc928434894e4d4b52","ticker":"","fingerprint":"asset1lgultx63fukjlhsncmwp235pcnh4fh988phh7f","balance":73464933677.0,"price":0.0,"adaValue":0.0,"liquidBalance":73464933677.0,"liquidValue":0.0,"24h":0.0,"7d":0.0,"30d":0.0},{"unit":"1ad4f068a49bbf0d4f05335cadeca0519cef34cc1b2bc35b2e5739ae434f434b","ticker":"","fingerprint":"asset1g4kfrgdz65mf2vt0x8svrw08jwtznrgv9uwdyx","balance":1515997.0,"price":0.0,"adaValue":0.0,"liquidBalance":1515997.0,"liquidValue":0.0,"24h":0.0,"7d":0.0,"30d":0.0}],"positionsLp":[],"positionsNft":[],"handles":[]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/wallet/handles":{"get":{"tags":["Wallet"],"summary":"Wallet ADA Handles","description":"**SteelSwap extension** (not part of the TapTools API). The ADA Handles currently held by a wallet, each with its on-chain unit and the hex-encoded handle name. A wallet holding none returns an empty array.","operationId":"wallet_handles_api_v2_taptools_wallet_handles_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"type":"string","description":"A Cardano payment address (`addr1...`) or stake address (`stake1...`). A stake address is expanded to the whole wallet delegating to it; a payment address covers that address alone. An address with no on-chain history yields an empty result, not a 404.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"],"default":"","title":"Address"},"description":"A Cardano payment address (`addr1...`) or stake address (`stake1...`). A stake address is expanded to the whole wallet delegating to it; a payment address covers that address alone. An address with no on-chain history yields an empty result, not a 404."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HandleChip"},"title":"Response Wallet Handles Api V2 Taptools Wallet Handles Get"},"example":[{"name":"snekfan","unit":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a736e656b66616e","hex":"736e656b66616e"}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/wallet/trades/tokens":{"get":{"tags":["Wallet"],"summary":"Wallet token trades","description":"A wallet's filled token swaps, newest first. Each trade is oriented with the non-ADA side as `tokenA`, and `action` is the trader's side (`Buy` or `Sell`). A wallet with no filled trades returns an empty array.","operationId":"wallet_token_trades_api_v2_taptools_wallet_trades_tokens_get","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","description":"A Cardano payment address (`addr1...`) or stake address (`stake1...`). A stake address is expanded to the whole wallet delegating to it; a payment address covers that address alone. An address with no on-chain history yields an empty result, not a 404.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"],"title":"Address"},"description":"A Cardano payment address (`addr1...`) or stake address (`stake1...`). A stake address is expanded to the whole wallet delegating to it; a payment address covers that address alone. An address with no on-chain history yields an empty result, not a 404."},{"name":"unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"title":"Unit"},"description":"Token on-chain unit: the `policyId` (56 hex chars) concatenated with the hex-encoded `assetName` (0-64 hex chars). ADA is the sentinel `lovelace`. Anything else is rejected with `400 invalid unit`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404.","examples":[1],"default":1,"title":"Page"},"description":"1-based page number (1-10000). A page past the end of the result set returns an empty array, not a 404."},{"name":"perPage","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page, 1-100.","examples":[20],"default":100,"title":"Perpage"},"description":"Items per page, 1-100."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletTokenTrade"},"title":"Response Wallet Token Trades Api V2 Taptools Wallet Trades Tokens Get"},"example":[{"action":"Sell","time":1780807040,"tokenA":"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935425443","tokenAName":"","tokenAAmount":121449.0,"tokenB":"","tokenBName":"ADA","tokenBAmount":349287324.0,"hash":"030b05bb494059ee0f5514503187afcee5b5010fa8046825d806334a06641c90"},{"action":"Sell","time":1780511722,"tokenA":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d","tokenAName":"","tokenAAmount":30000000.0,"tokenB":"","tokenBName":"ADA","tokenBAmount":142950000.0,"hash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9"}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/wallet/value/trended":{"get":{"tags":["Wallet"],"summary":"Portfolio trended value","description":"A wallet's total value at sampled points in time, oldest first. Each point values the ADA and fungible tokens the wallet held at that moment using the price and FX rate as of that moment, then reports the total in the quote currency. Fungible-only: LP and NFT holdings contribute nothing. The series is anchored on the newest indexed price bar, not on wall-clock now; an unknown or empty wallet still gets a point per sample, with value 0, and an empty array comes back only when no price data is indexed at all.","operationId":"wallet_value_trended_api_v2_taptools_wallet_value_trended_get","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","description":"A Cardano payment address (`addr1...`) or stake address (`stake1...`). A stake address is expanded to the whole wallet delegating to it; a payment address covers that address alone. An address with no on-chain history yields an empty result, not a 404.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"],"title":"Address"},"description":"A Cardano payment address (`addr1...`) or stake address (`stake1...`). A stake address is expanded to the whole wallet delegating to it; a payment address covers that address alone. An address with no on-chain history yields an empty result, not a 404."},{"name":"timeframe","in":"query","required":false,"schema":{"type":"string","description":"Span of the returned series, which also sets the sampling step: `24h` (hourly), `7d` / `30d` (daily), `90d` (3-daily), `180d` / `1y` (weekly), or `all` (monthly, capped at 120 points). An unrecognised value falls back to the `30d` profile rather than erroring.","examples":["30d"],"default":"30d","title":"Timeframe"},"description":"Span of the returned series, which also sets the sampling step: `24h` (hourly), `7d` / `30d` (daily), `90d` (3-daily), `180d` / `1y` (weekly), or `all` (monthly, capped at 120 points). An unrecognised value falls back to the `30d` profile rather than erroring."},{"name":"quote","in":"query","required":false,"schema":{"type":"string","description":"Currency the returned values are denominated in: `ADA`, `USD`, `EUR`, `BTC` or `ETH` (case-insensitive). Anything else is rejected with `400 unsupported quote currency`.","examples":["ADA"],"default":"ADA","title":"Quote"},"description":"Currency the returned values are denominated in: `ADA`, `USD`, `EUR`, `BTC` or `ETH` (case-insensitive). Anything else is rejected with `400 unsupported quote currency`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PortfolioValuePoint"},"title":"Response Wallet Value Trended Api V2 Taptools Wallet Value Trended Get"},"example":[{"time":1781568000,"value":18230.42},{"time":1781654400,"value":18774.1}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/handle/{name}":{"get":{"tags":["Handle"],"summary":"ADA Handle holder","description":"Resolve an ADA Handle to its current holding address (SteelSwap extension).","operationId":"resolve_handle_api_v2_taptools_handle__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","description":"ADA Handle name (without the `$`).","examples":["snek"],"title":"Name"},"description":"ADA Handle name (without the `$`)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandleResolution"},"example":{"name":"snek","address":"addr1xyjku7agjy54xn74eg9gm2htzpcaeyg88gzpcs79zfh5ypt9xe607rgsksyr38s0mjjln8uscyvkt9xsz0zw35lwmjyqs3zfqa","stake":"stake179jnva8lp5gtgzpcnc8aef0en7gvzxt9jngp838g60hdezqcjuu4l"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/dex/stats":{"get":{"tags":["DEX Stats"],"summary":"Per-DEX statistics leaderboard (SteelSwap extension)","description":"**SteelSwap extension** (not part of the TapTools API). Per-DEX volume, TVL, transactions, active addresses, batcher fees and active pools over a rolling window, plus derived market share, change vs the previous window, average trade size and turnover. All ADA amounts are measured over ADA-paired pools, and the window is anchored on the newest indexed candle rather than on wall-clock now. Returns an empty `dexes` array when no price data is indexed yet.","operationId":"dex_stats_api_v2_taptools_dex_stats_get","parameters":[{"name":"window","in":"query","required":false,"schema":{"type":"string","pattern":"^(24h|7d|30d)$","description":"Rolling window: `24h`, `7d` or `30d`. Anything else is rejected by validation. `24h` and `7d` are computed from hourly candles, `30d` from daily ones.","examples":["24h"],"default":"24h","title":"Window"},"description":"Rolling window: `24h`, `7d` or `30d`. Anything else is rejected by validation. `24h` and `7d` are computed from hourly candles, `30d` from daily ones."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(volume|tvl|transactions)$","description":"Metric the leaderboard is ranked by, highest first: `volume`, `tvl` or `transactions`.","examples":["volume"],"default":"volume","title":"Sort"},"description":"Metric the leaderboard is ranked by, highest first: `volume`, `tvl` or `transactions`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DexStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/dex/{dex_key}/history":{"get":{"tags":["DEX Stats"],"summary":"Per-DEX daily history (SteelSwap extension)","description":"**SteelSwap extension** (not part of the TapTools API). One daily point per metric — volume, TVL, transactions, active addresses and batcher fees — for a single DEX, oldest first. Days with no activity are present with value 0, so every series has exactly `days` points. The series ends at the newest indexed daily candle, not at today.","operationId":"dex_history_api_v2_taptools_dex__dex_key__history_get","parameters":[{"name":"dex_key","in":"path","required":true,"schema":{"type":"string","description":"The DEX identifier, exactly as `dexKey` is returned by `/dex/stats`. An unrecognised key yields all-zero series rather than a 404.","examples":["Minswap"],"title":"Dex Key"},"description":"The DEX identifier, exactly as `dexKey` is returned by `/dex/stats`. An unrecognised key yields all-zero series rather than a 404."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Number of trailing days to return, 1-90.","examples":[14],"default":14,"title":"Days"},"description":"Number of trailing days to return, 1-90."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DexHistory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/taptools/nft/asset/sales":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_asset_sales_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/asset/stats":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_asset_stats_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/asset/traits":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_asset_traits_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/assets":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_assets_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/holders/distribution":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_holders_distribution_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/holders/top":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_holders_top_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/holders/trended":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_holders_trended_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/info":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_info_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/listings":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_listings_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/listings/depth":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_listings_depth_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/listings/individual":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_listings_individual_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/listings/trended":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_listings_trended_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/ohlcv":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_ohlcv_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/stats":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_stats_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/stats/extended":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_stats_extended_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/trades":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_trades_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/trades/stats":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_trades_stats_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/traits/price":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_traits_price_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/traits/rarity":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_traits_rarity_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/traits/rarity/rank":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_traits_rarity_rank_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/collection/volume/trended":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_collection_volume_trended_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/market/stats":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_market_stats_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/market/stats/extended":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_market_stats_extended_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/market/volume/trended":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_market_volume_trended_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/marketplace/stats":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_marketplace_stats_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/top/timeframe":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_top_timeframe_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/top/volume":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_top_volume_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/nft/top/volume/extended":{"get":{"tags":["NFT"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_nft_top_volume_extended_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/token/debt/loans":{"get":{"tags":["Token"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_token_debt_loans_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/taptools/token/debt/offers":{"get":{"tags":["Token"],"summary":"Not implemented (deferred)","description":"A TapTools path SteelSwap recognises but does not implement. It always returns `501 Not Implemented`, never data and never a `404` — the path is registered precisely so a drop-in client can tell \"unsupported endpoint\" apart from \"wrong URL\". Retrying will not change the result — source this data elsewhere.","operationId":"_not_implemented_api_v2_taptools_token_debt_offers_get","responses":{"501":{"description":"Always. The body is `{\"detail\": \"Recognised TapTools endpoint; not yet implemented by SteelSwap.\"}`.","content":{"application/json":{"schema":{}}}}}}},"/api/v2/atc/orders/build":{"post":{"tags":["ATC"],"summary":"Place a limit order (build an unsigned CREATE)","description":"Build an unsigned CREATE that places a resting limit order.\n\nThe order escrows ``offer`` and rests until filled at the implied limit\nprice ``ask/offer`` (or better) or closed by its owner. The returned\n``txCbor`` is unsigned — the owner's wallet signs and submits it (CIP-30).","operationId":"build_create_api_v2_atc_orders_build_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/atc/orders":{"get":{"tags":["ATC"],"summary":"List open limit orders, or an owner's order history","description":"List limit orders — the open book, or one owner's full history.\n\nWithout ``owner``: open (OPEN/LIMIT) orders across all owners. With\n``owner``: that owner's full history — OPEN/LIMIT/CANCELLED/FILLED.\n``owner`` is a bech32 address; ownership is keyed on its STAKING\ncredential, so a base (``addr1…``) or stake (``stake1…``) address carrying\nthe wallet's staking part selects the same orders. A malformed ``owner``,\nor one with no staking part (enterprise), → 400.\n\nNewest first (block slot descending). ``limit`` bounds the SQL read, which\nruns BEFORE the per-row mapping drops non-ADA-paired and undecodable orders —\nso a response may hold fewer than ``limit`` orders while more exist.","operationId":"list_orders_api_v2_atc_orders_get","parameters":[{"name":"owner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/atc/orders/{order_id}":{"get":{"tags":["ATC"],"summary":"Get one limit order","description":"One limit order by ``tx_hash#index`` (URL-encode ``#`` as ``%23``).","operationId":"get_order_api_v2_atc_orders__order_id__get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderListItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/atc/orders/{order_id}/close/build":{"post":{"tags":["ATC"],"summary":"Collect or cancel a limit order (build an unsigned CLOSE)","description":"Build an unsigned CLOSE — collect a filled order's proceeds, or cancel.\n\nOnly the order owner can close: the transaction requires the signature of\nthe staking credential the order was placed with, so ``ownerAddress`` must\ncarry that same staking part. The wallet signs and submits ``txCbor``.","operationId":"build_close_api_v2_atc_orders__order_id__close_build_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildCloseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildCloseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/atc/quote":{"get":{"tags":["ATC"],"summary":"Recommended limit price for an ADA-paired order","description":"Quote a limit price for a token against ADA.\n\nOpen like the rest of the ATC family (no auth gate).\nOne leg must be ADA. A configured hedge unit is priced off the live Coinbase\nADA-USD book; every other token is priced from the aggregate on-chain price.\nBoth legs must have known decimals — the session resolves them from the token\nregistry — else 422, as for a pair with no on-chain price at all. An upstream\nCoinbase failure on a cold cache miss surfaces as 503 (timeout) / 502 (other);\nthe cache itself fails open to a live fetch. An indexer that trails the chain\nis 503 — note that a QUIET pair is not stale, so a large ``ageS`` is a 200.","operationId":"quote_api_v2_atc_quote_get","parameters":[{"name":"offerUnit","in":"query","required":true,"schema":{"type":"string","title":"Offerunit"}},{"name":"offerAmount","in":"query","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"Offeramount"}},{"name":"askUnit","in":"query","required":true,"schema":{"type":"string","title":"Askunit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/cip8/challenge":{"post":{"tags":["Authentication"],"summary":"Request Challenge","description":"Issue a CIP-8 challenge for ``address`` (open to any wallet).\n\nReturns the challenge fields and the canonical message to sign; the wallet\nsigns the message and submits the result to ``/cip8/verify`` within the\nchallenge TTL. The address is validated by deriving its identity, which\nrejects an unparseable address or a wrong-network tag with a bare 400.","operationId":"request_challenge_api_v2_auth_cip8_challenge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChallengeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChallengeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/cip8/verify":{"post":{"tags":["Authentication"],"summary":"Verify Signature","description":"Verify a signed challenge and mint a renewable JWT token pair.\n\nOn success the nonce is consumed and an HS256 **access JWT** + an opaque\n**refresh token** are minted for the derived stake-credential identity. The\nJWT is the login credential for the key-management endpoints (``/auth/keys*``\nvia ``require_cip8_session``); it is NOT a data credential, so no\nDB access row is provisioned here. Any verification failure — tampered\nmessage, replayed nonce, wrong domain/action, wrong-network address, bad\nsignature — collapses to a **bare 401** (no cause leaked, no pre-auth 403).","operationId":"verify_signature_api_v2_auth_cip8_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/steelswap__api__auth__routers__cip8__TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/refresh":{"post":{"tags":["Authentication"],"summary":"Refresh","description":"Rotate a refresh token into a fresh access + refresh pair.\n\nA live refresh token is consumed and replaced (same family). A consumed\n(already-rotated) token, an unknown token, or a token whose family was revoked\nall collapse to a **bare 401** — and presenting a consumed token additionally\nREVOKES THE WHOLE FAMILY (reuse detection). No cause is leaked.","operationId":"refresh_api_v2_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/steelswap__api__auth__routers__auth_tokens__TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/logout":{"post":{"tags":["Authentication"],"summary":"Logout","description":"Revoke the caller's session: denylist the access ``jti`` + kill the family.\n\nAuthenticated by the access JWT (``X-Session-Token`` or ``Bearer``). On a\nvalid token: add its ``jti`` to the denylist for the token's REMAINING TTL (so\nit stops working before ``exp``) and revoke the caller's refresh family (the\n``fam`` claim). A missing / invalid / refresh (non-JWT) token → **401** (a\nrefresh token is opaque, so it fails the JWT verify and never logs anyone out).","operationId":"logout_api_v2_auth_logout_post","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/keys":{"post":{"tags":["Authentication"],"summary":"Generate a durable API key for the logged-in wallet","description":"Mint a durable key for the session's account (auto-provisioning on first key).\n\nResolves the account by the session's canonical stake credential, auto-\nprovisioning a ``Partner`` (with a ``tools-api-partner`` baseline scope) if none\nexists. If the account already has an ACTIVE key, returns **409** (\"revoke\nfirst\"). On success the plaintext ``<prefix>.<secret>`` is returned **exactly\nonce** with ``Cache-Control: no-store`` (never stored, never re-shown).","operationId":"generate_key_api_v2_auth_keys_post","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintedKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Authentication"],"summary":"List the logged-in wallet's API keys","description":"List the account's keys (prefix + status + timestamps; never the secret).","operationId":"list_keys_api_v2_auth_keys_get","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyListItem"},"title":"Response List Keys Api V2 Auth Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/keys/{prefix}":{"delete":{"tags":["Authentication"],"summary":"Revoke one of the logged-in wallet's API keys","description":"Revoke the account's key matching ``prefix`` (404 if unknown / not theirs).","operationId":"revoke_key_api_v2_auth_keys__prefix__delete","parameters":[{"name":"prefix","in":"path","required":true,"schema":{"type":"string","title":"Prefix"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/partner":{"get":{"tags":["Authentication"],"summary":"View the caller's partner account","description":"Return the caller's profile (resolved via CIP-8 session OR durable key).","operationId":"get_partner_api_v2_auth_partner_get","parameters":[{"name":"partner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account.","title":"Partner"},"description":"Slug of the partner account to read, for OWNER and ADMIN callers only — they must pass it (``400`` without it, ``404`` if unknown). A partner's own session or API key already resolves to that partner's own account, so this value is IGNORED for them and can never be used to read another account."},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``.","title":"X-Session-Token"},"description":"Wallet-session token from a completed CIP-8 login. Send this or a durable API key — either identifies the caller. Omitting every credential is ``401``; a session whose wallet has no account is ``404``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Authentication"],"summary":"Edit the logged-in wallet's display fields","description":"Apply the supplied display fields to the account, then return the profile.\n\nOnly ``name`` / ``description`` / ``metadata_lines`` are writable; the model's\n``extra='forbid'`` turns any other field into a 422. Fee/commercial terms and\n``reward_address`` are intentionally not editable here.\n\n``name`` is additionally frozen for a **fee-collecting** account (one with an\nHD ``account_index``): it is the on-chain CIP-20 ``Partner: <name>`` tag that\nattributes that account's fees, so renaming would orphan its historical fee\nanalytics. Such a rename must be coordinated with the fee path, so it is\nrejected here (``409``); ``description`` / ``metadata_lines`` stay editable.","operationId":"update_partner_api_v2_auth_partner_patch","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/partners":{"get":{"tags":["Authentication"],"summary":"List every partner account (admin oversight)","description":"Every partner's config + status (newest first).\n\nDrill into one via ``?partner=<slug>`` on the ``/api/v2/fees/*`` reads for that\npartner's account status, payout history, and fee analytics.","operationId":"list_partners_api_v2_auth_admin_partners_get","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PartnerSummary"},"title":"Response List Partners Api V2 Auth Admin Partners Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Authentication"],"summary":"Provision a new integration partner (mints a fresh key)","description":"Create the ``Partner`` + baseline scope + a freshly minted key, atomically.\n\n409 on a duplicate slug or HD account_index; 422 on a bad fee split or a\nmalformed/enterprise maintenance address; 500 if this deployment has no fee\nmnemonic configured. The plaintext key is returned **exactly once** with\n``Cache-Control: no-store``.","operationId":"create_partner_api_v2_auth_admin_partners_post","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntegrationPartnerRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePartnerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/revenue-per-hit":{"get":{"tags":["Authentication"],"summary":"Rank partners by revenue per million API hits (abuse detection)","description":"Partners ranked ascending by revenue per million API hits.\n\nSurfaces low-yield (high-volume, low-revenue) keys for review — detection only,\nno enforcement. Query params override the configured ``abuse_rev_*`` defaults\n(bounded so out-of-range input is a clean 422, not a 500); ``limit`` truncates\nto the N lowest-yield partners. The numerator is the fee EACH build charges,\nso the ratio is meaningful for BOTH integration partners (partner\nfee) and self-serve durable keys (the SteelSwap service fee — a real, non-zero\ncharge on any routed build); only exclusively-single-direct-DEX keys yield ~0.\nForward-only: the ratio is meaningful only once a full window of built-fee data\nhas accrued; before then the distribution is all-zero and flags nobody.","operationId":"revenue_per_hit_view_api_v2_auth_admin_revenue_per_hit_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":90,"minimum":0},{"type":"null"}],"title":"Window Days"}},{"name":"min_hits","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Hits"}},{"name":"flag_percentile","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Flag Percentile"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PartnerYieldOut"},"title":"Response Revenue Per Hit View Api V2 Auth Admin Revenue Per Hit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/service-plans":{"get":{"tags":["Authentication"],"summary":"List catalog service plans","description":"Every catalog plan, newest first.\n\nRetired plans are hidden unless ``include_inactive=true``.","operationId":"list_service_plans_api_v2_auth_admin_service_plans_get","parameters":[{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Inactive"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ServicePlanOut"},"title":"Response List Service Plans Api V2 Auth Admin Service Plans Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Authentication"],"summary":"Create a new catalog service plan","description":"Create a catalog plan.\n\n409 if ``name`` is already taken (active or inactive); 422 on an invalid\nscope glob.","operationId":"create_service_plan_api_v2_auth_admin_service_plans_post","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicePlanCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicePlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/service-plans/{name}":{"get":{"tags":["Authentication"],"summary":"Get one catalog service plan by name","description":"404 if no plan with this name exists.\n\nActive or inactive — admins can view a retired plan.","operationId":"get_service_plan_by_name_api_v2_auth_admin_service_plans__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicePlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Authentication"],"summary":"Edit a catalog service plan (partial update)","description":"Apply a partial update to a catalog plan.\n\nOnly fields present in the request body are applied. 404 if unknown; 422\non an invalid scope glob.","operationId":"update_service_plan_api_v2_auth_admin_service_plans__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicePlanUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicePlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/service-plans/{name}/deactivate":{"post":{"tags":["Authentication"],"summary":"Deactivate a catalog service plan (existing grants are unaffected)","description":"Deactivate a catalog plan.\n\nFlips ``is_active=False`` so the plan is hidden from future provisioning;\npartners already granted this plan keep their limits (copied at grant\ntime). 404 if unknown.","operationId":"deactivate_service_plan_api_v2_auth_admin_service_plans__name__deactivate_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicePlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/partners/{partner_id}/grant-plan":{"post":{"tags":["Authentication"],"summary":"Grant a catalog plan to a partner","description":"Provision ``body.plan`` to ``partner_id`` from its catalog template.\n\n404 if the partner or the (active) catalog plan does not exist. Idempotent\nper ``(partner, glob)`` — granting the same plan again, or switching a\npartner to a different plan, overwrites the matching rows in place (see\n:func:`steelswap.api.auth.services.grant_plan`).","operationId":"grant_plan_to_partner_api_v2_auth_admin_partners__partner_id__grant_plan_post","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"integer","title":"Partner Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantPlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantPlanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/partners/{partner_id}/keys/rotate":{"post":{"tags":["Authentication"],"summary":"Issue a fresh key for a partner, revoking any existing active one","description":"404 if the partner does not exist.\n\nSafe to call whether or not the partner currently has an active key\n(issues the first key, or rotates).","operationId":"rotate_partner_key_endpoint_api_v2_auth_admin_partners__partner_id__keys_rotate_post","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"integer","title":"Partner Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintedKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/partners/{partner_id}/keys":{"get":{"tags":["Authentication"],"summary":"List a partner's API keys (owner)","description":"List a partner's keys as safe views (prefix + status + timestamps).\n\nNever the secret/hash. ``404`` if the partner does not exist.","operationId":"list_partner_keys_endpoint_api_v2_auth_admin_partners__partner_id__keys_get","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"integer","title":"Partner Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyView"},"title":"Response List Partner Keys Endpoint Api V2 Auth Admin Partners  Partner Id  Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/partners/{partner_id}/keys/{prefix}":{"delete":{"tags":["Authentication"],"summary":"Revoke a partner's API key by prefix (owner)","description":"Soft-revoke (``is_active=False``). 404 if the partner or the key is unknown.","operationId":"revoke_partner_key_endpoint_api_v2_auth_admin_partners__partner_id__keys__prefix__delete","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"integer","title":"Partner Id"}},{"name":"prefix","in":"path","required":true,"schema":{"type":"string","title":"Prefix"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/anon-plan":{"get":{"tags":["Authentication"],"summary":"Read the anonymous / public-tier plan (owner)","description":"The current anon plan — the singleton row, or settings-derived defaults.","operationId":"get_anon_plan_endpoint_api_v2_auth_admin_anon_plan_get","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonPlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Authentication"],"summary":"Modify the anonymous / public-tier plan (owner)","description":"Partial update of the anon plan (takes effect on the next mint).\n\nAn explicit ``daily_quota: null`` means unlimited; ``enabled: false`` turns\nanonymous access off.","operationId":"update_anon_plan_endpoint_api_v2_auth_admin_anon_plan_patch","parameters":[{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonPlanUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonPlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/partners/{partner_id}":{"get":{"tags":["Authentication"],"summary":"Get one partner account by id","description":"404 if no partner with this id exists.","operationId":"get_partner_api_v2_auth_admin_partners__partner_id__get","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"integer","title":"Partner Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Authentication"],"summary":"Modify any field of a partner account (owner)","description":"Partial update of a partner/subscription.\n\nOmitted fields are unchanged; explicit ``null`` clears a nullable field.\n``404`` if unknown; ``422`` on invalid merged values (fee-split out of range,\nan un-decodable address, an integration partner with no fee address); ``409``\non a duplicate account_index.","operationId":"update_partner_endpoint_api_v2_auth_admin_partners__partner_id__patch","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"integer","title":"Partner Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerAdminUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Authentication"],"summary":"Deactivate (soft) a partner account (owner)","description":"Soft-delete a partner: set ``is_active=False`` (payout/fee history preserved).\n\n``404`` if unknown. Equivalent to ``PATCH {is_active: false}``.","operationId":"deactivate_partner_endpoint_api_v2_auth_admin_partners__partner_id__delete","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"integer","title":"Partner Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/partners/{partner_id}/services":{"get":{"tags":["Authentication"],"summary":"List a partner's service (scope) rows","description":"404 if the partner does not exist.\n\nAn empty list if it has no scope rows (should not normally happen —\nevery partner gets a ``**`` baseline).","operationId":"list_partner_services_api_v2_auth_admin_partners__partner_id__services_get","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"integer","title":"Partner Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ServiceRowOut"},"title":"Response List Partner Services Api V2 Auth Admin Partners  Partner Id  Services Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/services/{service_id}/extend":{"post":{"tags":["Authentication"],"summary":"Bump a service row's expiry (renew a plan)","description":"Sets ``valid_until`` and re-activates the row (a renewed plan is live).\n\n404 if no service row has this id.","operationId":"extend_service_api_v2_auth_admin_services__service_id__extend_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendServiceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceRowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/admin/services/{service_id}/revoke":{"post":{"tags":["Authentication"],"summary":"Deactivate a service row","description":"Flips ``is_active=False`` (kept for audit, not deleted).\n\n404 if no service row has this id.","operationId":"revoke_service_api_v2_auth_admin_services__service_id__revoke_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}},{"name":"x-session-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``.","title":"X-Session-Token"},"description":"Wallet-session token from a CIP-8 login whose stake credential is allowlisted as an owner. Send this or the admin API key. A logged-in non-owner wallet is ``403``; no credential at all is ``401``."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceRowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dex/list/":{"get":{"tags":["V1 DEX"],"summary":"Dex List","description":"Sorted, de-duplicated list of supported DEX ids.\n\nThe values are dendrite ``dex()`` ids from the same DEX class set the\nsplitter routes over (``core.dispatch.DEX_CLASSES``) — e.g. ``MinswapV2``,\n``SundaeSwapV3``, ``WingRidersV2``, ``VyFi`` plus the router pseudo-DEXes\n``MinswapV2Router`` / ``SplashRouter`` — not ``DEX_REGISTRY`` display names.\nNew DEXes (Dano / CardanoSwaps / Djed / Shen) come along additively.","operationId":"dex_list_dex_list__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Dex List Dex List  Get"}}}}}}},"/swap/estimate/":{"post":{"tags":["V1 Swap"],"summary":"Estimate","description":"Quote a swap via the frozen V1 splitter.\n\nReturns a bare ``SplitOutput`` for a single-hop request, or a\n``HopSplitOutput`` when ``hop=true`` (V1's union response shape). The\n``steelswapFee`` is priced from the authenticated key's partner row.","operationId":"estimate_swap_estimate__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapEstimate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SplitOutput"},{"$ref":"#/components/schemas/HopSplitOutput"}],"title":"Response Estimate Swap Estimate  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/swap/build/":{"post":{"tags":["V1 Swap"],"summary":"Build","description":"Build an unsigned swap tx; return the raw ``{\"tx\", \"p\"}`` V1 dict.\n\nThe 8s ``asyncio.timeout`` bounds the (off-loop) build; on timeout the V1\n``408 \"Timeout\"`` is returned. ``InsufficientFundsError`` -> ``406\n\"Insufficient funds.\"``; any other build/validation failure -> ``406\n<str(exc)>``.","operationId":"build_swap_build__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildSwap"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"boolean"}]},"type":"object","title":"Response Build Swap Build  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/swap/cancel/":{"post":{"tags":["V1 Swap"],"summary":"Cancel","description":"Build the first-bucket cancel tx; return the bare quoted CBOR string.\n\nFastAPI serializes the returned ``str`` as a bare quoted JSON string (the V1\ncontract). Error mapping: no cancellable order -> ``422 \"No cancels to\nperform.\"``; no collateral -> ``422 \"No collateral found.\"``; a Spectrum/CSWAP\nchange-address mismatch -> ``400``; any other build/validation failure ->\n``406`` with the fixed support message.","operationId":"cancel_swap_cancel__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/steelswap__api__v1__schemas__CancelRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Cancel Swap Cancel  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tokens/price/usd/":{"post":{"tags":["V1 Tokens"],"summary":"Price Usd","description":"USD price of lovelace, in millionths (V1: lovelace-only).","operationId":"price_usd_tokens_price_usd__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Price Usd Tokens Price Usd  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tokens/find-pairs/":{"post":{"tags":["V1 Tokens"],"summary":"Find Pairs","description":"Tokens tradeable against ``token`` (V1 TokenSummary rows, no Nike row).","operationId":"find_pairs_tokens_find_pairs__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TokenSummary"},"type":"array","title":"Response Find Pairs Tokens Find Pairs  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tokens/pools/":{"post":{"tags":["V1 Tokens"],"summary":"Pools","description":"Per-DEX aggregate liquidity + reserve-ratio for a pair.","operationId":"pools_tokens_pools__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolPair"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tokens/orders/":{"post":{"tags":["V1 Tokens"],"summary":"Orders","description":"Recent orders for a pair, grouped into V1 ``OrderStatus`` envelopes.\n\nPair-scoped reuse of the wallet-history grouping (STEEL-354): the same\nflat order rows ``build_order_statuses`` consumes, filtered to the pair\ninstead of a wallet. ``page``/``lastPage`` are 0 (single capped page).","operationId":"orders_tokens_orders__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolPairOrders"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tokens/list/":{"get":{"tags":["V1 Tokens"],"summary":"Tokens List","description":"Verified-token catalog (volume-DESC), V1 shape, + the disguised anon carrier.\n\nReturns the verified-token catalog followed by ONE disguised sentinel row\n(:func:`_anon_carrier_row`) carrying a freshly minted UI-anon credential\n(STEEL-167). The sentinel is always the LAST element; the real catalog rows\nprecede it unchanged. This endpoint is a GET and the V1 gate governs POSTs\nonly, so it is reachable WITHOUT a credential — it is the anonymous-access\ndoor (it hands out the credential).","operationId":"tokens_list_tokens_list__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TokenSummary"},"type":"array","title":"Response Tokens List Tokens List  Get"}}}}}}},"/tokens/icon/{token}/":{"get":{"tags":["V1 Tokens"],"summary":"Token Icon","description":"Static ADA/NIGHT PNG; else base64 -> image/png; URL/path -> 302; else null.","operationId":"token_icon_tokens_icon__token___get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wallet/history/":{"post":{"tags":["V1 Wallet"],"summary":"History","description":"Per-wallet order history grouped by submit tx (all states), paginated.","operationId":"history_wallet_history__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapHistoryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wallet/pending/":{"post":{"tags":["V1 Wallet"],"summary":"Pending","description":"The wallet's open-set orders (OPEN/LIMIT/QUEUED/MEMPOOL).","operationId":"pending_wallet_pending__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapHistoryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wallet/submitted/":{"post":{"tags":["V1 Wallet"],"summary":"Submitted","description":"No-op (200 + null) — the pre-chain pending sink is part of the build epic.","operationId":"submitted_wallet_submitted__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TxHash"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccountStatusResponse":{"properties":{"feeAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feeaddress"},"balance":{"type":"string","title":"Balance"},"claimable":{"type":"string","title":"Claimable"},"held":{"type":"string","title":"Held"},"threshold":{"type":"string","title":"Threshold"},"shouldDistribute":{"type":"boolean","title":"Shoulddistribute"}},"type":"object","required":["feeAddress","balance","claimable","held","threshold","shouldDistribute"],"title":"AccountStatusResponse","description":"Live status of a fee-collection account — what is payable right now.\n\nAll four amounts are **lovelace** decimal strings. ``claimable`` is the\nlovelace sitting at the account's fee address whose co-generated orders have\nall resolved — what a disbursement would actually pay out; ``held`` is the\nremainder still tied up in resting orders; ``balance`` is their sum, the gross\nunspent at the address. ``threshold`` is the account's disbursement threshold\n(its own setting, or the platform default of 500 ADA = ``\"500000000\"``), and\n``shouldDistribute`` is exactly ``claimable >= threshold`` — the threshold gate\nonly. It does not mean a payout is imminent: an account may additionally be on\na daily / weekly / monthly payout schedule that decides *when* it pays.\n\n``feeAddress`` is ``null`` for an account with no fee stream of its own, and\nwhen the address cannot be derived; every amount is then ``\"0\"`` and\n``shouldDistribute`` is ``false``.","example":{"balance":"182450000","claimable":"164200000","feeAddress":"addr1qyzpj7f89x9vxvmjrepwf68nyz8e4pyw0s086kjzwm9u0xt34h2m9ujcp594lmapd0nj8wzfmgc3efgymg6vvpuah8es2l4wmf","held":"18250000","shouldDistribute":false,"threshold":"500000000"}},"AdaPrice":{"properties":{"quote":{"type":"string","title":"Quote"},"price":{"type":"number","title":"Price"},"change24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change24H"},"asOf":{"type":"integer","title":"Asof"}},"type":"object","required":["quote","price","asOf"],"title":"AdaPrice","description":"The price of 1 ADA in a quote currency (an fx rate), with 24h change.\n\n``quote`` is the upper-case currency code; ``price`` is the live spot;\n``change24h`` is the fractional move vs ~24h ago (omitted when there is no prior\nfx bar); ``asOf`` is the unix-second the spot was read."},"AddressAsset":{"properties":{"unit":{"type":"string","title":"Unit"},"value":{"type":"string","title":"Value"}},"type":"object","required":["unit","value"],"title":"AddressAsset","description":"A native asset held at an address; ``value`` is base units as a string."},"AddressInfo":{"properties":{"address":{"type":"string","title":"Address"},"paymentCred":{"type":"string","title":"Paymentcred"},"lovelace":{"type":"string","title":"Lovelace"},"assets":{"items":{"$ref":"#/components/schemas/AddressAsset"},"type":"array","title":"Assets"},"stakeAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stakeaddress"}},"type":"object","required":["address","paymentCred","lovelace","assets"],"title":"AddressInfo","description":"Aggregate ADA and native-asset holdings at an address.","example":{"address":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","assets":[{"unit":"08fa422e42f84bd3c274f82452f6395215824f7795cd621b2fcc48fd724f5054","value":"1"},{"unit":"1ad4f068a49bbf0d4f05335cadeca0519cef34cc1b2bc35b2e5739ae434f434b","value":"1515997"},{"unit":"1ddcb9c9de95361565392c5bdff64767492d61a96166cb16094e54be4f5054","value":"20275083454"}],"lovelace":"323455390","paymentCred":"68daa2abfd7e7ff5c92cc919865190e2593a7cce6374e9c4ce6e093a","stakeAddress":"stake1u8ghqrk4ug768sy0qlrv69qxv3aezw9lt98tp4akkfuw44cf55jye"}},"AmmSwapLeg":{"properties":{"dex":{"type":"string","title":"Dex","description":"The exchange this leg executed on, as a display label — ``Minswap``, ``SundaeSwapV3``, ``GeniusYield``, ``Djed``. Djed and Shen share one venue on chain and are labelled apart here by the token that moved."},"txHash":{"type":"string","title":"Txhash","description":"Hash of the transaction this leg itself lives in. For an order the wallet opened directly that is the group's own ``txHash``; for a continuation or a cross-protocol forward it is the later transaction that created it."},"status":{"type":"string","title":"Status","description":"This one execution's on-chain status — ``OPEN``, ``LIMIT``, ``FILLED``, ``CANCELLED``, ``ERROR``. It is not the group's aggregate ``status``: a filled leg can sit inside a group that is still ``PARTIALLY_FILLED``."},"offer":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"What this leg put in — the offered token and its base-unit amount."},"received":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"What this leg took out. When the exact settled amount was not recorded on chain this falls back to the amount the order asked for, so read it as a lower bound rather than an exact figure."},"fillReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fillreason","description":"Why the leg is in its current state, when a reason was recorded — for example ``BELOW_ASK`` for a limit order still above the market, ``INSUFFICIENT_LIQUIDITY`` or ``EXPIRED``. Omitted when there is nothing to report."},"kind":{"type":"string","const":"ammSwap","title":"Kind","default":"ammSwap"},"poolId":{"type":"string","title":"Poolid","description":"Identifier of the pool the leg was filled against. An empty string when no pool has been recorded yet — an order still waiting to be filled, or a fill whose pool could not be resolved."}},"type":"object","required":["dex","txHash","status","offer","received","poolId"],"title":"AmmSwapLeg","description":"An execution against an AMM liquidity pool (``kind`` is ``ammSwap``).\n\nThis is also the fallback variant for an execution whose venue is not one of\nthe recognised order-book or mint-burn kinds.","example":{"dex":"Minswap","kind":"ammSwap","offer":{"amount":"60000000","unit":"lovelace"},"poolId":"6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2","received":{"amount":"48800000","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},"status":"FILLED","txHash":"3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f60718"}},"AnonPlanOut":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"daily_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Quota"},"key_ttl_seconds":{"type":"integer","title":"Key Ttl Seconds"},"reqs_per_sec":{"type":"number","title":"Reqs Per Sec"},"burst_multiplier":{"type":"number","title":"Burst Multiplier"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"}},"type":"object","required":["enabled","key_ttl_seconds","reqs_per_sec","burst_multiplier","scopes"],"title":"AnonPlanOut","description":"The anonymous / public-tier plan (owner view)."},"AnonPlanUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"daily_quota":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Daily Quota","description":"null = unlimited."},"key_ttl_seconds":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Key Ttl Seconds"},"reqs_per_sec":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Reqs Per Sec"},"burst_multiplier":{"anyOf":[{"type":"number","minimum":1.0},{"type":"null"}],"title":"Burst Multiplier"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Path-globs granted to anon keys."}},"additionalProperties":false,"type":"object","title":"AnonPlanUpdate","description":"Owner partial-update of the anon plan — omit = unchanged."},"ApiKeyListItem":{"properties":{"prefix":{"type":"string","title":"Prefix","description":"Durable lookup prefix."},"is_active":{"type":"boolean","title":"Is Active","description":"False once revoked."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the key was minted (UTC)."},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At","description":"When the key was revoked (UTC), if at all."},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At","description":"Last time the key authenticated a request (UTC), if any."}},"type":"object","required":["prefix","is_active","created_at"],"title":"ApiKeyListItem","description":"A safe listing of one durable key — never the secret or the hash."},"ApiKeyView":{"properties":{"prefix":{"type":"string","title":"Prefix"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["prefix","is_active","created_at"],"title":"ApiKeyView","description":"A safe projection of an :class:`ApiKey` for listing (never the secret/hash).\n\nDeliberately omits ``api_key_hash`` and never carries the plaintext — only the\npublic lookup prefix, status, and timestamps."},"AssembleFees":{"properties":{"batcher":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Total batcher fee across all legs, in lovelace."},"deposit":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Total refundable order deposit across all legs, in lovelace."},"service":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"The SteelSwap or partner fee this transaction charges, in lovelace; ``0`` when the swap is fee-free."}},"type":"object","required":["batcher","deposit"],"title":"AssembleFees","description":"The fees the assembled transaction carries. You compute the network fee.\n\nThese mirror the fees a quote reports and are already reflected in ``outputs``;\nthey are listed so you can display or reconcile them."},"AssembleInput":{"properties":{"ref":{"type":"string","title":"Ref","description":"The UTxO to spend, as ``txHash#index``.","examples":["754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9#1"]},"address":{"type":"string","title":"Address","description":"The address that holds the UTxO (bech32)."},"value":{"additionalProperties":{"type":"string"},"type":"object","title":"Value","description":"The UTxO's contents as ``{unit: baseUnitAmount}``, amounts as decimal strings. ADA is keyed ``\"lovelace\"``."},"datum":{"$ref":"#/components/schemas/DatumBlock","description":"The datum attached to the UTxO."},"script":{"anyOf":[{"$ref":"#/components/schemas/ScriptBlock"},{"type":"null"}],"description":"The validator locking the UTxO. Omitted for an input that is not script-locked."},"redeemer":{"anyOf":[{"$ref":"#/components/schemas/RedeemerBlock"},{"type":"null"}],"description":"The redeemer authorising the spend. Omitted for an input that is not script-locked."}},"type":"object","required":["ref","address","value","datum"],"title":"AssembleInput","description":"An input you must include and spend.\n\nOnly SteelSwap-side script and order inputs are listed. Funding inputs,\ncollateral and change are yours to add."},"AssembleOutput":{"properties":{"address":{"type":"string","title":"Address","description":"Where the output pays to (bech32)."},"value":{"additionalProperties":{"type":"string"},"type":"object","title":"Value","description":"The output's contents as ``{unit: baseUnitAmount}``, amounts as decimal strings. ADA is keyed ``\"lovelace\"``."},"datum":{"$ref":"#/components/schemas/DatumBlock","description":"The datum to attach to the output."},"legId":{"type":"string","title":"Legid","description":"Stable handle for this output. Output-index patches resolve against it."}},"type":"object","required":["address","value","datum","legId"],"title":"AssembleOutput","description":"An output you must create, in the order given here.\n\nKeep this relative order; you may interleave your own outputs between them,\nbecause patches locate these outputs by identity rather than by position."},"AssembleResponse":{"properties":{"network":{"type":"string","title":"Network","description":"The network the blocks are built for."},"ttl":{"type":"integer","title":"Ttl","description":"Absolute slot after which the transaction is invalid. Derived from the chain tip and the request's ``ttlSeconds``."},"validityStart":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Validitystart","description":"Absolute slot before which the transaction is invalid."},"scriptIntegrity":{"$ref":"#/components/schemas/ScriptIntegrity","description":"The single Plutus version every script input here uses."},"requiredSigners":{"items":{"type":"string"},"type":"array","title":"Requiredsigners","description":"Verification key hashes (hex) that must appear in the required-signers field. Empty when no leg demands one."},"referenceInputs":{"items":{"$ref":"#/components/schemas/ReferenceInput"},"type":"array","title":"Referenceinputs","description":"Read-only inputs to include so the ledger can resolve the on-chain validators."},"inputs":{"items":{"$ref":"#/components/schemas/AssembleInput"},"type":"array","title":"Inputs","description":"SteelSwap-side inputs to spend. Empty for a plain order-creation swap, which only creates outputs."},"outputs":{"items":{"$ref":"#/components/schemas/AssembleOutput"},"type":"array","title":"Outputs","description":"Outputs to create, in the order given."},"witnessDatums":{"items":{"$ref":"#/components/schemas/WitnessDatum"},"type":"array","title":"Witnessdatums","description":"Datum preimages to add to the witness set, for outputs that carry only a datum hash on-chain. Empty when every datum is inline."},"fees":{"$ref":"#/components/schemas/AssembleFees","description":"The fees this transaction carries, excluding the network fee."},"referenceTxCbor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referencetxcbor","description":"Reserved. Not currently populated — intended to carry our own canonical assembly for clients that only want to compare layouts."}},"type":"object","required":["network","ttl","scriptIntegrity","fees"],"title":"AssembleResponse","description":"The pieces of a swap transaction, for a client that assembles it itself.\n\nEverything SteelSwap-specific is here: the order outputs to create, the script\ninputs to spend, their redeemers, and the reference inputs and signers they\nneed. You add the funding inputs, the collateral, the change output and the\nnetwork fee, then balance and sign.\n\nTwo things are easy to get wrong. Redeemers carry OUR indices and must be\nre-indexed through their ``patches`` once your final input and output ordering\nis known. And any datum listed in ``witnessDatums`` must go into the witness\nset, or the order it belongs to cannot be filled.","example":{"fees":{"batcher":{"amount":"2000000","unit":"lovelace"},"deposit":{"amount":"2000000","unit":"lovelace"},"service":{"amount":"1000000","unit":"lovelace"}},"inputs":[],"network":"mainnet","outputs":[{"address":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","datum":{"cbor":"d8799f4100ff","kind":"inline"},"legId":"leg-0","value":{"lovelace":"104000000"}}],"referenceInputs":[{"plutusVersion":"v2","ref":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9#0"}],"requiredSigners":[],"scriptIntegrity":{"plutusVersion":"v2"},"ttl":156340210,"validityStart":156339610,"witnessDatums":[]}},"AssetInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"symbol":{"type":"string","title":"Symbol"},"totalSupply":{"type":"number","title":"Totalsupply"},"circulatingSupply":{"type":"number","title":"Circulatingsupply"}},"type":"object","required":["id","name","symbol","totalSupply","circulatingSupply"],"title":"AssetInfo","description":"Asset metadata and supply.\n\n``totalSupply`` and ``circulatingSupply`` are whole tokens where the registry\nknows the asset's decimals, and stay in base units when it does not. Supply\ncomes from the off-chain registry when present, otherwise from the on-chain\nnet mint. ``name`` and ``symbol`` are ``\"\"`` for an asset with no registry\nmetadata."},"AssetSupply":{"properties":{"supply":{"type":"integer","title":"Supply"}},"type":"object","required":["supply"],"title":"AssetSupply","description":"On-chain supply of a native asset, in base units.","example":{"supply":76715880000}},"BabelInfo":{"properties":{"available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Available","description":"Whether paying the fee in the input token is possible for this swap. ``false`` also covers a forced token payment that could not be arranged."},"applied":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applied","description":"Whether the fee is actually being paid in the input token."},"resolvedPath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolvedpath","description":"The resolved fee path: ``\"ada\"``, ``\"babel\"`` (paid in the input token) or ``\"allInclusive\"``."},"feeUnit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feeunit","description":"The unit the combined fee is charged in — the input token when the fee is paid in the token."},"feeAmount":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"title":"Feeamount","description":"The combined SteelSwap fee expressed in ``feeUnit``, with the service fee already folded in. Base units as a decimal string, or a decimal-adjusted number when the request used decimal amounts."}},"type":"object","title":"BabelInfo","description":"Whether the SteelSwap fee is paid in the input token instead of ADA.\n\nA token-rich, ADA-poor wallet can pay the fee in the token it is selling. The\nwhole block is omitted when that cannot apply — an ADA-input swap, or\n``babelFee`` set to ``none`` — and every field inside it is omitted when the\nendpoint that produced it did not compute that field.\n\nOn an estimate the block is a preview. Without ``addressSource`` it reports\nonly whether paying in the token is possible at all (``available``); with\n``addressSource`` the real fee path is resolved against the wallet, exactly as\nthe build would resolve it, and reported through ``applied`` and\n``resolvedPath``. On a build it reports what the transaction actually did. An\nestimate never fails because of this block — only a build does."},"BabelMode":{"type":"string","enum":["none","ifNeeded","force"],"title":"BabelMode","description":"How the combined SteelSwap fee is paid for a swap.\n\n- ``NONE`` (``\"none\"``) — the existing flow: the fee is paid in ADA only.\n- ``IF_NEEDED`` (``\"ifNeeded\"``, the default) — pay in ADA when the wallet has\n  enough ADA, otherwise pay in the input token (a babel parallel order) so a\n  token-rich / ADA-poor wallet can still swap.\n- ``FORCE`` (``\"force\"``) — always pay the fee in the input token, even when the\n  wallet has spare ADA."},"BatcherHealthResponse":{"properties":{"protocols":{"items":{"$ref":"#/components/schemas/BatcherProtocolStatus"},"type":"array","title":"Protocols"},"currentSlot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Currentslot"},"currentBlock":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Currentblock"},"currentAt":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Currentat"}},"type":"object","required":["protocols"],"title":"BatcherHealthResponse","description":"The ``GET /batcher/status`` body — per-protocol batcher health.\n\n``protocols`` carries one :class:`BatcherProtocolStatus` per tracked protocol,\nin ``TRACKED_PROTOCOLS`` order.\n\n``current_slot`` / ``current_block`` / ``current_at`` are the chain-tip\nsnapshot (slot / block_no / posix-ms of ``current_slot``) the live metrics are\nmeasured against; all Optional and omitted when absent."},"BatcherProtocolStatus":{"properties":{"protocol":{"type":"string","title":"Protocol"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"lastClearedSlot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lastclearedslot"},"lastClearedAt":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lastclearedat"},"demandCount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Demandcount"},"oldestDemandAgeBlocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Oldestdemandageblocks"},"oldestDemandAgeSeconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Oldestdemandageseconds"},"warnThresholdBlocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Warnthresholdblocks"},"downThresholdBlocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Downthresholdblocks"},"history":{"anyOf":[{"items":{"$ref":"#/components/schemas/BatcherStatusPoint"},"type":"array"},{"type":"null"}],"title":"History"}},"type":"object","required":["protocol"],"title":"BatcherProtocolStatus","description":"One tracked protocol's current batcher health.\n\n``status`` is the listener-derived ``BatcherStatus`` verbatim\n(``QUIET``/``HEALTHY``/``WARN``/``DOWN``); it is omitted when the protocol has\nnever been snapshotted (omit-don't-null).\n\nThe remaining fields are optional enrichment — omitted when absent, and plain\n``int`` on the wire (slots / posix-ms / counts / block ages, not token\nquantities):\n\n- ``last_cleared_slot`` — the per-DEX pool-move heartbeat slot\n  (``VirtualBatcher.last_pool_change_slot``); ``last_cleared_at`` its posix-ms.\n- ``demand_count`` — OPEN orders placed after the heartbeat.\n- ``oldest_demand_age_blocks`` — staleness in blocks (``== blocks_waiting``);\n  ``oldest_demand_age_seconds`` the ``current_slot - oldest_demand_slot`` gap.\n- ``warn_threshold_blocks`` / ``down_threshold_blocks`` — the resolved\n  per-protocol thresholds (config).\n- ``history`` — the bucketed status sparkline, only under ``?expand=history``."},"BatcherStatusPoint":{"properties":{"bucketStartSlot":{"type":"integer","title":"Bucketstartslot"},"ts":{"type":"integer","title":"Ts"},"status":{"type":"string","title":"Status"},"counts":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Counts"}},"type":"object","required":["bucketStartSlot","ts","status"],"title":"BatcherStatusPoint","description":"One bucket of the status-history sparkline.\n\nA bucket summarizes the worst observed status over a slot interval (status-page\nconvention — worst-wins, not an average). ``bucket_start_slot`` is the bucket's\n``MIN(slot)``; ``ts`` is its posix-ms (``slot_to_unix(bucket_start_slot) *\n1000``); ``status`` is the worst of ``DOWN > WARN > HEALTHY > QUIET`` seen in\nthe interval. ``counts`` is the per-status tally for a tooltip, omitted when\nabsent (omit-don't-null). All values are plain ``int`` on the wire — these\nare slots / posix-ms / counts, not token quantities."},"BlockInfo":{"properties":{"blockNumber":{"type":"integer","title":"Blocknumber"},"blockTimestamp":{"type":"integer","title":"Blocktimestamp"}},"type":"object","required":["blockNumber","blockTimestamp"],"title":"BlockInfo","description":"A block's height and its timestamp in unix seconds."},"BuildCloseRequest":{"properties":{"ownerAddress":{"type":"string","title":"Owneraddress","description":"Bech32 address carrying the SAME staking credential the order was placed with — that credential must sign the close."},"utxos":{"items":{"type":"string"},"type":"array","title":"Utxos","description":"Owner-wallet UTxOs for fees — CIP-30 ``cborHex`` strings from ``api.getUtxos()``."},"collateral":{"items":{"type":"string"},"type":"array","title":"Collateral","description":"Collateral UTxOs, same CIP-30 ``cborHex`` format (``api.getCollateral()``)."},"changeAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changeaddress","description":"Bech32 change address; defaults to ``ownerAddress``."},"addWithdrawal":{"type":"boolean","title":"Addwithdrawal","description":"Add a zero-lovelace withdrawal from the owner's reward account. Some CIP-30 wallets only attach the required staking-credential signature when the reward account appears in the transaction.","default":false}},"type":"object","required":["ownerAddress","utxos"],"title":"BuildCloseRequest","description":"Collect proceeds / cancel: spend the order, burn the beacons, reclaim."},"BuildCloseResponse":{"properties":{"txCbor":{"type":"string","title":"Txcbor"}},"type":"object","required":["txCbor"],"title":"BuildCloseResponse","description":"Unsigned CLOSE transaction."},"BuildCreateRequest":{"properties":{"ownerAddress":{"type":"string","title":"Owneraddress","description":"Bech32 address of the order owner. Its STAKING credential is the owner identity — stamped into the order and required to sign a later CLOSE. An address with no staking part (enterprise) is rejected."},"offer":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__AssetAmount","description":"What the order gives up — escrowed on-chain at placement."},"ask":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__AssetAmount","description":"What the order demands in return, in full."},"utxos":{"items":{"type":"string"},"type":"array","title":"Utxos","description":"Owner-wallet UTxOs that fund the order — CIP-30 ``cborHex`` strings as returned by ``api.getUtxos()``."},"collateral":{"items":{"type":"string"},"type":"array","title":"Collateral","description":"Collateral UTxOs, same CIP-30 ``cborHex`` format (``api.getCollateral()``)."},"changeAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changeaddress","description":"Bech32 change address; defaults to ``ownerAddress``."},"expiration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expiration","description":"Reserved — not supported yet; a set value is rejected."}},"type":"object","required":["ownerAddress","offer","ask","utxos"],"title":"BuildCreateRequest","description":"Place a resting limit order: offer one asset, ask another.\n\nThe implied limit price is ``ask/offer``; one leg must be ADA. The example\nbelow offers 500 ADA and asks 250 USDM (a 0.5 USDM/ADA limit).","examples":[{"ask":{"amount":250000000,"unit":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d"},"collateral":["82825820<tx hash>...<CIP-30 cborHex>"],"offer":{"amount":500000000,"unit":"lovelace"},"ownerAddress":"addr1q8m86q7jrk2zpvyrw36z7pcyw3rxlprus2nuv26e4645hguaxu4vu9jgkzf2duqwhxjtllwfvncwfjc7d28cft08er0s8zg99f","utxos":["82825820<tx hash>...<CIP-30 cborHex>"]}]},"BuildCreateResponse":{"properties":{"txCbor":{"type":"string","title":"Txcbor"},"order":{"$ref":"#/components/schemas/OrderSummary"}},"type":"object","required":["txCbor","order"],"title":"BuildCreateResponse","description":"Unsigned CREATE transaction + the resulting order summary."},"BuildRequest":{"properties":{"input":{"anyOf":[{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Input"},{"type":"null"}],"description":"Input-amount side: the asset and amount you offer. Pair it with ``outputUnit``; omit it when you fix the output instead."},"outputUnit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outputunit","description":"Input-amount side: the unit of the token you want to receive. Pair it with ``input``.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]},"inputUnit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inputunit","description":"Output-amount side: the unit of the token you offer. Pair it with ``output``.","examples":["lovelace"]},"output":{"anyOf":[{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Input"},{"type":"null"}],"description":"Output-amount side: the asset and amount you want to receive. Pair it with ``inputUnit``; omit it when you fix the input instead."},"ignore":{"items":{"type":"string"},"type":"array","title":"Ignore","description":"DEX brands to exclude from routing, matched against the ``id`` values returned by ``GET /dexes``. Empty (the default) excludes nothing; excluding every brand that can serve the pair yields no route.","default":[],"examples":[["Spectrum","MuesliSwap"]]},"allInclusive":{"type":"boolean","title":"Allinclusive","description":"Treat the ADA ``input`` amount as the TOTAL leaving the wallet: the batcher fee, the per-leg deposit, the SteelSwap service fee and a 1 ADA network buffer are netted out of it, and the remainder is the amount actually swapped — so the response's ``input`` is smaller than the amount sent. Supported only when the input side is fixed and the input token is ADA; any other shape is 422 ``all_inclusive_unsupported``, and a total too small to cover the overhead is 422 ``insufficient_input``.","default":false},"whale":{"type":"boolean","title":"Whale","description":"Reserved large-trade toggle. Accepted for compatibility but currently has no effect on the quote: the solver serves the same route either way.","default":false},"solverOverrides":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Solveroverrides","description":"Advanced per-request solver tuning. Keys that do not name a solver parameter are ignored; recognised ones override the server default for this request only. Leave it unset unless you are deliberately trading quote accuracy against latency."},"babelFee":{"$ref":"#/components/schemas/BabelMode","description":"How the combined SteelSwap fee is paid. ``none`` pays in ADA only; ``ifNeeded`` (the default) pays in ADA when the wallet holds enough and otherwise in the input token; ``force`` always pays in the input token. An ADA-input swap never pays in a token, so the ``babel`` block is omitted for it regardless of this value.","default":"ifNeeded"},"addressSource":{"type":"string","title":"Addresssource","description":"The swapper's wallet address (bech32). It funds the swap, owns the resulting order, and must own every entry in ``cancelUtxos``.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"]},"utxos":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Utxos","description":"The wallet's UTxOs as CBOR hex, used to fund the swap. Optional: when null or empty the server fetches ``addressSource``'s unspent outputs and builds on those."},"expectedOutput":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Input","description":"The output you were quoted, in the output token. Together with ``slippageBps`` it forms the floor the rebuilt swap must clear."},"expectedInput":{"anyOf":[{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Input"},{"type":"null"}],"description":"The input you were quoted, in the input token. REQUIRED on an output-amount build, where it becomes the ceiling the rebuilt input must stay under. Ignored on an input-amount build — omit it there."},"slippageBps":{"type":"integer","maximum":5000.0,"minimum":0.0,"title":"Slippagebps","description":"Slippage tolerance in basis points (100 = 1%), from 0 to 5000 (50%). It sets both the re-solve tolerance above and the per-leg minimum received written on-chain. The on-chain minimum is additionally clamped, so no tolerance can produce a fill-at-any-price order.","examples":[50]},"ttlSeconds":{"type":"integer","title":"Ttlseconds","description":"How long the transaction stays valid, in seconds from the current chain tip. Submit within this window or the transaction expires unspent.","default":600,"examples":[600]},"changeAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changeaddress","description":"Where change is returned. Defaults to ``addressSource``. When supplied it must belong to the same wallet — equal to ``addressSource`` or sharing its payment credential — otherwise the request is rejected with 422. Sharing only the stake credential does not qualify."},"collateral":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Collateral","description":"Collateral UTxOs as CBOR hex, for routes that spend a script. Only used when the server has no eligible collateral of its own; if neither side can supply it the build fails with 422 ``collateral_unavailable``."},"cancelUtxos":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderRef"},"type":"array"},{"type":"null"}],"title":"Cancelutxos","description":"Resting orders to cancel in the SAME transaction. Each ref names an order UTxO that ``addressSource`` owns; its reclaimed value helps fund the swap. All of them must share one Plutus script version, compatible with the swap's own — a mismatch is 422 ``mixed_script_version``, an order owned by another wallet is 422 ``cancel_owner_mismatch``, and a DEX whose in-swap cancel is not supported is 422 ``cancel_not_supported_in_build``. CSWAP and Spectrum cancels must return their value to the order's own source, so they cannot fund the swap. Omitted, null or empty builds an ordinary swap with no cancels."}},"type":"object","required":["addressSource","expectedOutput","slippageBps"],"title":"BuildRequest","description":"Body for ``POST /swap/build`` and ``POST /swap/assemble``.\n\nEverything ``POST /swap/estimate`` accepts, plus the fields needed to turn a\nquote into a transaction. Re-send the SAME side, units and amount you quoted:\nthe server re-solves against live pools rather than trusting a cached quote.\n\nSlippage protection runs on whichever side is not pinned:\n\n- the re-solved output must stay at or above\n  ``expectedOutput.amount * (10000 - slippageBps) / 10000``;\n- on an output-amount build the re-solved input must also stay at or below\n  ``expectedInput.amount * (10000 + slippageBps) / 10000``.\n\nEither breach is ``409 quote_changed``, whose body carries the fresh quote so a\nclient can re-price and retry without a second estimate call.\n\nThe fee is NOT a body field. It is derived from the authenticated caller — a\npartner key charges the partner's fee, anything else the standard SteelSwap\nservice fee — so it cannot be altered by the request.","example":{"addressSource":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","expectedOutput":{"amount":41000,"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},"input":{"amount":100000000,"unit":"lovelace"},"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","slippageBps":50,"ttlSeconds":600}},"BuildResponse":{"properties":{"txCbor":{"type":"string","title":"Txcbor","description":"The unsigned transaction as CBOR hex (abridged in the example), for the wallet to sign and submit."},"txHash":{"type":"string","title":"Txhash","description":"The transaction id, fixed at build time and unchanged by the wallet's signature.","examples":["754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9"]},"partialSign":{"type":"boolean","title":"Partialsign","description":"``true`` when the transaction already carries a SteelSwap witness — sign it with CIP-30 ``partialSign`` so the wallet ADDS its witness instead of replacing the witness set. Some routes require this."},"babel":{"anyOf":[{"$ref":"#/components/schemas/BabelInfo"},{"type":"null"}],"description":"Present only when the fee was paid in the input token; omitted when it was paid in ADA."}},"type":"object","required":["txCbor","txHash","partialSign"],"title":"BuildResponse","description":"An unsigned swap transaction, ready for the wallet to sign.\n\nSign and submit ``txCbor`` with the wallet (CIP-30), then post the signed\ntransaction to ``POST /swap/notify`` so the resulting order shows as pending\nuntil it is indexed. ``txHash`` is already final: it is computed over the\ntransaction body, which the wallet's signature does not change, so it is safe\nto track confirmation with it before submitting.","example":{"partialSign":false,"txCbor":"84a600d9010281825820754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be900018182583900","txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9"}},"BuildSwap":{"properties":{"tokenA":{"type":"string","title":"Tokena"},"tokenB":{"type":"string","title":"Tokenb"},"quantity":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Quantity"},"predictFromOutputAmount":{"type":"boolean","title":"Predictfromoutputamount","default":false},"ignoreDexes":{"items":{"type":"string"},"type":"array","title":"Ignoredexes"},"partner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner"},"hop":{"type":"boolean","title":"Hop","default":false},"da":{"anyOf":[{"items":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]},"type":"object"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Da","default":""},"isFloat":{"type":"boolean","title":"Isfloat","default":false},"address":{"type":"string","title":"Address"},"forwardAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forwardaddress"},"utxos":{"items":{"type":"string"},"type":"array","title":"Utxos"},"collateral":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Collateral"},"slippage":{"type":"integer","title":"Slippage"},"changeAddress":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Changeaddress"},"pAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paddress"},"feeAdust":{"type":"boolean","title":"Feeadust","default":true},"ttl":{"type":"integer","title":"Ttl","default":900}},"type":"object","required":["tokenA","tokenB","quantity","address","utxos","slippage"],"title":"BuildSwap","description":"Post body for a swap build request (V1 ``models.py``).\n\nExtends the estimate body with the wallet/build inputs. Byte-parity quirks\npreserved from V1: the **misspelled** ``feeAdust`` field (sic; unused), and\n``da`` defaulting to an empty string (inherited from :class:`SwapEstimate`).\n``changeAddress`` accepts a dict for legacy clients; the handler treats a\ndict as \"no change address\". ``pAddress``/``forwardAddress`` are accepted\nfor shape parity and are no-ops (STEEL-432 / STEEL-354)."},"CancelResponse":{"properties":{"transactions":{"items":{"$ref":"#/components/schemas/CancelTransaction"},"type":"array","title":"Transactions","description":"One unsigned transaction per script-version group — zero, one or two. Empty when no requested order was cancellable."},"skipped":{"anyOf":[{"items":{"$ref":"#/components/schemas/SkippedOrder"},"type":"array"},{"type":"null"}],"title":"Skipped","description":"Requested orders that produced no cancel, each with a reason. Omitted when every order was cancelled."},"refundSkipped":{"anyOf":[{"items":{"$ref":"#/components/schemas/RefundSkipped"},"type":"array"},{"type":"null"}],"title":"Refundskipped","description":"Orders that WERE cancelled but whose original transaction fee could not be refunded. Omitted when every refund succeeded."}},"type":"object","required":["transactions"],"title":"CancelResponse","description":"The cancel transactions that were built, plus what was left out.\n\nSign and submit every entry in ``transactions``; there are at most two, one per\nscript-version group, and the list is empty when nothing in the batch could be\ncancelled — which is still a ``200``, not an error. ``skipped`` explains each\norder that produced no cancel, and ``refundSkipped`` flags orders that WERE\ncancelled but whose original transaction fee could not be reclaimed. Both are\nomitted when empty.","example":{"skipped":[{"reason":"already_executed","txHash":"9c1b6a04c6a1a0f8f5b0c3d9e2a7148b3f6c0d51e8a94b27d3c6f0a815e4b7d2","txIndex":1}],"transactions":[{"cancelledRefs":[{"txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txIndex":0}],"partialSign":true,"plutusVersion":"v2v3","txCbor":"84a600d9010281825820754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be900018182583900"}]}},"CancelTransaction":{"properties":{"plutusVersion":{"type":"string","enum":["v1","v2v3"],"title":"Plutusversion","description":"Which script-version group this transaction covers: ``v1`` for hash-datum Plutus V1 orders, ``v2v3`` for inline-datum Plutus V2/V3 orders."},"txCbor":{"type":"string","title":"Txcbor","description":"The unsigned transaction as CBOR hex, for the wallet to sign and submit."},"partialSign":{"type":"boolean","title":"Partialsign","description":"``true`` when the transaction already carries a SteelSwap witness — sign it with CIP-30 ``partialSign`` so the wallet ADDS its witness instead of replacing the witness set."},"cancelledRefs":{"items":{"$ref":"#/components/schemas/OrderRef"},"type":"array","title":"Cancelledrefs","description":"The orders this transaction cancels."}},"type":"object","required":["plutusVersion","txCbor","partialSign","cancelledRefs"],"title":"CancelTransaction","description":"One unsigned cancel transaction, covering one script-version group.\n\nA single Cardano transaction cannot mix the two Plutus witness styles, so a\nbatch spanning both comes back as two transactions. Sign and submit each one\nindependently."},"CancelTxRef":{"properties":{"txHash":{"type":"string","title":"Txhash"},"txIndex":{"type":"integer","title":"Txindex"}},"type":"object","required":["txHash","txIndex"],"title":"CancelTxRef","description":"A single order reference to cancel (V1 ``txList`` element).\n\n``txHash``/``txIndex`` identify the submitted order UTxO on chain."},"ChallengeRequest":{"properties":{"address":{"type":"string","title":"Address","description":"Cardano address (bech32) that will sign."}},"type":"object","required":["address"],"title":"ChallengeRequest","description":"Request body for ``POST /cip8/challenge``."},"ChallengeResponse":{"properties":{"challenge":{"additionalProperties":true,"type":"object","title":"Challenge","description":"The challenge fields."},"message":{"type":"string","title":"Message","description":"Canonical JSON string to sign with the wallet (CIP-8)."}},"type":"object","required":["challenge","message"],"title":"ChallengeResponse","description":"The nonce challenge plus the exact message to sign."},"CreateIntegrationPartnerRequest":{"properties":{"slug":{"type":"string","title":"Slug","description":"Partner slug / identity."},"kind":{"$ref":"#/components/schemas/PartnerKind","description":"self_serve | integration.","default":"integration"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Expiry (ISO-8601) or null."},"account_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Account Index","description":"HD account index -> fee address (required for integration)."},"maintenance_address":{"type":"string","title":"Maintenance Address","description":"Dashboard-login wallet (base address, key/script stake)."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"fee_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Bps","description":"Total fee to users (bps)."},"fee_split_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Split Bps","description":"Partner portion (bps)."},"fee_flat_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Flat Amount"},"fee_threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Threshold"},"payout_frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payout Frequency","description":"daily | weekly | monthly; null = hourly."},"free_on_single_route":{"type":"boolean","title":"Free On Single Route","default":false},"fixed_platform_fee_lovelace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fixed Platform Fee Lovelace"},"metadata_lines":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Metadata Lines"},"reward_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reward Address"},"stake_account_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stake Account Index"},"expected_fee_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Fee Address"},"daily_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Quota","description":"Baseline daily quota; null = unlimited.","default":100}},"additionalProperties":false,"type":"object","required":["slug","maintenance_address"],"title":"CreateIntegrationPartnerRequest","description":"Fields to provision a new INTEGRATION partner.\n\nA fresh key is minted — unlike the CLI's ``create-integration-partner``,\nwhich imports one."},"CreatePartnerResponse":{"properties":{"partner":{"$ref":"#/components/schemas/PartnerSummary"},"api_key":{"type":"string","title":"Api Key","description":"Full plaintext <prefix>.<secret> — shown ONCE."},"key_prefix":{"type":"string","title":"Key Prefix"},"key_created_at":{"type":"string","format":"date-time","title":"Key Created At"}},"type":"object","required":["partner","api_key","key_prefix","key_created_at"],"title":"CreatePartnerResponse","description":"A newly-provisioned partner + its freshly minted key (shown once)."},"DatumBlock":{"properties":{"kind":{"type":"string","enum":["inline","hash","none"],"title":"Kind","description":"How the datum is carried. ``inline``: the datum bytes sit in the output itself. ``hash``: only the hash is on-chain and the preimage must travel in the witness set — look it up in ``witnessDatums``. ``none``: no datum."},"cbor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cbor","description":"The datum as CBOR hex for ``inline``, the datum hash for ``hash``. Omitted for ``none``."}},"type":"object","required":["kind"],"title":"DatumBlock","description":"A datum on an input or output: inline, hash-only, or absent."},"DexHistory":{"properties":{"dexKey":{"type":"string","title":"Dexkey"},"days":{"type":"integer","title":"Days"},"series":{"additionalProperties":{"items":{"$ref":"#/components/schemas/DexHistoryPoint"},"type":"array"},"type":"object","title":"Series"}},"type":"object","required":["dexKey","days","series"],"title":"DexHistory","description":"Daily metric history for one DEX, keyed by metric name.\n\n``series`` holds one ascending point per requested day for each of\n``volume`` (ADA), ``tvl`` (ADA), ``transactions``, ``activeAddresses`` and\n``batcherFees`` (ADA). Days with no activity are present with value 0, so\nevery series has exactly ``days`` points. An unrecognised DEX yields\nall-zero series rather than a 404.","example":{"days":3,"dexKey":"Minswap","series":{"activeAddresses":[{"time":1781654400,"value":4310},{"time":1781740800,"value":4188},{"time":1781827200,"value":4457}],"batcherFees":[{"time":1781654400,"value":43488.0},{"time":1781740800,"value":41836.0},{"time":1781827200,"value":45006.0}],"transactions":[{"time":1781654400,"value":21744},{"time":1781740800,"value":20918},{"time":1781827200,"value":22503}],"tvl":[{"time":1781654400,"value":31844120.0},{"time":1781740800,"value":31690455.0},{"time":1781827200,"value":32011788.0}],"volume":[{"time":1781654400,"value":4182930.55},{"time":1781740800,"value":3980114.02},{"time":1781827200,"value":4410882.71}]}}},"DexHistoryPoint":{"properties":{"time":{"type":"integer","title":"Time"},"value":{"type":"number","title":"Value"}},"type":"object","required":["time","value"],"title":"DexHistoryPoint","description":"One daily datapoint: ``time`` is the UTC day start (unix seconds)."},"DexInfoOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","enum":["amm","orderbook"],"title":"Type"},"logoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logourl"}},"type":"object","required":["id","name","type"],"title":"DexInfoOut","description":"A supported DEX: its id, display name, type, and logo path."},"DexList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DexInfoOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"DexList","description":"The supported-DEX catalog (a small, static list — not paginated)."},"DexStatsResponse":{"properties":{"window":{"type":"string","title":"Window"},"dexes":{"items":{"$ref":"#/components/schemas/DexStatsRow"},"type":"array","title":"Dexes"}},"type":"object","required":["window","dexes"],"title":"DexStatsResponse","description":"Ranked per-DEX statistics for one rolling window.\n\n``window`` echoes the requested window. ``dexes`` is sorted by the requested\nsort key, highest first, and is empty when no price data is indexed yet.","example":{"dexes":[{"activeAddresses":4310,"activePools":1892,"avgTradeSize":192.37,"batcherFees":43488.0,"changePct":-6.28,"dexKey":"Minswap","logoUrl":"/resources/img/dex/minswap.png","marketSharePct":41.7,"name":"Minswap","transactions":21744,"turnover":0.1313,"tvl":31844120.0,"volume":4182930.55}],"window":"24h"}},"DexStatsRow":{"properties":{"dexKey":{"type":"string","title":"Dexkey"},"name":{"type":"string","title":"Name"},"logoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logourl"},"volume":{"type":"number","title":"Volume"},"tvl":{"type":"number","title":"Tvl"},"transactions":{"type":"integer","title":"Transactions"},"activeAddresses":{"type":"integer","title":"Activeaddresses"},"batcherFees":{"type":"number","title":"Batcherfees"},"activePools":{"type":"integer","title":"Activepools"},"marketSharePct":{"type":"number","title":"Marketsharepct"},"changePct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Changepct"},"avgTradeSize":{"type":"number","title":"Avgtradesize"},"turnover":{"type":"number","title":"Turnover"}},"type":"object","required":["dexKey","name","volume","tvl","transactions","activeAddresses","batcherFees","activePools","marketSharePct","changePct","avgTradeSize","turnover"],"title":"DexStatsRow","description":"Statistics for a single DEX over one rolling window.\n\n``volume``, ``tvl``, ``batcherFees`` and ``avgTradeSize`` are ADA. ``tvl`` is\nmeasured over ADA-paired pools (twice the ADA side of each pool's latest\nreserves), so a DEX's non-ADA pools do not contribute. ``activeAddresses``\ncounts distinct wallets (stake keys), so multiple addresses of one wallet\ncount once. ``marketSharePct`` is this DEX's percent of total volume across\nall DEXes in the window; ``changePct`` is the percent change against the\nimmediately preceding window of the same length, and is null when that\nwindow had no volume. ``turnover`` is ``volume / tvl`` (0 when tvl is 0).\n``logoUrl`` is a path relative to the API host, and is null for a DEX with\nno bundled logo.","example":{"activeAddresses":4310,"activePools":1892,"avgTradeSize":192.37,"batcherFees":43488.0,"changePct":-6.28,"dexKey":"Minswap","logoUrl":"/resources/img/dex/minswap.png","marketSharePct":41.7,"name":"Minswap","transactions":21744,"turnover":0.1313,"tvl":31844120.0,"volume":4182930.55}},"EstimateFees":{"properties":{"batcher":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Total batcher fee across all legs, in lovelace. Not refundable."},"deposit":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Total order deposit across all legs, in lovelace. Returned to the wallet when the orders settle or are cancelled."},"service":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"The SteelSwap or partner fee the build will charge, in lovelace. Always present; ``0`` when the swap is fee-free."}},"type":"object","required":["batcher","deposit","service"],"title":"EstimateFees","description":"The three fees a swap pays, each as a full asset (always lovelace today).\n\n``batcher`` and ``deposit`` are the totals across every leg — batchers charge\nper leg, and each leg's order locks a refundable deposit that is returned when\nthe order settles. ``service`` is the SteelSwap or partner fee the build will\ncharge and is always present, ``0`` when the swap is free. It is derived from\nthe authenticated caller, so the fee shown in a quote is the fee the build\ncharges."},"EstimateLeg":{"properties":{"kind":{"type":"string","title":"Kind","description":"Leg variant. Currently always ``\"ammSwap\"``.","examples":["ammSwap"]},"poolId":{"type":"string","title":"Poolid","description":"On-chain identifier of the pool this leg trades against, or of the composite route when the leg chains through several pools."},"dex":{"type":"string","title":"Dex","description":"Brand serving this leg. For a single-pool leg it matches an ``id`` from ``GET /dexes`` — the same value ``ignore`` excludes. A multi-pool leg instead reports the routing brand that composes it, which is not part of that catalog.","examples":["MinswapV2"]},"input":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Amount of the input token this leg takes."},"output":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Amount of the output token this leg returns."},"batcherFee":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Batcher fee for this leg, in lovelace. Fees are charged per leg, so a wider split buys more gross output but pays more fees."}},"type":"object","required":["kind","poolId","dex","input","output","batcherFee"],"title":"EstimateLeg","description":"One parallel leg of a split route (an entry in ``split``).\n\nA quote is split across venues to reduce price impact. Every leg trades the\nswap's own input token for its own output token, so the leg ``input`` amounts\nsum to the top-level ``input`` and the leg ``output`` amounts sum to the\ntop-level ``output``. A leg that internally chains through an intermediate\ntoken is still reported as a single leg, under the routing brand that composes\nit rather than under the individual pools' brands.\n\n``kind`` names the leg variant. Every leg is currently reported as\n``\"ammSwap\"``; ``\"orderbookFill\"`` and ``\"mintBurn\"`` are reserved for a later\nrefinement and are not emitted yet."},"EstimateRequest":{"properties":{"input":{"anyOf":[{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Input"},{"type":"null"}],"description":"Input-amount side: the asset and amount you offer. Pair it with ``outputUnit``; omit it when you fix the output instead."},"outputUnit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outputunit","description":"Input-amount side: the unit of the token you want to receive. Pair it with ``input``.","examples":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]},"inputUnit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inputunit","description":"Output-amount side: the unit of the token you offer. Pair it with ``output``.","examples":["lovelace"]},"output":{"anyOf":[{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Input"},{"type":"null"}],"description":"Output-amount side: the asset and amount you want to receive. Pair it with ``inputUnit``; omit it when you fix the input instead."},"ignore":{"items":{"type":"string"},"type":"array","title":"Ignore","description":"DEX brands to exclude from routing, matched against the ``id`` values returned by ``GET /dexes``. Empty (the default) excludes nothing; excluding every brand that can serve the pair yields no route.","default":[],"examples":[["Spectrum","MuesliSwap"]]},"allInclusive":{"type":"boolean","title":"Allinclusive","description":"Treat the ADA ``input`` amount as the TOTAL leaving the wallet: the batcher fee, the per-leg deposit, the SteelSwap service fee and a 1 ADA network buffer are netted out of it, and the remainder is the amount actually swapped — so the response's ``input`` is smaller than the amount sent. Supported only when the input side is fixed and the input token is ADA; any other shape is 422 ``all_inclusive_unsupported``, and a total too small to cover the overhead is 422 ``insufficient_input``.","default":false},"whale":{"type":"boolean","title":"Whale","description":"Reserved large-trade toggle. Accepted for compatibility but currently has no effect on the quote: the solver serves the same route either way.","default":false},"solverOverrides":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Solveroverrides","description":"Advanced per-request solver tuning. Keys that do not name a solver parameter are ignored; recognised ones override the server default for this request only. Leave it unset unless you are deliberately trading quote accuracy against latency."},"babelFee":{"$ref":"#/components/schemas/BabelMode","description":"How the combined SteelSwap fee is paid. ``none`` pays in ADA only; ``ifNeeded`` (the default) pays in ADA when the wallet holds enough and otherwise in the input token; ``force`` always pays in the input token. An ADA-input swap never pays in a token, so the ``babel`` block is omitted for it regardless of this value.","default":"ifNeeded"},"addressSource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Addresssource","description":"The swapper's wallet address (bech32). Optional on an estimate: supply it to make the ``babel`` block wallet-aware — the fee path is then resolved against real wallet UTxOs the same way the build resolves it, instead of the wallet-blind preview. Required on a build.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"]},"utxos":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Utxos","description":"The wallet's UTxOs as CBOR hex. Only read when ``addressSource`` is also supplied; when omitted the server fetches the address's unspent UTxOs itself."}},"type":"object","title":"EstimateRequest","description":"Body for ``POST /swap/estimate`` — a swap quote in either direction.\n\nSupply **exactly one** complete side:\n\n- input-amount — ``{input, outputUnit}``: \"I offer this much, what do I\n  receive?\" ``input`` carries the offered ``unit`` + ``amount``; ``outputUnit``\n  is the token you want.\n- output-amount — ``{inputUnit, output}``: \"I want exactly this much out, what\n  must I offer?\" ``inputUnit`` is the token you offer; ``output`` carries the\n  desired ``unit`` + ``amount``.\n\nAll four directional fields are optional on the model because either pair is\nlegal, but a body carrying both complete sides — or neither — is rejected with\n``422``, as is a fixed-side amount that is not strictly positive.\n\nAmounts follow the shared rule: an integer (or decimal string) is base units, a\nJSON float is a human amount that is scaled by the token's decimals and echoed\nback decimal-adjusted.","example":{"input":{"amount":100000000,"unit":"lovelace"},"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}},"EstimateResponse":{"properties":{"input":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Total offered: the token given up and how much of it."},"output":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"Total received: the token acquired and how much of it."},"effectivePrice":{"type":"number","title":"Effectiveprice","description":"Realized rate as INPUT per one unit of OUTPUT, with the batcher fee included — divide the input by the output, not the other way round. ADA is scaled by its 6 decimals; every other token is left at base units, so a rate against a native token is per base unit of that token.","examples":[0.002536585]},"priceImpact":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Priceimpact","description":"Reserved. A single figure has no clean meaning across a split, multi-venue route, so it is not currently reported and the field is always omitted."},"bonusOutput":{"anyOf":[{"type":"string"},{"type":"number"}],"title":"Bonusoutput","description":"How much the split beat the single best venue by: extra output on an input-amount quote, input saved on an output-amount quote. ``0`` when splitting did not help or only one venue could serve the trade.","default":"0"},"fees":{"$ref":"#/components/schemas/EstimateFees","description":"Batcher, deposit and service fees."},"split":{"items":{"$ref":"#/components/schemas/EstimateLeg"},"type":"array","title":"Split","description":"Per-venue breakdown of the same trade. One entry means the whole swap went to a single venue."},"tokens":{"anyOf":[{"items":{"$ref":"#/components/schemas/TokenRef"},"type":"array"},{"type":"null"}],"title":"Tokens","description":"Metadata for every distinct unit named above. Present only when the request asked for ``?expand=token``; omitted otherwise."},"babel":{"anyOf":[{"$ref":"#/components/schemas/BabelInfo"},{"type":"null"}],"description":"Whether the fee can be paid in the input token. Omitted for an ADA-input swap and when ``babelFee`` is ``none``."},"timing":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Timing","description":"Server-side per-stage latency breakdown in milliseconds. A diagnostic that is disabled by default, so the field is normally omitted; treat its keys as unstable."}},"type":"object","required":["input","output","effectivePrice","fees","split"],"title":"EstimateResponse","description":"A swap quote: what you get, what it costs, and which venues serve it.\n\n``input`` and ``output`` are the totals for the whole swap; whichever side the\nrequest pinned comes back unchanged, and the other is the prediction. ``split``\nbreaks the same trade down per venue and sums back to those totals. Amounts are\nbase units as decimal strings unless the request used decimal amounts, in which\ncase every amount comes back as a decimal-adjusted number instead.\n\nA pair with no usable route is ``404 no_route``, not an empty quote.","example":{"bonusOutput":"380","effectivePrice":0.002536585,"fees":{"batcher":{"amount":"4000000","unit":"lovelace"},"deposit":{"amount":"4000000","unit":"lovelace"},"service":{"amount":"1000000","unit":"lovelace"}},"input":{"amount":"100000000","unit":"lovelace"},"output":{"amount":"41000","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},"split":[{"batcherFee":{"amount":"2000000","unit":"lovelace"},"dex":"MinswapV2","input":{"amount":"62000000","unit":"lovelace"},"kind":"ammSwap","output":{"amount":"25420","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},"poolId":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c"},{"batcherFee":{"amount":"2000000","unit":"lovelace"},"dex":"SundaeSwapV3","input":{"amount":"38000000","unit":"lovelace"},"kind":"ammSwap","output":{"amount":"15580","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},"poolId":"7dd6988c5a86693c76aeec1ea94afa41770be0de21a775ca7a2a1eab"}]}},"EventBlock":{"properties":{"blockNumber":{"type":"integer","title":"Blocknumber"},"blockTimestamp":{"type":"integer","title":"Blocktimestamp"}},"type":"object","required":["blockNumber","blockTimestamp"],"title":"EventBlock","description":"The block an integration event landed in."},"EventItem":{"properties":{"block":{"$ref":"#/components/schemas/EventBlock"},"txnId":{"type":"string","title":"Txnid"},"txnIndex":{"type":"integer","title":"Txnindex"},"eventIndex":{"type":"integer","title":"Eventindex"},"maker":{"type":"string","title":"Maker"},"pairId":{"type":"string","title":"Pairid"},"eventType":{"type":"string","title":"Eventtype"},"amount0":{"type":"string","title":"Amount0"},"amount1":{"type":"string","title":"Amount1"},"asset0In":{"type":"string","title":"Asset0In"},"asset0Out":{"type":"string","title":"Asset0Out"},"asset1In":{"type":"string","title":"Asset1In"},"asset1Out":{"type":"string","title":"Asset1Out"},"reserves":{"$ref":"#/components/schemas/EventReserves"}},"type":"object","required":["block","txnId","txnIndex","eventIndex","maker","pairId","eventType","amount0","amount1","asset0In","asset0Out","asset1In","asset1Out","reserves"],"title":"EventItem","description":"A single TradingView-UDF swap event (pool asset0/asset1 orientation)."},"EventReserves":{"properties":{"asset0":{"type":"string","title":"Asset0"},"asset1":{"type":"string","title":"Asset1"}},"type":"object","required":["asset0","asset1"],"title":"EventReserves","description":"Pool reserves (asset0/asset1) at the time of an integration event."},"ExchangeInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"logoURL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logourl"}},"type":"object","required":["id","name"],"title":"ExchangeInfo","description":"Exchange (DEX) metadata.\n\n``logoURL`` is a path relative to the API host, and is null for a DEX with no\nbundled logo."},"ExtendServiceRequest":{"properties":{"valid_until":{"type":"string","format":"date-time","title":"Valid Until"}},"additionalProperties":false,"type":"object","required":["valid_until"],"title":"ExtendServiceRequest","description":"New expiry for a service row (also re-activates it)."},"FeeBarPoint":{"properties":{"ts":{"type":"integer","title":"Ts"},"txCount":{"type":"integer","title":"Txcount"},"feeValue":{"type":"string","title":"Feevalue"}},"type":"object","required":["ts","txCount","feeValue"],"title":"FeeBarPoint","description":"One time bucket of fee activity: the bucket start plus its totals.\n\n``ts`` is the bucket START as unix epoch **seconds** (UTC): midnight for a\n``day`` bucket, the Monday midnight for a ``week`` bucket, the 1st-of-month\nmidnight for a ``month`` bucket. ``txCount`` is the number of fee-bearing\noutputs that fell in the bucket and ``feeValue`` their summed **lovelace**\nvalue as a decimal string. Buckets with no activity are omitted, not zero-filled.","example":{"feeValue":"28640000","ts":1784592000,"txCount":96}},"FeeBarsResponse":{"properties":{"source":{"type":"string","title":"Source"},"period":{"type":"string","title":"Period"},"bars":{"items":{"$ref":"#/components/schemas/FeeBarPoint"},"type":"array","title":"Bars"}},"type":"object","required":["source","period","bars"],"title":"FeeBarsResponse","description":"Time-bucketed fee revenue for one fee stream, ascending by bucket start.\n\n``period`` echoes the requested granularity (``day`` / ``week`` / ``month``),\nwhich also fixes the look-back window the bars cover. ``bars`` holds only the\nbuckets that had activity, oldest first; it is empty for a stream with no fees\nin the window, and for one whose fee address is not derivable or is unknown to\nthe chain indexer.","example":{"bars":[{"feeValue":"25120000","ts":1784505600,"txCount":88},{"feeValue":"28640000","ts":1784592000,"txCount":96},{"feeValue":"19980000","ts":1784678400,"txCount":71}],"period":"day","source":"service"}},"FeeHistoryEntryOut":{"properties":{"txHash":{"type":"string","title":"Txhash"},"ts":{"type":"integer","title":"Ts"},"feeValue":{"type":"string","title":"Feevalue"}},"type":"object","required":["txHash","ts","feeValue"],"title":"FeeHistoryEntryOut","description":"One fee-bearing output: its transaction, block time, and the fee collected.\n\n``txHash`` is the 64-character hex transaction hash, ``ts`` its block time as\nunix epoch **seconds** (UTC), and ``feeValue`` the **lovelace** that output paid\nto the fee address, as a decimal string. One entry is one fee output, so a\ntransaction that paid the fee address twice appears as two entries sharing a\n``txHash``.","example":{"feeValue":"412000","ts":1784730665,"txHash":"60fa731569afd9d0d7a4942634c76653ec6873be4dc82871663d0a5c11adc219"}},"FeeHistoryResponse":{"properties":{"source":{"type":"string","title":"Source"},"total":{"type":"integer","title":"Total","default":0},"entries":{"items":{"$ref":"#/components/schemas/FeeHistoryEntryOut"},"type":"array","title":"Entries"}},"type":"object","required":["source","entries"],"title":"FeeHistoryResponse","description":"A page of fee-bearing transactions for one fee stream, newest first.\n\n``entries`` is the requested page — the rows at ``offset … offset+limit``,\nordered by block time descending. ``total`` is the count of fee outputs across\nALL pages (the pager's denominator, not the length of this page), so a page\nbeyond the end returns an empty ``entries`` while ``total`` still reports the\nfull size. Both are ``0`` / empty in the zero-state.","example":{"entries":[{"feeValue":"412000","ts":1784730665,"txHash":"60fa731569afd9d0d7a4942634c76653ec6873be4dc82871663d0a5c11adc219"},{"feeValue":"1050000","ts":1784729110,"txHash":"a1a81b0451685c559bbc413e145504cfccb5f13585805e935ecebf1eadb852a1"}],"source":"service","total":4182}},"FeeSummaryResponse":{"properties":{"source":{"type":"string","title":"Source"},"txCount":{"type":"integer","title":"Txcount"},"feeValue":{"type":"string","title":"Feevalue"}},"type":"object","required":["source","txCount","feeValue"],"title":"FeeSummaryResponse","description":"All-time fee totals for one fee stream: how many fee outputs, and their sum.\n\n``txCount`` is the number of fee-bearing outputs ever attributed to the stream\n(all time — no window is applied); ``feeValue`` is their summed **lovelace**\nvalue as a decimal string. A stream that has never collected a fee — and one\nwhose fee address the node cannot derive or that the chain indexer has not yet\nseen — returns zeros rather than an error, so the dashboard can render a\nzero-state.\n\n``source`` echoes the stream the totals belong to: ``service`` or ``atc`` on\nthe admin reads, and the partner's own slug on the partner reads.","example":{"feeValue":"1287430000","source":"service","txCount":4182}},"GrantPlanRequest":{"properties":{"plan":{"type":"string","title":"Plan","description":"Catalog plan name (service_plan.name)."},"plan_tag":{"type":"string","title":"Plan Tag","description":"Gate credential tag stamped on each granted row.","default":"tools-api-partner"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until","description":"Plan expiry; null = never."}},"additionalProperties":false,"type":"object","required":["plan"],"title":"GrantPlanRequest","description":"Which catalog plan to grant, and under what gate-credential tag."},"GrantPlanResponse":{"properties":{"plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Id"},"plan_tag":{"type":"string","title":"Plan Tag"},"granted":{"items":{"$ref":"#/components/schemas/ServiceRowOut"},"type":"array","title":"Granted"}},"type":"object","required":["plan_id","plan_tag","granted"],"title":"GrantPlanResponse","description":"The result of granting a catalog plan to a partner."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HandleChip":{"properties":{"name":{"type":"string","title":"Name"},"unit":{"type":"string","title":"Unit"},"hex":{"type":"string","title":"Hex"}},"type":"object","required":["name","unit","hex"],"title":"HandleChip","description":"An ADA Handle held by a wallet (chip-ready).","example":{"hex":"736e656b66616e","name":"snekfan","unit":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a736e656b66616e"}},"HandleResolution":{"properties":{"name":{"type":"string","title":"Name"},"address":{"type":"string","title":"Address"},"stake":{"type":"string","title":"Stake"}},"type":"object","required":["name","address","stake"],"title":"HandleResolution","description":"Reverse resolution of an ADA Handle to its holder.","example":{"address":"addr1xyjku7agjy54xn74eg9gm2htzpcaeyg88gzpcs79zfh5ypt9xe607rgsksyr38s0mjjln8uscyvkt9xsz0zw35lwmjyqs3zfqa","name":"snek","stake":"stake179jnva8lp5gtgzpcnc8aef0en7gvzxt9jngp838g60hdezqcjuu4l"}},"HopSplitOutput":{"properties":{"tokenA":{"type":"string","title":"Tokena"},"quantityA":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Quantitya"},"tokenB":{"type":"string","title":"Tokenb"},"quantityB":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Quantityb"},"totalFee":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Totalfee"},"totalDeposit":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Totaldeposit"},"steelswapFee":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Steelswapfee"},"bonusOut":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Bonusout"},"price":{"type":"number","title":"Price"},"splitGroup":{"items":{"items":{"$ref":"#/components/schemas/SplitOutput"},"type":"array"},"type":"array","title":"Splitgroup"}},"type":"object","required":["tokenA","quantityA","tokenB","quantityB","totalFee","totalDeposit","steelswapFee","bonusOut","price","splitGroup"],"title":"HopSplitOutput","description":"Inputs and outputs for a specific pool."},"IntegrationAsset":{"properties":{"asset":{"$ref":"#/components/schemas/AssetInfo"}},"type":"object","required":["asset"],"title":"IntegrationAsset","description":"A native asset, in the charting integration's ``asset`` envelope.","example":{"asset":{"circulatingSupply":76715880000.0,"id":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","name":"Snek","symbol":"SNEK","totalSupply":76715880000.0}}},"IntegrationBlock":{"properties":{"block":{"$ref":"#/components/schemas/BlockInfo"}},"type":"object","required":["block"],"title":"IntegrationBlock","description":"A block, in the charting integration's ``block`` envelope.","example":{"block":{"blockNumber":13568151,"blockTimestamp":1781834053}}},"IntegrationEvents":{"properties":{"events":{"items":{"$ref":"#/components/schemas/EventItem"},"type":"array","title":"Events"}},"type":"object","required":["events"],"title":"IntegrationEvents","description":"A page of integration (swap) events over a block range.","example":{"events":[{"amount0":"142950000.0","amount1":"30000000.0","asset0In":"0.0","asset0Out":"142950000.0","asset1In":"30000000.0","asset1Out":"0.0","block":{"blockNumber":188945431,"blockTimestamp":1780511722},"eventIndex":188945431000000,"eventType":"swap","maker":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","pairId":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c7dd6988c5a86693c76aeec1ea94afa41770be0de21a775ca7a2a1eabdb6a0171","reserves":{"asset0":"4633769495377.0","asset1":"965003106804.0"},"txnId":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txnIndex":3}]}},"IntegrationExchange":{"properties":{"exchange":{"$ref":"#/components/schemas/ExchangeInfo"}},"type":"object","required":["exchange"],"title":"IntegrationExchange","description":"An exchange, in the charting integration's ``exchange`` envelope.","example":{"exchange":{"id":"1","logoURL":"/resources/img/dex/cswap.png","name":"CSWAP"}}},"IntegrationPair":{"properties":{"pair":{"$ref":"#/components/schemas/PairInfo"}},"type":"object","required":["pair"],"title":"IntegrationPair","description":"A pair.","example":{"pair":{"asset0Id":"lovelace","asset1Id":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","createdAtBlockNumber":92386337,"createdAtBlockTimestamp":1683952628,"dexKey":"VyFi","id":"96c31772282e6ae5c629120471c5bbcdef538226b31b97d74c50ca3c"}}},"MarketStats":{"properties":{"activeAddresses":{"type":"integer","title":"Activeaddresses"},"dexVolume":{"type":"number","title":"Dexvolume"}},"type":"object","required":["activeAddresses","dexVolume"],"title":"MarketStats","description":"Aggregated market stats: 24h DEX volume and active-address count.\n\n``dexVolume`` is trailing-24h volume over ADA pairs, converted into the\nrequested quote currency. ``activeAddresses`` counts chain-wide addresses\nthat sent or received a transaction in the last 24h, deduplicated by stake\nkey, so one wallet counts once.","example":{"activeAddresses":9831,"dexVolume":0.0}},"MetadataRequest":{"properties":{"units":{"items":{"type":"string"},"type":"array","title":"Units","description":"On-chain token units to resolve — ``policyIdHex + assetNameHex``, with the sentinel ``lovelace`` for ADA. Duplicate, unknown and malformed units are dropped rather than rejected, so the response may carry fewer entries than were requested. An empty list is valid and returns no tokens."}},"type":"object","required":["units"],"title":"MetadataRequest","description":"Request body for ``POST /tokens/metadata``: the units to resolve.","example":{"units":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]}},"MetadataResponse":{"properties":{"tokens":{"items":{"$ref":"#/components/schemas/TokenRef"},"type":"array","title":"Tokens"}},"type":"object","required":["tokens"],"title":"MetadataResponse","description":"The lean, batched metadata table: ``{tokens: TokenRef[]}``.\n\nOne entry per unit that resolved, ordered by that unit's first occurrence in\nthe request. A unit that did not resolve is simply absent — there is no\nplaceholder entry — so a caller should key the array by ``unit`` rather than\nzip it positionally against the request.","example":{"tokens":[{"assetName":"","decimals":6,"decimalsKnown":true,"name":"Cardano","policyId":"","ticker":"ADA","unit":"lovelace"},{"assetName":"534e454b","decimals":0,"decimalsKnown":true,"name":"Snek","policyId":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f","ticker":"SNEK","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}]}},"MintBurnLeg":{"properties":{"dex":{"type":"string","title":"Dex","description":"The exchange this leg executed on, as a display label — ``Minswap``, ``SundaeSwapV3``, ``GeniusYield``, ``Djed``. Djed and Shen share one venue on chain and are labelled apart here by the token that moved."},"txHash":{"type":"string","title":"Txhash","description":"Hash of the transaction this leg itself lives in. For an order the wallet opened directly that is the group's own ``txHash``; for a continuation or a cross-protocol forward it is the later transaction that created it."},"status":{"type":"string","title":"Status","description":"This one execution's on-chain status — ``OPEN``, ``LIMIT``, ``FILLED``, ``CANCELLED``, ``ERROR``. It is not the group's aggregate ``status``: a filled leg can sit inside a group that is still ``PARTIALLY_FILLED``."},"offer":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"What this leg put in — the offered token and its base-unit amount."},"received":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"What this leg took out. When the exact settled amount was not recorded on chain this falls back to the amount the order asked for, so read it as a lower bound rather than an exact figure."},"fillReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fillreason","description":"Why the leg is in its current state, when a reason was recorded — for example ``BELOW_ASK`` for a limit order still above the market, ``INSUFFICIENT_LIQUIDITY`` or ``EXPIRED``. Omitted when there is nothing to report."},"kind":{"type":"string","const":"mintBurn","title":"Kind","default":"mintBurn"},"variant":{"type":"string","title":"Variant","description":"Which token moved: ``Djed`` (the stablecoin) or ``Shen``."},"direction":{"type":"string","title":"Direction","description":"``mint`` when ADA was offered and the token came back, ``burn`` in the other direction."}},"type":"object","required":["dex","txHash","status","offer","received","variant","direction"],"title":"MintBurnLeg","description":"A Djed or Shen mint or burn (``kind`` is ``mintBurn``).\n\nThese have no counterparty: ADA in mints the token, and the token in burns it\nback to ADA, both against the protocol's own reserve.","example":{"dex":"Djed","direction":"mint","kind":"mintBurn","offer":{"amount":"500000000","unit":"lovelace"},"received":{"amount":"412500000","unit":"8db269c3ec630e06ae29f74bc39edd1f87c819f1056206e879a1cd61446a65644d6963726f555344"},"status":"FILLED","txHash":"c72b501e9f3a48d60b1c2e7f5a93d804e61f7c25b0a3d9e48f2c15b6079ae3d42","variant":"Djed"}},"MintedKeyResponse":{"properties":{"api_key":{"type":"string","title":"Api Key","description":"Full plaintext <prefix>.<secret> — shown ONCE, never stored."},"prefix":{"type":"string","title":"Prefix","description":"Durable lookup prefix for this key."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the key was minted (UTC)."}},"type":"object","required":["api_key","prefix","created_at"],"title":"MintedKeyResponse","description":"A freshly minted key — the secret is shown ONCE and never re-served."},"NotifyRequest":{"properties":{"txHash":{"type":"string","title":"Txhash","description":"The submitted transaction's id — the ``txHash`` the build returned. It must match the body of ``txCbor``.","examples":["754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9"]},"txCbor":{"type":"string","title":"Txcbor","description":"The complete signed transaction as CBOR hex (abridged in the example). Its validity deadline sizes how long the pending marker lives, and its outputs identify the submitting wallet."}},"type":"object","required":["txHash","txCbor"],"title":"NotifyRequest","description":"Body for ``POST /swap/notify`` — a swap transaction that was just broadcast.\n\nPost it the instant the signed transaction is submitted, so the resulting order\nshows up as pending during the seconds-to-minutes window before it is indexed\non-chain. The two fields must agree: the transaction id is recomputed from the\nCBOR and a mismatch is rejected, so the pending marker cannot be attached to\nsomebody else's transaction.","example":{"txCbor":"84a600d9010281825820754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be900018182583900","txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9"}},"OrderGroup":{"properties":{"txHash":{"type":"string","title":"Txhash","description":"Hash of the transaction that opened this logical order."},"blockSlot":{"type":"integer","title":"Blockslot","description":"Slot of the block holding that transaction. ``0`` for an order that is still in the mempool."},"blockIndex":{"type":"integer","title":"Blockindex","description":"Position of that transaction within its block. ``0`` for an order that is still in the mempool."},"timeSec":{"type":"integer","title":"Timesec","description":"When the order was placed, as a unix timestamp in seconds — the block time on chain, or the submission time for a mempool order."},"status":{"type":"string","title":"Status","description":"The order's overall state, folded over every execution it produced: ``OPEN`` or ``LIMIT`` while work is outstanding; ``PARTIALLY_FILLED`` / ``PARTIALLY_CANCELLED`` when part has completed and part is still open; ``FILLED``, ``CANCELLED`` or ``ERROR`` when everything reached that same end state; ``MIXED`` when the executions ended in different states; ``ROLLED_BACK`` if every execution was rolled back. ``MEMPOOL`` means the transaction has been broadcast but is not indexed yet."},"orderType":{"type":"string","title":"Ordertype","description":"What was submitted: ``SWAP``, ``ZAP_IN``, ``ZAP_OUT``, ``DEPOSIT`` or ``WITHDRAWAL``."},"pair":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pair","description":"The two token units traded, in canonical on-chain order — by policy id then asset name, so ADA sorts first when it is one of them. Present only when the order has exactly one input token and one output token; omitted when it trades several at once."},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"The app that built the transaction, read from the message it attached on chain, plus its sub-channel when one was tagged. Omitted when the transaction carried no such message."},"offer":{"items":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output"},"type":"array","title":"Offer","description":"What the submission committed, per token, in base units. Empty for a mempool order, whose amounts are not known yet."},"minReceive":{"items":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output"},"type":"array","title":"Minreceive","description":"The least the final executions in the chain will accept, per output token, in base units."},"received":{"items":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output"},"type":"array","title":"Received","description":"What has actually come back so far, per output token, in base units. Empty until something fills. Where an exact settled amount was not recorded the accepted minimum is counted instead, so this is a lower bound."},"remaining":{"anyOf":[{"items":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output"},"type":"array"},{"type":"null"}],"title":"Remaining","description":"The input still sitting in open executions, waiting to be filled, per token, in base units. Omitted once nothing is open."},"fillReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fillreason","description":"The reason code from the most recent execution in the chain, when one was recorded. Omitted otherwise."},"legCount":{"type":"integer","title":"Legcount","description":"How many executions were folded into this order. Always present, including in the lean list view where ``legs`` itself is omitted; ``0`` for a mempool order."},"legs":{"anyOf":[{"items":{"oneOf":[{"$ref":"#/components/schemas/AmmSwapLeg"},{"$ref":"#/components/schemas/OrderbookFillLeg"},{"$ref":"#/components/schemas/MintBurnLeg"}],"discriminator":{"propertyName":"kind","mapping":{"ammSwap":"#/components/schemas/AmmSwapLeg","mintBurn":"#/components/schemas/MintBurnLeg","orderbookFill":"#/components/schemas/OrderbookFillLeg"}}},"type":"array"},{"type":"null"}],"title":"Legs","description":"The individual executions, each discriminated by ``kind``. Omitted by the list endpoint unless it is asked to include them."},"route":{"anyOf":[{"$ref":"#/components/schemas/RouteDag"},{"type":"null"}],"description":"The path the order actually took through the venues, as a structure-only graph of tokens and pool hops — no amounts. Repeated fills of the same hop collapse to one edge. Omitted by the list endpoint unless it is asked to include it."}},"type":"object","required":["txHash","blockSlot","blockIndex","timeSec","status","orderType","offer","minReceive","received","legCount"],"title":"OrderGroup","description":"One logical order: a single wallet submission and everything that flowed from it.\n\nA submission fans out. A split swap opens several order UTxOs inside the one\ntransaction; a partial fill or a cross-protocol forward opens further orders in\nlater transactions. All of them fold back into this one object, identified by\nthe transaction that started the chain.\n\nIdentity and timing come from that starting transaction — ``txHash`` is its\nhash, ``blockSlot`` and ``blockIndex`` locate it on chain, and ``timeSec`` is\nits block time as a unix second (a timestamp, not a slot). ``orderType`` is\nwhat was submitted: ``SWAP``, ``ZAP_IN``, ``ZAP_OUT``, ``DEPOSIT`` or\n``WITHDRAWAL``.\n\n``status`` is the aggregate over every folded execution, never one of them on\nits own — see the field for the full set of values.\n\n``offer``, ``minReceive``, ``received`` and ``remaining`` are per-token totals\nover the whole order, in base units, with intermediate hops excluded — a route\nthat goes from ADA through a middle token and out into some third token\nreports only the first and the last.\n\n``legs`` and ``route`` are the expensive parts of the answer. The list\nendpoint omits them unless they are asked for; the single-order endpoint\nalways returns both.","example":{"blockIndex":12,"blockSlot":141234560,"legCount":2,"legs":[{"dex":"Minswap","kind":"ammSwap","offer":{"amount":"60000000","unit":"lovelace"},"poolId":"6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2","received":{"amount":"48800000","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},"status":"FILLED","txHash":"3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f60718"},{"dex":"SundaeSwapV3","kind":"ammSwap","offer":{"amount":"40000000","unit":"lovelace"},"poolId":"0be55d262b29f564998ff81efe21bdc0022621c12f1cfa4a1b2c3d4e5f607182","received":{"amount":"32450000","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},"status":"FILLED","txHash":"3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f60718"}],"minReceive":[{"amount":"80000000","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}],"offer":[{"amount":"100000000","unit":"lovelace"}],"orderType":"SWAP","pair":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],"received":[{"amount":"81250000","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}],"route":{"inputUnit":"lovelace","isAcyclic":true,"legs":[{"dex":"Minswap","from":"lovelace","kind":"ammSwap","poolId":"6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2","to":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},{"dex":"SundaeSwapV3","from":"lovelace","kind":"ammSwap","poolId":"0be55d262b29f564998ff81efe21bdc0022621c12f1cfa4a1b2c3d4e5f607182","to":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}],"nodes":[{"kind":"token","unit":"lovelace"},{"kind":"token","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}],"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","paths":[["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]],"totalPaths":1},"source":{"brand":"steelswap"},"status":"FILLED","timeSec":1750000351,"txHash":"3f1c0b8a5d6e4720b93a1f8c47d25e60a9b3c8172d45f6e09a1b2c3d4e5f60718"}},"OrderListItem":{"properties":{"orderId":{"type":"string","title":"Orderid","description":"On-chain UTxO ref of the order, ``tx_hash#index``.","examples":["9b8b0e3544e9adc23a2e24df4365a8adcf671f4fe65fee3e52503a486cc2f026#0"]},"pair":{"items":{"type":"string"},"type":"array","title":"Pair","description":"The market's two asset units, ADA (``lovelace``) first."},"direction":{"type":"string","title":"Direction","description":"``sell`` offers the token for ADA; ``buy`` offers ADA."},"offer":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__AssetAmount"},"ask":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__AssetAmount"},"swapPrice":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__SwapPrice"},"ownerStake":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownerstake","description":"Owner's bech32 reward address (``stake1…``), when known.","examples":["stake1u9wqkas0j397kk6mnq20nfyw2wsqmyfjdax4ydxczmw2c2qwqnjzs"]},"status":{"type":"string","title":"Status","description":"``OPEN`` / ``LIMIT`` (resting), ``FILLED``, or ``CANCELLED``."},"available":{"type":"integer","title":"Available","description":"Unfilled remainder of ``offer``, in base units."},"ageSlots":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ageslots"}},"type":"object","required":["orderId","pair","direction","offer","ask","swapPrice","status","available"],"title":"OrderListItem","description":"One limit order.\n\n``pair`` is the market in canonical on-chain order — ``(policy_id,\nasset_name)`` with ADA first — so both directions of a market report the same\npair regardless of which leg this order offers. Every ATC market has an ADA\nleg, so ``direction`` reads against it: ``sell`` offers the token for ADA,\n``buy`` offers ADA for the token."},"OrderListResponse":{"properties":{"orders":{"items":{"$ref":"#/components/schemas/OrderListItem"},"type":"array","title":"Orders"},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},"type":"object","required":["orders"],"title":"OrderListResponse","description":"A page of live ATC orders."},"OrderRef":{"properties":{"txHash":{"type":"string","title":"Txhash","description":"Hash of the transaction that created the order.","examples":["754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9"]},"txIndex":{"type":"integer","title":"Txindex","description":"Zero-based index of the order output within that transaction.","examples":[0]}},"type":"object","required":["txHash","txIndex"],"title":"OrderRef","description":"A resting order's on-chain location: ``txHash`` + ``txIndex``.\n\nAn order is identified by the UTxO that holds it — the transaction that\nCREATED the order and that order output's index within it, not the index of\nthe swap that will fill it. The same ref is used to cancel an order\n(``POST /swap/cancel``) and to fold a cancel into a swap\n(``BuildRequest.cancelUtxos``).","example":{"txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txIndex":0}},"OrderStatus":{"properties":{"source":{"type":"string","title":"Source","default":""},"firstObserved":{"type":"integer","title":"Firstobserved","default":0},"lastUpdated":{"type":"integer","title":"Lastupdated","default":0},"totalSubmitted":{"additionalProperties":{"type":"integer"},"type":"object","title":"Totalsubmitted"},"totalRequested":{"additionalProperties":{"type":"integer"},"type":"object","title":"Totalrequested"},"totalReceived":{"additionalProperties":{"type":"integer"},"type":"object","title":"Totalreceived"},"swaps":{"items":{"$ref":"#/components/schemas/SwapStatus"},"type":"array","title":"Swaps"}},"type":"object","title":"OrderStatus","description":"A submit-tx group of legs; order-level totals render as objects."},"OrderStatusResponse":{"properties":{"orders":{"items":{"$ref":"#/components/schemas/OrderStatus"},"type":"array","title":"Orders"},"page":{"type":"integer","title":"Page","default":0},"lastPage":{"type":"integer","title":"Lastpage","default":0}},"type":"object","title":"OrderStatusResponse","description":"Paginated envelope of per-wallet order groups (V1 /wallet/history/)."},"OrderSummary":{"properties":{"pairBeacon":{"type":"string","title":"Pairbeacon"},"beaconAddress":{"type":"string","title":"Beaconaddress"},"offer":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__AssetAmount"},"ask":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__AssetAmount"},"swapPrice":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__SwapPrice"}},"type":"object","required":["pairBeacon","beaconAddress","offer","ask","swapPrice"],"title":"OrderSummary","description":"The placed order's on-chain identity + economics."},"OrderbookFillLeg":{"properties":{"dex":{"type":"string","title":"Dex","description":"The exchange this leg executed on, as a display label — ``Minswap``, ``SundaeSwapV3``, ``GeniusYield``, ``Djed``. Djed and Shen share one venue on chain and are labelled apart here by the token that moved."},"txHash":{"type":"string","title":"Txhash","description":"Hash of the transaction this leg itself lives in. For an order the wallet opened directly that is the group's own ``txHash``; for a continuation or a cross-protocol forward it is the later transaction that created it."},"status":{"type":"string","title":"Status","description":"This one execution's on-chain status — ``OPEN``, ``LIMIT``, ``FILLED``, ``CANCELLED``, ``ERROR``. It is not the group's aggregate ``status``: a filled leg can sit inside a group that is still ``PARTIALLY_FILLED``."},"offer":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"What this leg put in — the offered token and its base-unit amount."},"received":{"$ref":"#/components/schemas/steelswap__api__native__schemas__AssetAmount-Output","description":"What this leg took out. When the exact settled amount was not recorded on chain this falls back to the amount the order asked for, so read it as a lower bound rather than an exact figure."},"fillReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fillreason","description":"Why the leg is in its current state, when a reason was recorded — for example ``BELOW_ASK`` for a limit order still above the market, ``INSUFFICIENT_LIQUIDITY`` or ``EXPIRED``. Omitted when there is nothing to report."},"kind":{"type":"string","const":"orderbookFill","title":"Kind","default":"orderbookFill"},"swapPrice":{"anyOf":[{"$ref":"#/components/schemas/steelswap__api__native__schemas__SwapPrice"},{"type":"null"}],"description":"Reserved for the exact limit price of the matched order. Nothing populates it yet, so it is absent from every response today."}},"type":"object","required":["dex","txHash","status","offer","received"],"title":"OrderbookFillLeg","description":"A fill against an order book (``kind`` is ``orderbookFill``).\n\nCovers the order-matched venues — GeniusYield, CardanoSwaps and SaturnSwap.\nThere is no liquidity pool behind such a fill, so there is no ``poolId``.","example":{"dex":"GeniusYield","fillReason":"BELOW_ASK","kind":"orderbookFill","offer":{"amount":"25000000","unit":"lovelace"},"received":{"amount":"20100000","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},"status":"OPEN","txHash":"9a4d2e7c15b830f6a2c14d9e0b7f3a58c6d02e419b7f8a3c5d61e02f47b8c9d13"}},"OutputIdentity":{"properties":{"addressBech32":{"type":"string","title":"Addressbech32","description":"The target output's address (bech32)."},"datumHash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datumhash","description":"The target output's datum hash; omitted when it has no datum."},"legId":{"type":"string","title":"Legid","description":"The ``legId`` of the target output, disambiguating otherwise identical outputs."}},"type":"object","required":["addressBech32","legId"],"title":"OutputIdentity","description":"An output addressed by identity rather than by position.\n\nInterleaving your own outputs shifts every index, so a patch that needs to name\nan output names it by address and datum hash, with ``legId`` breaking ties\nbetween otherwise identical outputs."},"Page_OrderGroup_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrderGroup"},"type":"array","title":"Items"},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},"type":"object","required":["items"],"title":"Page[OrderGroup]","description":"A page of logical orders, newest first: ``{items, cursor?}``. ``cursor`` is opaque — pass it back to fetch the next page — and is omitted on the last page."},"Page_PairItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PairItem"},"type":"array","title":"Items"},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},"type":"object","required":["items"],"title":"Page[PairItem]","description":"A page of trading pairs in ranked order: ``{items, cursor?}``. ``cursor`` is opaque — pass it back to fetch the next page — and is omitted on the last page."},"Page_TokenListItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TokenListItem"},"type":"array","title":"Items"},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},"type":"object","required":["items"],"title":"Page[TokenListItem]","description":"A page of tokens in ranked order: ``{items, cursor?}``. ``cursor`` is opaque — pass it back to fetch the next page — and is omitted on the last page."},"PairInfo":{"properties":{"id":{"type":"string","title":"Id"},"dexKey":{"type":"string","title":"Dexkey"},"asset0Id":{"type":"string","title":"Asset0Id"},"asset1Id":{"type":"string","title":"Asset1Id"},"createdAtBlockNumber":{"type":"integer","title":"Createdatblocknumber"},"createdAtBlockTimestamp":{"type":"integer","title":"Createdatblocktimestamp"}},"type":"object","required":["id","dexKey","asset0Id","asset1Id","createdAtBlockNumber","createdAtBlockTimestamp"],"title":"PairInfo","description":"A liquidity pair."},"PairItem":{"properties":{"tokenA":{"$ref":"#/components/schemas/TokenRef"},"tokenB":{"$ref":"#/components/schemas/TokenRef"},"poolCount":{"type":"integer","title":"Poolcount"},"priceAda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Priceada"},"liquidityAda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Liquidityada"},"volume24hAda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume24Hada"}},"type":"object","required":["tokenA","tokenB","poolCount"],"title":"PairItem","description":"A tradeable pair: the two tokens (ADA-quoted) + ADA-denominated metrics.\n\n``tokenA`` is ADA (lovelace) for the ADA-quoted universe; ``priceAda`` is the\nADA price of ``tokenB``. ``poolCount`` is the number of pools backing the pair\n(from ``token_edge``). ``priceAda`` / ``liquidityAda`` / ``volume24hAda`` are\nomitted when unknown."},"PartnerAdminUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"metadata_lines":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Metadata Lines"},"reward_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reward Address"},"kind":{"anyOf":[{"$ref":"#/components/schemas/PartnerKind"},{"type":"null"}]},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"fee_bps":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Fee Bps"},"fee_split_bps":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Fee Split Bps"},"fee_flat_amount":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Fee Flat Amount"},"fee_threshold":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Fee Threshold"},"fixed_platform_fee_lovelace":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Fixed Platform Fee Lovelace"},"free_on_single_route":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Free On Single Route"},"fee_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fee Address"},"maintenance_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintenance Address"},"account_index":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Account Index"},"daily_quota":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Daily Quota"}},"additionalProperties":false,"type":"object","title":"PartnerAdminUpdate","description":"Owner partial-update body.\n\nAny subset of the editable partner/subscription fields. A field omitted from the\nbody is left unchanged; an explicit ``null`` clears a nullable field.\n``daily_quota`` is applied to the partner's baseline ``**`` scope."},"PartnerKind":{"type":"string","enum":["self_serve","integration"],"title":"PartnerKind","description":"Which population a ``Partner`` row belongs to (STEEL-325).\n\n- ``SELF_SERVE`` — wallet-provisioned API account (CIP-8 login, auto-tier);\n  identity is its ``stake_credential``; no fee config.\n- ``INTEGRATION`` — admin-curated fee-bearing partner (Eternl, Lace, …);\n  identity is its ``partner_id`` slug; carries the fee config + HD\n  ``account_index`` + partner-controlled reward/maintenance addresses."},"PartnerProfile":{"properties":{"partner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Id","description":"Admin slug (e.g. 'eternlagg')."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"kind":{"type":"string","title":"Kind","description":"PartnerKind: self_serve | integration."},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"fee_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Bps"},"fee_split_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Split Bps"},"fee_flat_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Flat Amount"},"fee_threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Threshold"},"fixed_platform_fee_lovelace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fixed Platform Fee Lovelace"},"free_on_single_route":{"type":"boolean","title":"Free On Single Route","default":false},"reward_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reward Address"},"fee_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fee Address"},"maintenance_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintenance Address"},"account_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Account Index"},"metadata_lines":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Metadata Lines"},"api_keys":{"items":{"$ref":"#/components/schemas/ApiKeyListItem"},"type":"array","title":"Api Keys"},"usage":{"$ref":"#/components/schemas/PartnerUsageStats"}},"type":"object","required":["kind","created_at","usage"],"title":"PartnerProfile","description":"The logged-in wallet's own ``Partner`` account view."},"PartnerProfileUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"metadata_lines":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Metadata Lines"}},"additionalProperties":false,"type":"object","title":"PartnerProfileUpdate","description":"Editable display fields. ``extra='forbid'`` rejects any other field.\n\nOnly fields actually present in the request body are applied (partial PATCH),\nso omitting a field leaves it unchanged while explicitly sending ``null``\nclears it. A request carrying a non-display field (e.g. ``fee_bps``) is a 422 —\nthe structural guard that keeps fee/commercial terms unwritable here. ``name``\nis accepted here but rejected at apply time (``409``) for a fee-collecting\naccount, where it doubles as the on-chain fee-attribution tag (see\n:func:`update_partner`)."},"PartnerSummary":{"properties":{"id":{"type":"integer","title":"Id","description":"Surrogate partner id — the {partner_id} path param for writes."},"partner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Id","description":"Admin slug (e.g. 'eternlagg')."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"kind":{"type":"string","title":"Kind"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"fee_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Bps"},"fee_split_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Split Bps"},"fee_flat_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Flat Amount"},"fee_threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Threshold"},"fixed_platform_fee_lovelace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fixed Platform Fee Lovelace"},"free_on_single_route":{"type":"boolean","title":"Free On Single Route","default":false},"reward_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reward Address"},"fee_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fee Address"},"maintenance_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintenance Address"},"account_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Account Index"}},"type":"object","required":["id","kind","is_active","created_at"],"title":"PartnerSummary","description":"One partner account at a glance — config + status, no on-chain reads.\n\nThe index view for admin oversight; the on-chain activity (balance, payouts,\nfee analytics) is fetched per partner via ``?partner=<slug>`` on the\n``/api/v2/fees/*`` reads, so this list stays a single cheap DB query."},"PartnerUsageStats":{"properties":{"requests_today":{"type":"integer","title":"Requests Today","description":"UTC-day request count (baseline)."},"daily_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Quota","description":"Baseline-scope daily request quota; null = unlimited."},"within_quota":{"type":"boolean","title":"Within Quota","description":"False once today's count is over."}},"type":"object","required":["requests_today","within_quota"],"title":"PartnerUsageStats","description":"Today's per-account request usage against the baseline (``**``) scope."},"PartnerYieldOut":{"properties":{"id":{"type":"integer","title":"Id","description":"Surrogate partner id (stable, always present)."},"partner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Id","description":"Admin slug (e.g. 'eternlagg')."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"kind":{"type":"string","title":"Kind"},"total_requests":{"type":"integer","title":"Total Requests"},"built_fees_lovelace":{"type":"integer","title":"Built Fees Lovelace"},"rev_per_million_hits":{"type":"number","title":"Rev Per Million Hits"},"flagged":{"type":"boolean","title":"Flagged"}},"type":"object","required":["id","kind","total_requests","built_fees_lovelace","rev_per_million_hits","flagged"],"title":"PartnerYieldOut","description":"One partner's revenue-per-hit over the window (admin abuse view).\n\n``rev_per_million_hits`` is ``1e6 * built_fees_lovelace / total_requests``.\nRanked ascending (lowest yield first); ``flagged`` marks the bottom percentile\nwhen the distribution has real dispersion. The numerator is the fee EACH build\ncharges, so the ratio is meaningful for BOTH integration partners\n(partner fee) and self-serve durable keys (the SteelSwap service fee — a real\ncharge, ``>= 1 ADA`` on any routed/multi-hop build). Only a key doing\nexclusively fee-exempt single-direct-DEX swaps yields ~0. ``id`` (the surrogate\npartner id) is always present so a flagged self-serve key — whose ``partner_id``\nslug and ``name`` are null — stays identifiable."},"Patch":{"properties":{"target":{"$ref":"#/components/schemas/PatchTarget","description":"Where the index is written."},"source":{"$ref":"#/components/schemas/PatchSource","description":"Where the index is read from."}},"type":"object","required":["target","source"],"title":"Patch","description":"One index rewrite.\n\nRead the index described by ``source``, write it where ``target`` says."},"PatchSource":{"properties":{"kind":{"type":"string","enum":["spendIndexOf","inputIndexOf","outputIndexOf"],"title":"Kind","description":"``spendIndexOf`` and ``inputIndexOf``: the position of ``input`` once your complete input set is sorted canonically. ``outputIndexOf``: the position of ``output`` in your final output list."},"input":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input","description":"The input to locate, as ``txHash#index``. Present for the input kinds."},"output":{"anyOf":[{"$ref":"#/components/schemas/OutputIdentity"},{"type":"null"}],"description":"The output to locate, described by identity rather than position. Present for ``outputIndexOf``."}},"type":"object","required":["kind"],"title":"PatchSource","description":"Where a patch reads an index FROM, evaluated against your final layout."},"PatchTarget":{"properties":{"kind":{"type":"string","enum":["keyIndex","field","byteRange"],"title":"Kind","description":"``keyIndex``: the redeemer's key in the witness map, outside the redeemer data. ``field``: a constructor field inside the redeemer, at ``fieldIndex``. ``byteRange``: a span of the decoded redeemer bytestring, at ``byteOffset`` for ``width`` bytes."},"fieldIndex":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fieldindex","description":"Zero-based position of the constructor field to overwrite. Present for ``field``."},"fieldName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fieldname","description":"Human-readable name of that field. A hint for readers only — patch by ``fieldIndex``."},"byteOffset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Byteoffset","description":"Byte offset into the DECODED redeemer bytestring, after unwrapping its CBOR bytestring header. Present for ``byteRange``."},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"How many bytes the index occupies at ``byteOffset``. Present for ``byteRange``."}},"type":"object","required":["kind"],"title":"PatchTarget","description":"Where a patch writes the index TO."},"PayoutEntry":{"properties":{"txHash":{"type":"string","title":"Txhash"},"time":{"type":"integer","title":"Time"},"amount":{"type":"string","title":"Amount"}},"type":"object","required":["txHash","time","amount"],"title":"PayoutEntry","description":"One on-chain payout to the account's reward address.\n\n``txHash`` is the 64-character hex hash of the disbursement transaction,\n``time`` its block time as unix epoch **seconds** (UTC), and ``amount`` the\n**lovelace** that transaction delivered to the reward address, as a decimal\nstring. When a single transaction pays the reward address more than once, the\noutputs are summed into one entry.","example":{"amount":"512000000","time":1784678400,"txHash":"9e279d50debf3fac1ff8dae477b858c900b86475fdfaa9397da9431a2efc3044"}},"PayoutsResponse":{"properties":{"rewardAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rewardaddress"},"totalPaid":{"type":"string","title":"Totalpaid"},"total":{"type":"integer","title":"Total","default":0},"payouts":{"items":{"$ref":"#/components/schemas/PayoutEntry"},"type":"array","title":"Payouts"}},"type":"object","required":["rewardAddress","totalPaid","payouts"],"title":"PayoutsResponse","description":"An account's payout history: lifetime total paid, plus one page of payouts.\n\nPayouts are reconstructed from chain data — outputs landing at\n``rewardAddress`` from transactions that also spent the account's fee address.\nTwo DISTINCT totals: ``totalPaid`` is the lifetime **lovelace** sum across\nevery payout ever made (a decimal string), while ``total`` is the COUNT of\npayout transactions across all pages (the pager's denominator, not the length\nof this page). ``payouts`` is the requested page, newest first.\n\n``rewardAddress`` is ``null`` when the account has set no payout destination;\nthat case, and an account with no fee stream, return ``totalPaid`` ``\"0\"``,\n``total`` ``0`` and an empty ``payouts``.","example":{"payouts":[{"amount":"512000000","time":1784678400,"txHash":"9e279d50debf3fac1ff8dae477b858c900b86475fdfaa9397da9431a2efc3044"},{"amount":"504500000","time":1783900800,"txHash":"8ce3ccb206596666f14d5688021d5ee79a5331179737e5038ffe14c9e295f7cb"}],"rewardAddress":"addr1qyu5yhy34lpfwan66gjwk7y4ec4vwjp6z4xg9k5vj89t48xqrmzmntkel6wpnp38sfqm9ga7emx5ucel79ykm0qk3wgql3t6js","total":6,"totalPaid":"3072000000"}},"PoolOutput":{"properties":{"dex":{"type":"string","title":"Dex"},"poolId":{"type":"string","title":"Poolid"},"quantityA":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Quantitya"},"quantityB":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Quantityb"},"batcherFee":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Batcherfee"},"deposit":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Deposit"},"volumeFee":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Volumefee"}},"type":"object","required":["dex","poolId","quantityA","quantityB","batcherFee","deposit","volumeFee"],"title":"PoolOutput","description":"Inputs and outputs for a specific pool."},"PoolPair":{"properties":{"tokenA":{"type":"string","title":"Tokena"},"tokenB":{"type":"string","title":"Tokenb"}},"type":"object","required":["tokenA","tokenB"],"title":"PoolPair","description":"Unordered token pair request body (V1 /tokens/pools/)."},"PoolPairOrders":{"properties":{"tokenA":{"type":"string","title":"Tokena"},"tokenB":{"type":"string","title":"Tokenb"},"limit":{"type":"integer","title":"Limit","default":10}},"type":"object","required":["tokenA","tokenB"],"title":"PoolPairOrders","description":"Pair request body with a result cap (V1 /tokens/orders/)."},"PoolSummary":{"properties":{"liquidity":{"type":"integer","title":"Liquidity","default":0},"priceNumerator":{"type":"integer","title":"Pricenumerator","default":0},"priceDenominator":{"type":"integer","title":"Pricedenominator","default":0},"poolCount":{"type":"integer","title":"Poolcount","default":0}},"type":"object","title":"PoolSummary","description":"Per-DEX aggregate liquidity + reserve ratio for a pair (V1 /tokens/pools/)."},"PoolSummaryResponse":{"additionalProperties":{"$ref":"#/components/schemas/PoolSummary"},"type":"object","title":"PoolSummaryResponse","description":"Bare JSON object keyed by DEX display name (V1 /tokens/pools/ shape)."},"PortfolioValuePoint":{"properties":{"time":{"type":"integer","title":"Time"},"value":{"type":"number","title":"Value"}},"type":"object","required":["time","value"],"title":"PortfolioValuePoint","description":"One snapshot of a wallet's total value at a point in time (bare-array item).","example":{"time":1781568000,"value":18230.42}},"PositionFt":{"properties":{"unit":{"type":"string","title":"Unit"},"ticker":{"type":"string","title":"Ticker"},"fingerprint":{"type":"string","title":"Fingerprint"},"balance":{"type":"number","title":"Balance"},"price":{"type":"number","title":"Price"},"adaValue":{"type":"number","title":"Adavalue"},"liquidBalance":{"type":"number","title":"Liquidbalance"},"liquidValue":{"type":"number","title":"Liquidvalue"},"24h":{"type":"number","title":"24H"},"7d":{"type":"number","title":"7D"},"30d":{"type":"number","title":"30D"}},"type":"object","required":["unit","ticker","fingerprint","balance","price","adaValue","liquidBalance","liquidValue","24h","7d","30d"],"title":"PositionFt","description":"A fungible token portfolio position."},"PositionLp":{"properties":{"unit":{"type":"string","title":"Unit"},"ticker":{"type":"string","title":"Ticker"},"exchange":{"type":"string","title":"Exchange"},"amountLP":{"type":"number","title":"Amountlp"},"tokenA":{"type":"string","title":"Tokena"},"tokenAName":{"type":"string","title":"Tokenaname"},"tokenAAmount":{"type":"number","title":"Tokenaamount"},"tokenB":{"type":"string","title":"Tokenb"},"tokenBName":{"type":"string","title":"Tokenbname"},"tokenBAmount":{"type":"number","title":"Tokenbamount"},"adaValue":{"type":"number","title":"Adavalue"}},"type":"object","required":["unit","ticker","exchange","amountLP","tokenA","tokenAName","tokenAAmount","tokenB","tokenBName","tokenBAmount","adaValue"],"title":"PositionLp","description":"An LP token portfolio position."},"QuoteResponse":{"properties":{"offer":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__AssetAmount"},"ask":{"$ref":"#/components/schemas/steelswap__api__atc__schemas__AssetAmount"},"referencePrice":{"type":"string","title":"Referenceprice"},"price":{"type":"string","title":"Price"},"priceSource":{"type":"string","enum":["coinbase","onchain"],"title":"Pricesource"},"offsetBps":{"type":"integer","title":"Offsetbps"},"asOf":{"type":"number","title":"Asof"},"ageS":{"type":"number","title":"Ages"},"indexerLagS":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Indexerlags"},"insufficientDepth":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Insufficientdepth"},"filledOfferAmount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Filledofferamount"}},"type":"object","required":["offer","ask","referencePrice","price","priceSource","offsetBps","asOf","ageS"],"title":"QuoteResponse","description":"A recommended limit price for an ADA-paired swap.\n\n``price`` is **ask-per-offer in whole units** — the orientation the order\ndatum's ``swap_price`` uses, so it drops straight into a CREATE. On the\n``coinbase`` path it is the size-weighted book walk LESS ``offsetBps``; on the\n``onchain`` path it is the aggregate on-chain price and ``offsetBps`` is 0.\n``ask.amount`` is the authoritative integer (always floored); the two price\nstrings are informational.\n\n``insufficientDepth`` / ``filledOfferAmount`` are ``null`` on the ``onchain``\npath — that price is size-blind, and defaulting them would assert depth we\nnever checked. When ``insufficientDepth`` is true, the prices and ``ask``\ndescribe ONLY ``filledOfferAmount``, not the requested size.\n\n``ageS`` is advisory on both paths. On ``onchain`` it is the age of the candle\nbucket, i.e. time since the pair last MOVED — not a validity deadline. The\nenforced staleness axis is ``indexerLagS``."},"RedeemerBlock":{"properties":{"purpose":{"type":"string","enum":["spend","mint"],"title":"Purpose","description":"Which redeemer slot this belongs to."},"spends":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spends","description":"The input this redeemer authorises, as ``txHash#index``. Present for ``spend``."},"redeemerCbor":{"type":"string","title":"Redeemercbor","description":"The redeemer as CBOR hex, still carrying OUR indices."},"encoding":{"type":"string","enum":["plutusData","packedBytes"],"title":"Encoding","description":"How a ``field`` or ``byteRange`` patch is applied: ``plutusData`` rewrites a decoded constructor field, ``packedBytes`` rewrites raw bytes inside the redeemer's bytestring."},"patches":{"items":{"$ref":"#/components/schemas/Patch"},"type":"array","title":"Patches","description":"Every index rewrite to apply before re-encoding. An empty list means the template is already correct."}},"type":"object","required":["purpose","redeemerCbor","encoding"],"title":"RedeemerBlock","description":"A redeemer template plus the instructions to re-index it.\n\nRedeemers reference inputs and outputs by POSITION, and your final transaction\nwill not have the same positions as ours. So the redeemer arrives with our\nindices baked in: decode ``redeemerCbor``, apply every ``patch`` against your\nown final layout, set the witness map key index, and re-encode."},"ReferenceInput":{"properties":{"ref":{"type":"string","title":"Ref","description":"The reference UTxO as ``txHash#index``.","examples":["754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9#0"]},"scriptCbor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scriptcbor","description":"Reserved. Not currently populated — the validator lives on-chain at ``ref``, so the ledger reads it from there."},"plutusVersion":{"anyOf":[{"type":"string","enum":["v1","v2","v3"]},{"type":"null"}],"title":"Plutusversion","description":"Plutus language version of the referenced validator, when known."}},"type":"object","required":["ref"],"title":"ReferenceInput","description":"A read-only reference input to include, typically a published validator."},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token","description":"The opaque refresh token to rotate."}},"type":"object","required":["refresh_token"],"title":"RefreshRequest","description":"Request body for ``POST /auth/refresh``."},"RefundSkipped":{"properties":{"txHash":{"type":"string","title":"Txhash","description":"The cancelled order's creating transaction (not the fee output)."},"txIndex":{"type":"integer","title":"Txindex","description":"The cancelled order's output index."},"reason":{"type":"string","title":"Reason","description":"Stable machine code. ``dex_excluded``: this venue's cancel must return an exact value, which leaves no room for the refund. ``no_signing_key``: the server has no channel able to release the fee. ``fee_utxo_unavailable``: the original fee output could not be found or is already spent.","examples":["fee_utxo_unavailable"]}},"type":"object","required":["txHash","txIndex","reason"],"title":"RefundSkipped","description":"A cancelled order whose original transaction fee could not be refunded.\n\nThe cancel itself still built and is in ``transactions`` — only the fee refund\nwas left out, so the wallet reclaims the order's value but not the fee it paid\nto create it."},"RouteDag":{"properties":{"inputUnit":{"type":"string","title":"Inputunit","description":"The unit the routes start from, as requested."},"outputUnit":{"type":"string","title":"Outputunit","description":"The unit the routes end at, as requested."},"totalPaths":{"type":"integer","title":"Totalpaths","description":"Number of entries in ``paths``. ``0`` means no route was found."},"isAcyclic":{"type":"boolean","title":"Isacyclic","description":"Whether the directed graph formed by ``legs`` contains no cycle. Two tokens that can be traded in both directions across different paths make it ``false``."},"nodes":{"items":{"$ref":"#/components/schemas/RouteNode"},"type":"array","title":"Nodes","description":"The distinct tokens appearing in any path."},"legs":{"items":{"$ref":"#/components/schemas/RouteLeg"},"type":"array","title":"Legs","description":"The distinct directed pool hops appearing in any path. A pool shared by several paths is listed once per direction."},"paths":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"Paths","description":"One entry per enumerated route: the sequence of units it passes through, starting at ``inputUnit`` and ending at ``outputUnit``. Two routes over the same tokens but different pools appear as two identical sequences."}},"type":"object","required":["inputUnit","outputUnit","totalPaths","isAcyclic","nodes","legs","paths"],"title":"RouteDag","description":"Every route the solver may consider between two tokens, as a graph.\n\nStructure only — which tokens connect through which pools, with no amounts and\nno pricing. Use it to explain or visualise routing; use ``POST /swap/estimate``\nto find out what a trade is actually worth.\n\nA pair with no route is a normal ``200`` carrying an empty graph\n(``totalPaths`` of ``0``), not a ``404``.","example":{"inputUnit":"lovelace","isAcyclic":true,"legs":[{"dex":"MinswapV2","from":"lovelace","kind":"ammSwap","poolId":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c","to":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},{"dex":"SundaeSwapV3","from":"lovelace","kind":"ammSwap","poolId":"7dd6988c5a86693c76aeec1ea94afa41770be0de21a775ca7a2a1eab","to":"29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c64d494e"},{"dex":"MinswapV2","from":"29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c64d494e","kind":"ammSwap","poolId":"21a775ca7a2a1eabdb6a01717dd6988c5a86693c76aeec1ea94afa41","to":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}],"nodes":[{"kind":"token","unit":"lovelace"},{"kind":"token","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"},{"kind":"token","unit":"29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c64d494e"}],"outputUnit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","paths":[["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"],["lovelace","29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c64d494e","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]],"totalPaths":2}},"RouteLeg":{"properties":{"kind":{"type":"string","title":"Kind","description":"Leg variant. Currently always ``\"ammSwap\"``.","default":"ammSwap"},"poolId":{"type":"string","title":"Poolid","description":"On-chain identifier of the pool backing the hop."},"dex":{"type":"string","title":"Dex","description":"Brand of the pool backing the hop.","examples":["MinswapV2"]},"from":{"type":"string","title":"From","description":"Unit the hop trades away, sent on the wire as ``from``."},"to":{"type":"string","title":"To","description":"Unit the hop trades into, sent on the wire as ``to``."}},"type":"object","required":["poolId","dex","from","to"],"title":"RouteLeg","description":"One pool hop of a routing graph — a directed edge between two tokens.\n\nStructure only, no amounts: the edge says a pool can trade ``from`` into\n``to``, not how much. The same pool appears once per direction it is used in."},"RouteNode":{"properties":{"kind":{"type":"string","const":"token","title":"Kind","description":"Vertex variant. Always ``\"token\"``.","default":"token"},"unit":{"type":"string","title":"Unit","description":"The token's on-chain unit, or ``\"lovelace\"`` for ADA."}},"type":"object","required":["unit"],"title":"RouteNode","description":"One vertex of a routing graph — a token, identified by its ``unit``.\n\nStructure only: no metadata is inlined here."},"ScriptBlock":{"properties":{"kind":{"type":"string","enum":["ref","attached"],"title":"Kind","description":"``ref``: the validator is published on-chain and matched by hash against a reference input, so no bytes are carried. ``attached``: put the ``cbor`` bytes in the witness set yourself."},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref","description":"The reference input holding the validator, as ``txHash#index``. Present for ``ref``."},"cbor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cbor","description":"The validator as CBOR hex. Present for ``attached``."},"plutusVersion":{"type":"string","enum":["v1","v2","v3"],"title":"Plutusversion","description":"Plutus language version the validator is written in."}},"type":"object","required":["kind","plutusVersion"],"title":"ScriptBlock","description":"The validator that locks a script input — referenced on-chain or attached.\n\nNot every validator is published on-chain. When ``kind`` is ``attached`` the\nvalidator bytes are supplied here and MUST be placed in the witness set, or the\ninput cannot be spent."},"ScriptIntegrity":{"properties":{"plutusVersion":{"type":"string","enum":["v1","v2","v3"],"title":"Plutusversion","description":"The Plutus version every script input in this response uses."}},"type":"object","required":["plutusVersion"],"title":"ScriptIntegrity","description":"The single Plutus version shared by every script input in the block set.\n\nOne transaction can only carry one language's cost models, so a route whose\nscript inputs span two Plutus versions is rejected rather than returned."},"ServicePlanCreate":{"properties":{"name":{"type":"string","maxLength":64,"title":"Name","description":"Unique catalog plan name."},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Description"},"fee_lovelace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Lovelace","description":"Price in lovelace; billing-only."},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Path globs granted; defaults to ['**'] when empty."},"reqs_per_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reqs Per Sec"},"burst_multiplier":{"type":"number","title":"Burst Multiplier","default":1.5},"daily_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Quota"}},"additionalProperties":false,"type":"object","required":["name"],"title":"ServicePlanCreate","description":"Fields to create a new catalog plan. Unknown fields are rejected."},"ServicePlanOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"fee_lovelace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Lovelace"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"reqs_per_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reqs Per Sec"},"burst_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Burst Multiplier"},"daily_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Quota"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","is_active","created_at","updated_at"],"title":"ServicePlanOut","description":"One catalog plan — the full row, admin-facing."},"ServicePlanUpdate":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"fee_lovelace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fee Lovelace"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"reqs_per_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reqs Per Sec"},"burst_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Burst Multiplier"},"daily_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Quota"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"additionalProperties":false,"type":"object","title":"ServicePlanUpdate","description":"Partial-update fields; only fields present in the request are applied."},"ServiceRowOut":{"properties":{"id":{"type":"integer","title":"Id"},"path_glob":{"type":"string","title":"Path Glob"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Id"},"reqs_per_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reqs Per Sec"},"burst_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Burst Multiplier"},"daily_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Quota"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","path_glob","is_active","created_at","updated_at"],"title":"ServiceRowOut","description":"One granted/ad-hoc ``Service`` (scope) row."},"SkippedOrder":{"properties":{"txHash":{"type":"string","title":"Txhash","description":"The requested order's creating transaction."},"txIndex":{"type":"integer","title":"Txindex","description":"The requested order's output index."},"reason":{"type":"string","title":"Reason","description":"Stable machine code. ``not_found``: no such order is indexed (also a just-submitted order that has not been ingested yet). ``already_executed``: the order filled, was already cancelled, or its UTxO is otherwise spent. ``not_cancellable``: the order is not in a resting state. ``unknown_dex``: the order belongs to a venue this API cannot build a cancel for. ``axo``: Axo orders cannot be cancelled on-chain.","examples":["already_executed"]}},"type":"object","required":["txHash","txIndex","reason"],"title":"SkippedOrder","description":"An order that was NOT cancelled, and why.\n\nA skipped entry is informational, not an error: the rest of the batch still\nbuilt. ``not_found`` is often a timing artefact — an order submitted moments\nago is not indexed yet — and is worth retrying; the others are terminal."},"Source":{"properties":{"brand":{"type":"string","title":"Brand"},"partner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner"}},"type":"object","required":["brand"],"title":"Source","description":"Provenance: a normalized ``brand`` and an optional sub-channel ``partner``.\n\nMirrors ``Transaction.source`` / ``Transaction.source_partner``; ``partner``\nis omitted when absent."},"SplitOutput":{"properties":{"tokenA":{"type":"string","title":"Tokena"},"quantityA":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Quantitya"},"tokenB":{"type":"string","title":"Tokenb"},"quantityB":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Quantityb"},"totalFee":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Totalfee"},"totalDeposit":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Totaldeposit"},"steelswapFee":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Steelswapfee"},"bonusOut":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Bonusout"},"price":{"type":"number","title":"Price"},"pools":{"items":{"$ref":"#/components/schemas/PoolOutput"},"type":"array","title":"Pools"}},"type":"object","required":["tokenA","quantityA","tokenB","quantityB","totalFee","totalDeposit","steelswapFee","bonusOut","price","pools"],"title":"SplitOutput","description":"Inputs and outputs for a specific pool."},"SwapEstimate":{"properties":{"tokenA":{"type":"string","title":"Tokena"},"tokenB":{"type":"string","title":"Tokenb"},"quantity":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Quantity"},"predictFromOutputAmount":{"type":"boolean","title":"Predictfromoutputamount","default":false},"ignoreDexes":{"items":{"type":"string"},"type":"array","title":"Ignoredexes"},"partner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner"},"hop":{"type":"boolean","title":"Hop","default":false},"da":{"anyOf":[{"items":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]},"type":"object"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Da","default":""},"isFloat":{"type":"boolean","title":"Isfloat","default":false}},"type":"object","required":["tokenA","tokenB","quantity"],"title":"SwapEstimate","description":"Post body for a swap estimate request (V1 ``models.py:623-634``).\n\ncamelCase wire fields: ``tokenA``, ``tokenB``, ``quantity``,\n``predictFromOutputAmount``, ``ignoreDexes`` (server always appends\n``\"MuesliSwap\"``), ``partner`` (ignored — the partner is derived from the\nAPI key), ``hop``, ``da`` (discount assets, applied only when not\npredict-from-output), ``isFloat``."},"SwapHistoryRequest":{"properties":{"addresses":{"items":{"type":"string"},"type":"array","title":"Addresses"},"txType":{"items":{"type":"string"},"type":"array","title":"Txtype"},"page":{"type":"integer","title":"Page","default":0},"pageSize":{"type":"integer","title":"Pagesize","default":25}},"type":"object","required":["addresses"],"title":"SwapHistoryRequest","description":"V1 wallet history/pending request body (tx_type accepted, ignored)."},"SwapStatus":{"properties":{"dex":{"type":"string","title":"Dex","default":""},"orderType":{"type":"integer","title":"Ordertype","default":0},"txStatus":{"type":"string","title":"Txstatus","default":""},"submitTxHash":{"type":"string","title":"Submittxhash","default":""},"submitTxIndex":{"type":"integer","title":"Submittxindex","default":0},"submitTime":{"type":"integer","title":"Submittime","default":0},"submitAssets":{"anyOf":[{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Submitassets"},"requestAssets":{"anyOf":[{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Requestassets"},"executeTxHash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executetxhash"},"executeTxIndex":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Executetxindex"},"executeTime":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Executetime"},"receivedAssets":{"anyOf":[{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Receivedassets"}},"type":"object","title":"SwapStatus","description":"One order leg in V1 shape; per-leg asset bags render as lists."},"TokenHolders":{"properties":{"holders":{"type":"integer","title":"Holders"}},"type":"object","required":["holders"],"title":"TokenHolders","description":"Total number of holders of a token, with addresses stake-key deduplicated.","example":{"holders":39990}},"TokenLinks":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"discord":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"facebook":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facebook"},"github":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github"},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram"},"logo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo"},"medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Medium"},"reddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reddit"},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telegram"},"twitter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube"}},"type":"object","title":"TokenLinks","description":"Social and website links for a token.","example":{"logo":"iVBORw0KGgoAAAANSUhEUgAABLAAAASwCAMAAADc/0P9AAAC…(base64-encoded PNG, truncated)","telegram":"https://t.me/snekcoinada","twitter":"https://twitter.com/snekcoinada","website":"https://linktr.ee/snekcoinada"}},"TokenListItem":{"properties":{"token":{"$ref":"#/components/schemas/TokenRef"},"verified":{"type":"boolean","title":"Verified","default":false},"priceAda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Priceada"},"liquidityAda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Liquidityada"},"volume24hAda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume24Hada"}},"type":"object","required":["token"],"title":"TokenListItem","description":"One row of the token list: the token metadata + its ADA-denominated metrics.\n\n``verified`` is the curated-safety flag (SteelSwap or the Cardano Token\nRegistry). ``priceAda`` / ``liquidityAda`` / ``volume24hAda`` are all\nADA-denominated and omitted when unknown."},"TokenMcap":{"properties":{"ticker":{"type":"string","title":"Ticker"},"price":{"type":"number","title":"Price"},"circSupply":{"type":"number","title":"Circsupply"},"totalSupply":{"type":"number","title":"Totalsupply"},"mcap":{"type":"number","title":"Mcap"},"fdv":{"type":"number","title":"Fdv"}},"type":"object","required":["ticker","price","circSupply","totalSupply","mcap","fdv"],"title":"TokenMcap","description":"A token's market-capitalization metrics.\n\n``price`` is ADA per whole token; ``circSupply`` / ``totalSupply`` are whole\ntokens; ``mcap`` is ``circSupply * price`` and ``fdv`` is\n``totalSupply * price``, both in ADA. ``ticker`` is ``\"\"`` when the token has\nnone in the registry.","example":{"circSupply":76715880000.0,"fdv":176455658.15,"mcap":176455658.15,"price":0.00230011906466846,"ticker":"SNEK","totalSupply":76715880000.0}},"TokenOHLCV":{"properties":{"time":{"type":"integer","title":"Time"},"open":{"type":"number","title":"Open"},"high":{"type":"number","title":"High"},"low":{"type":"number","title":"Low"},"close":{"type":"number","title":"Close"},"volume":{"type":"number","title":"Volume"}},"type":"object","required":["time","open","high","low","close","volume"],"title":"TokenOHLCV","description":"A single OHLCV candle for a token.\n\n``time`` is the candle's start in unix seconds. ``open`` / ``high`` / ``low``\n/ ``close`` are ADA per whole token; ``volume`` is the ADA traded in the\ncandle.","example":{"close":0.002337201613461359,"high":0.0024618505159747905,"low":0.002329895617950462,"open":0.0023663597299704744,"time":1781654400,"volume":271504.1438160005}},"TokenPool":{"properties":{"tokenA":{"type":"string","title":"Tokena"},"tokenATicker":{"type":"string","title":"Tokenaticker"},"tokenB":{"type":"string","title":"Tokenb"},"tokenBTicker":{"type":"string","title":"Tokenbticker"},"lpTokenUnit":{"type":"string","title":"Lptokenunit"},"onchainID":{"type":"string","title":"Onchainid"},"tokenALocked":{"type":"number","title":"Tokenalocked"},"tokenBLocked":{"type":"number","title":"Tokenblocked"},"exchange":{"type":"string","title":"Exchange"}},"type":"object","required":["tokenA","tokenATicker","tokenB","tokenBTicker","lpTokenUnit","onchainID","tokenALocked","tokenBLocked","exchange"],"title":"TokenPool","description":"A liquidity pool that includes the token.\n\n``tokenA`` / ``tokenB`` are on-chain units (``lovelace`` for ADA) in canonical\norder, and ``tokenALocked`` / ``tokenBLocked`` are the matching sides of the\npool's latest reserves as whole tokens (decimal-adjusted). ``onchainID`` is\nthe pool's on-chain id — the value ``/token/pools`` accepts back as its\n``onchainID`` filter and ``/integration/pair`` accepts as ``id``. A ticker is\n``\"\"`` when the token has none in the registry, and ``lpTokenUnit`` is ``\"\"``\nfor a DEX that mints no LP token.","example":{"exchange":"VyFinance","lpTokenUnit":"","onchainID":"96c31772282e6ae5c629120471c5bbcdef538226b31b97d74c50ca3c","tokenA":"lovelace","tokenALocked":87185.267197,"tokenATicker":"ADA","tokenB":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","tokenBLocked":37974334.0,"tokenBTicker":"SNEK"}},"TokenPriceChangeBatchRequest":{"properties":{"units":{"items":{"type":"string"},"type":"array","title":"Units"},"timeframes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Timeframes"}},"type":"object","required":["units"],"title":"TokenPriceChangeBatchRequest","description":"Request body for the batch token price-change endpoint (SteelSwap extension).\n\n``units`` are token unit strings (max 100); ``timeframes`` is an optional subset\nof 5m/1h/4h/6h/24h/7d/30d/60d/90d (all by default).","example":{"timeframes":["24h","7d"],"units":["279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]}},"TokenQuote":{"properties":{"price":{"type":"number","title":"Price"}},"type":"object","required":["price"],"title":"TokenQuote","description":"Quote price of 1 ADA in the requested currency.","example":{"price":0.1638}},"TokenRef":{"properties":{"unit":{"type":"string","title":"Unit","description":"On-chain asset unit (policy id hex + asset name hex, or \"lovelace\")."},"policyId":{"type":"string","title":"Policyid","description":"Minting policy id hex; ``\"\"`` for lovelace."},"assetName":{"type":"string","title":"Assetname","description":"Asset name hex (not UTF-8 decoded); ``\"\"`` for lovelace."},"decimals":{"type":"integer","title":"Decimals","description":"Decimal places used to render the token. Always present; ``0`` is also the fallback when the real value is unknown — check ``decimalsKnown`` before formatting with it.","default":0},"decimalsKnown":{"type":"boolean","title":"Decimalsknown","description":"``true`` when ``decimals`` came from token metadata rather than the fallback. Never format an amount for display while this is ``false``.","default":false},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker","description":"Short display symbol; omitted when unknown."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Human-readable token name; omitted when unknown."},"logoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logourl","description":"Token logo URL; omitted when unknown."}},"type":"object","required":["unit","policyId","assetName"],"title":"TokenRef","description":"Token metadata, collected once per response in a top-level ``tokens[]``.\n\n``policyId``/``assetName`` are ``\"\"`` for lovelace. ``decimals`` is always\npresent (default 0); ``decimalsKnown`` gates client-side formatting — never\nformat with ``decimals`` when it is ``false``. ``ticker``/``name``/\n``logoUrl`` are omitted when unknown.","example":{"assetName":"534e454b","decimals":0,"decimalsKnown":true,"name":"Snek","policyId":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f","ticker":"SNEK","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}},"TokenRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"TokenRequest","description":"Single-token request body (V1 /tokens/price/usd/, /tokens/find-pairs/)."},"TokenSummary":{"properties":{"ticker":{"type":"string","title":"Ticker","default":""},"name":{"type":"string","title":"Name","default":""},"policyId":{"type":"string","title":"Policyid"},"policyName":{"type":"string","title":"Policyname"},"decimals":{"type":"integer","title":"Decimals","default":0},"priceNumerator":{"type":"integer","title":"Pricenumerator","default":0},"priceDenominator":{"type":"integer","title":"Pricedenominator","default":0},"sources":{"items":{"type":"string"},"type":"array","title":"Sources"}},"type":"object","required":["policyId","policyName"],"title":"TokenSummary","description":"V1 token summary row (find-pairs / list projections of ``Token``)."},"TokenTopHolder":{"properties":{"address":{"type":"string","title":"Address"},"amount":{"type":"number","title":"Amount"}},"type":"object","required":["address","amount"],"title":"TokenTopHolder","description":"A token holder and the amount they hold.\n\n``amount`` is whole tokens where the registry knows the token's decimals, and\nstays in base units when it does not.","example":{"address":"Ae2tdPwUPEZKnykUqXyYQxqJSnADNkm4ELUnyqZUBHcCrNJVDqozLYCt9Jv","amount":2554404077.0}},"TokenTrade":{"properties":{"action":{"type":"string","title":"Action"},"address":{"type":"string","title":"Address"},"exchange":{"type":"string","title":"Exchange"},"hash":{"type":"string","title":"Hash"},"lpTokenUnit":{"type":"string","title":"Lptokenunit"},"price":{"type":"number","title":"Price"},"time":{"type":"integer","title":"Time"},"tokenA":{"type":"string","title":"Tokena"},"tokenAAmount":{"type":"number","title":"Tokenaamount"},"tokenAName":{"type":"string","title":"Tokenaname"},"tokenB":{"type":"string","title":"Tokenb"},"tokenBAmount":{"type":"number","title":"Tokenbamount"},"tokenBName":{"type":"string","title":"Tokenbname"}},"type":"object","required":["action","address","exchange","hash","lpTokenUnit","price","time","tokenA","tokenAAmount","tokenAName","tokenB","tokenBAmount","tokenBName"],"title":"TokenTrade","description":"A single market trade (TapTools shape).","example":{"action":"buy","address":"addr1qyzpj7f89x9vxvmjrepwf68nyz8e4pyw0s086kjzwm9u0xt34h2m9ujcp594lmapd0nj8wzfmgc3efgymg6vvpuah8es2l4wmf","exchange":"Minswap V2","hash":"c78fbebd70cb0f8b238bb4b3db05e0659822c46a36da7d7bc41cfde236e924af","lpTokenUnit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c2ffadbb87144e875749122e0bbb9f535eeaa7f5660c6c4a91bcc4121e477f08d","price":0.0023395205854416313,"time":1781826152,"tokenA":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","tokenAAmount":213719.0,"tokenAName":"SNEK","tokenB":"","tokenBAmount":500.0,"tokenBName":"ADA"}},"TokenTradingStats":{"properties":{"buyVolume":{"type":"number","title":"Buyvolume"},"buyers":{"type":"integer","title":"Buyers"},"buys":{"type":"integer","title":"Buys"},"sellVolume":{"type":"number","title":"Sellvolume"},"sellers":{"type":"integer","title":"Sellers"},"sells":{"type":"integer","title":"Sells"}},"type":"object","required":["buyVolume","buyers","buys","sellVolume","sellers","sells"],"title":"TokenTradingStats","description":"Aggregated buy/sell stats for a token over a timeframe.","example":{"buyVolume":166362.234315,"buyers":40,"buys":163,"sellVolume":201853.832431,"sellers":35,"sells":160}},"TokenVirtualTvl":{"properties":{"unit":{"type":"string","title":"Unit"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"virtualTvlAda":{"type":"number","title":"Virtualtvlada"},"realTvlAda":{"type":"number","title":"Realtvlada"},"ratio":{"type":"number","title":"Ratio"}},"type":"object","required":["unit","virtualTvlAda","realTvlAda","ratio"],"title":"TokenVirtualTvl","description":"A token ranked by virtual TVL (effective liquidity including side routes).\n\n``virtualTvlAda`` and ``realTvlAda`` are both in ADA. ``ratio`` is virtual /\nreal (0.0 when real is 0) and can dip marginally below 1.0. ``ticker`` is null\nwhen the token has no registry ticker.","example":{"ratio":1.3245,"realTvlAda":1391204.77,"ticker":"SNEK","unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","virtualTvlAda":1842660.41}},"TopLiquidityToken":{"properties":{"unit":{"type":"string","title":"Unit"},"ticker":{"type":"string","title":"Ticker"},"price":{"type":"number","title":"Price"},"liquidity":{"type":"number","title":"Liquidity"}},"type":"object","required":["unit","ticker","price","liquidity"],"title":"TopLiquidityToken","description":"A token ranked by liquidity.","example":{"liquidity":19210069.920432,"price":6.12096438799256,"ticker":"USDM","unit":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d"}},"TopMcapToken":{"properties":{"unit":{"type":"string","title":"Unit"},"ticker":{"type":"string","title":"Ticker"},"price":{"type":"number","title":"Price"},"circSupply":{"type":"number","title":"Circsupply"},"totalSupply":{"type":"number","title":"Totalsupply"},"mcap":{"type":"number","title":"Mcap"},"fdv":{"type":"number","title":"Fdv"}},"type":"object","required":["unit","ticker","price","circSupply","totalSupply","mcap","fdv"],"title":"TopMcapToken","description":"A token ranked by market cap.\n\nSame metrics as ``/token/mcap``: ``price`` in ADA per whole token,\n``circSupply`` / ``totalSupply`` in whole tokens, ``mcap`` and ``fdv`` in ADA.","example":{"circSupply":76715880000.0,"fdv":176455658.15,"mcap":176455658.15,"price":0.00230011906466846,"ticker":"SNEK","totalSupply":76715880000.0,"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"}},"TopVolumeToken":{"properties":{"unit":{"type":"string","title":"Unit"},"ticker":{"type":"string","title":"Ticker"},"price":{"type":"number","title":"Price"},"volume":{"type":"number","title":"Volume"}},"type":"object","required":["unit","ticker","price","volume"],"title":"TopVolumeToken","description":"A token ranked by trading volume over a timeframe.","example":{"price":0.18898813514389542,"ticker":"NIGHT","unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","volume":1197763.3131950009}},"TotalMarketCap":{"properties":{"totalMarketCapAda":{"type":"number","title":"Totalmarketcapada"},"tokenCount":{"type":"integer","title":"Tokencount"}},"type":"object","required":["totalMarketCapAda","tokenCount"],"title":"TotalMarketCap","description":"Chain-wide total market cap (SteelSwap extension; NOT in the TapTools API).\n\nThe sum of ``circulating supply * ADA price`` over tokens with KNOWN registry\nsupply and an ADA price. ``tokenCount`` is the number of contributing tokens\n(a coverage signal): tokens lacking registry supply or an ADA price are\nexcluded, so this is a conservative floor, not the whole chain.","example":{"tokenCount":215,"totalMarketCapAda":1234567.89}},"TransactionUtxos":{"properties":{"hash":{"type":"string","title":"Hash"},"inputs":{"items":{"$ref":"#/components/schemas/Utxo"},"type":"array","title":"Inputs"},"outputs":{"items":{"$ref":"#/components/schemas/Utxo"},"type":"array","title":"Outputs"}},"type":"object","required":["hash","inputs","outputs"],"title":"TransactionUtxos","description":"A transaction's inputs and outputs.","example":{"hash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","inputs":[{"assets":[],"hash":"003b4163f8885b7457b9cf7ac30c64eaf80ff7f702e0adf6277634211ef1c7d6","index":2,"lovelace":"413165399"},{"assets":[{"quantity":"30000000","unit":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d"}],"hash":"f05b65641b41bfb3371f8b07b091733967353dda3707f73f1e3ee8fbdf981673","index":0,"lovelace":"2750000"}],"outputs":[{"assets":[],"hash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","index":2,"lovelace":"413249364"},{"assets":[{"quantity":"1","unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c4d5350"},{"quantity":"965003189289","unit":"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d"},{"quantity":"9223370340714043882","unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c7dd6988c5a86693c76aeec1ea94afa41770be0de21a775ca7a2a1eabdb6a0171"}],"hash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","index":1,"lovelace":"4633773995377"}]}},"TxHash":{"properties":{"txHash":{"type":"string","title":"Txhash"},"txCbor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Txcbor"}},"type":"object","required":["txHash"],"title":"TxHash","description":"V1 /wallet/submitted/ request body (tx_cbor accepted, ignored)."},"Utxo":{"properties":{"hash":{"type":"string","title":"Hash"},"index":{"type":"integer","title":"Index"},"lovelace":{"type":"string","title":"Lovelace"},"assets":{"items":{"$ref":"#/components/schemas/UtxoAsset"},"type":"array","title":"Assets"}},"type":"object","required":["hash","index","lovelace","assets"],"title":"Utxo","description":"An unspent transaction output.\n\n``hash`` plus ``index`` identify the output. ``lovelace`` is a decimal string\n(1 ADA = 1,000,000 lovelace); ``assets`` is empty for an ADA-only output.","example":{"assets":[{"quantity":"188098478","unit":"8fef2d34078659493ce161a6c7fba4b56afefa8535296a5743f6958741414441"}],"hash":"32bb8e40705b6188063f72e419c2a149a7a19fc86a7d606ccdb3f24da0e277ba","index":3,"lovelace":"1830040"}},"UtxoAsset":{"properties":{"unit":{"type":"string","title":"Unit"},"quantity":{"type":"string","title":"Quantity"}},"type":"object","required":["unit","quantity"],"title":"UtxoAsset","description":"A native asset held in a UTxO.\n\n``quantity`` is base units as a decimal string (never decimal-adjusted), so\narbitrarily large amounts survive JSON intact."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyRequest":{"properties":{"signature":{"type":"string","title":"Signature","description":"Hex COSESign1 signature from the wallet."},"key":{"type":"string","title":"Key","description":"Hex COSE key from the wallet."}},"type":"object","required":["signature","key"],"title":"VerifyRequest","description":"Request body for ``POST /cip8/verify`` (wallet ``signData`` output).\n\nThe server trusts NO field here except what the signature recovers — the\nnonce inside the signed message. ``signature`` + ``key`` are the COSESign1\npayload and COSE key returned by the wallet."},"WalletPositions":{"properties":{"adaBalance":{"type":"number","title":"Adabalance"},"adaValue":{"type":"number","title":"Adavalue"},"liquidValue":{"type":"number","title":"Liquidvalue"},"numFTs":{"type":"integer","title":"Numfts"},"numNFTs":{"type":"integer","title":"Numnfts"},"positionsFt":{"items":{"$ref":"#/components/schemas/PositionFt"},"type":"array","title":"Positionsft"},"positionsLp":{"items":{"$ref":"#/components/schemas/PositionLp"},"type":"array","title":"Positionslp"},"positionsNft":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Positionsnft","default":[]},"handles":{"items":{"$ref":"#/components/schemas/HandleChip"},"type":"array","title":"Handles","default":[]}},"type":"object","required":["adaBalance","adaValue","liquidValue","numFTs","numNFTs","positionsFt","positionsLp"],"title":"WalletPositions","description":"Portfolio positions for a wallet address.","example":{"adaBalance":323.45539,"adaValue":323.45539,"handles":[],"liquidValue":323.45539,"numFTs":34,"numNFTs":11,"positionsFt":[{"24h":0.0,"30d":0.0,"7d":0.0,"adaValue":0.0,"balance":73464933677.0,"fingerprint":"asset1lgultx63fukjlhsncmwp235pcnh4fh988phh7f","liquidBalance":73464933677.0,"liquidValue":0.0,"price":0.0,"ticker":"","unit":"5dac8536653edc12f6f5e1045d8164b9f59998d3bdc300fc928434894e4d4b52"},{"24h":0.0,"30d":0.0,"7d":0.0,"adaValue":0.0,"balance":1515997.0,"fingerprint":"asset1g4kfrgdz65mf2vt0x8svrw08jwtznrgv9uwdyx","liquidBalance":1515997.0,"liquidValue":0.0,"price":0.0,"ticker":"","unit":"1ad4f068a49bbf0d4f05335cadeca0519cef34cc1b2bc35b2e5739ae434f434b"}],"positionsLp":[],"positionsNft":[]}},"WalletTokenTrade":{"properties":{"action":{"type":"string","title":"Action"},"time":{"type":"integer","title":"Time"},"tokenA":{"type":"string","title":"Tokena"},"tokenAName":{"type":"string","title":"Tokenaname"},"tokenAAmount":{"type":"number","title":"Tokenaamount"},"tokenB":{"type":"string","title":"Tokenb"},"tokenBName":{"type":"string","title":"Tokenbname"},"tokenBAmount":{"type":"number","title":"Tokenbamount"},"hash":{"type":"string","title":"Hash"}},"type":"object","required":["action","time","tokenA","tokenAName","tokenAAmount","tokenB","tokenBName","tokenBAmount","hash"],"title":"WalletTokenTrade","description":"A single wallet token trade (TapTools bare-array item).","example":{"action":"Sell","hash":"030b05bb494059ee0f5514503187afcee5b5010fa8046825d806334a06641c90","time":1780807040,"tokenA":"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935425443","tokenAAmount":121449.0,"tokenAName":"","tokenB":"","tokenBAmount":349287324.0,"tokenBName":"ADA"}},"WitnessDatum":{"properties":{"datumHash":{"type":"string","title":"Datumhash","description":"The datum hash as it appears on-chain."},"cbor":{"type":"string","title":"Cbor","description":"The matching datum preimage as CBOR hex."}},"type":"object","required":["datumHash","cbor"],"title":"WitnessDatum","description":"A datum preimage to add to the witness set, keyed by its hash.\n\nAn output that carries only a datum HASH on-chain is useless without its\npreimage — a batcher cannot reconstruct the order terms — so every hash-only\ndatum in the block set is listed here."},"steelswap__api__atc__schemas__AssetAmount":{"properties":{"unit":{"type":"string","title":"Unit","description":"``lovelace`` for ADA, else the on-chain unit ``<policy id hex><asset name hex>``.","examples":["lovelace","c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d"]},"amount":{"type":"integer","title":"Amount","description":"Integer base units (1 ADA = 1_000_000 lovelace).","examples":[500000000]}},"type":"object","required":["unit","amount"],"title":"AssetAmount","description":"An asset unit and a base-unit quantity."},"steelswap__api__atc__schemas__SwapPrice":{"properties":{"numerator":{"type":"integer","title":"Numerator"},"denominator":{"type":"integer","title":"Denominator"}},"type":"object","required":["numerator","denominator"],"title":"SwapPrice","description":"The on-chain ask-per-offer limit as a reduced rational."},"steelswap__api__auth__routers__auth_tokens__TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token","description":"Short-lived HS256 access JWT."},"refresh_token":{"type":"string","title":"Refresh Token","description":"Opaque refresh token (rotated)."},"expires_in":{"type":"integer","title":"Expires In","description":"Access-token TTL in seconds."}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"TokenResponse","description":"The rotated renewable-JWT token pair (mirror of the login response)."},"steelswap__api__auth__routers__cip8__TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token","description":"Short-lived HS256 access JWT."},"refresh_token":{"type":"string","title":"Refresh Token","description":"Opaque refresh token (rotated)."},"expires_in":{"type":"integer","title":"Expires In","description":"Access-token TTL in seconds."}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"TokenResponse","description":"A minted renewable-JWT token pair.\n\nThe ``access_token`` is a short-lived HS256 JWT used as the\n``X-Session-Token`` for the key-management endpoints; the ``refresh_token`` is\nan opaque value the client stores and presents to ``/auth/refresh`` to obtain\na fresh pair (rotated server-side). ``expires_in`` is the access-token TTL."},"steelswap__api__native__schemas__AssetAmount-Input":{"properties":{"unit":{"type":"string","title":"Unit","description":"On-chain asset unit: the policy id hex concatenated with the asset name hex, or the sentinel ``\"lovelace\"`` for ADA.","examples":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]},"amount":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"string"}],"title":"Amount","description":"Quantity of ``unit``. An integer or decimal string is base units; a JSON float is a decimal-adjusted human amount.","examples":["100000000"]}},"type":"object","required":["unit","amount"],"title":"AssetAmount","description":"One asset's quantity: its on-chain ``unit`` and an ``amount``.\n\n``unit`` is the canonical identity ``policyIdHex + assetNameHex`` with the\nsentinel ``\"lovelace\"`` for ADA. This is the only place a token's identity\nappears in a lean response — no metadata is inlined (``?expand=token`` adds a\ntop-level ``tokens[]`` with the metadata).\n\n``amount`` is base (indivisible) units in the integer pipeline. The JSON TYPE is\nthe signal in both directions: on a request an integer (or a decimal string) is\nbase units and a JSON float is a human/display amount the server scales by the\ntoken's decimals; on a response a decimal string means base units and a JSON\nnumber means the value was already decimal-adjusted. Base-unit amounts are\nstrings so a large quantity survives a JSON ``BigInt`` decode without rounding.","example":{"amount":"100000000","unit":"lovelace"}},"steelswap__api__native__schemas__AssetAmount-Output":{"properties":{"unit":{"type":"string","title":"Unit","description":"On-chain asset unit: the policy id hex concatenated with the asset name hex, or the sentinel ``\"lovelace\"`` for ADA.","examples":["lovelace","279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b"]},"amount":{"anyOf":[{"type":"string"},{"type":"number"}],"title":"Amount","description":"Quantity of ``unit``. An integer or decimal string is base units; a JSON float is a decimal-adjusted human amount.","examples":["100000000"]}},"type":"object","required":["unit","amount"],"title":"AssetAmount","description":"One asset's quantity: its on-chain ``unit`` and an ``amount``.\n\n``unit`` is the canonical identity ``policyIdHex + assetNameHex`` with the\nsentinel ``\"lovelace\"`` for ADA. This is the only place a token's identity\nappears in a lean response — no metadata is inlined (``?expand=token`` adds a\ntop-level ``tokens[]`` with the metadata).\n\n``amount`` is base (indivisible) units in the integer pipeline. The JSON TYPE is\nthe signal in both directions: on a request an integer (or a decimal string) is\nbase units and a JSON float is a human/display amount the server scales by the\ntoken's decimals; on a response a decimal string means base units and a JSON\nnumber means the value was already decimal-adjusted. Base-unit amounts are\nstrings so a large quantity survives a JSON ``BigInt`` decode without rounding.","example":{"amount":"100000000","unit":"lovelace"}},"steelswap__api__native__schemas__CancelRequest":{"properties":{"orders":{"items":{"$ref":"#/components/schemas/OrderRef"},"type":"array","title":"Orders","description":"The orders to cancel. An empty list is accepted and returns no transactions."},"changeAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changeaddress","description":"Where the reclaimed value is returned. Defaults to each order's own source address. Some venues require the value to go back to that source and ignore any other destination.","examples":["addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt"]},"collateral":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Collateral","description":"Collateral UTxOs as CBOR hex. A cancel always spends a script, so collateral is required; these are used only when the server has none of its own available."},"ttlSeconds":{"type":"integer","title":"Ttlseconds","description":"How long each returned transaction stays valid, in seconds from the current chain tip.","default":600,"examples":[600]},"partner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner","description":"Reserved. Accepted for compatibility but not currently read: the fee reclaim resolves its channel from the order's own creation transaction, not from this field."}},"type":"object","required":["orders"],"title":"CancelRequest","description":"Body for ``POST /swap/cancel`` — reclaim one or more resting orders.\n\nSend every order you want cancelled in one request. Orders that cannot be\ncancelled are reported back rather than rejected, so a mixed batch still\nsucceeds.","example":{"changeAddress":"addr1q95d4g4tl4l8lawf9ny3npj3jr39jwnuee3hf6wyeehqjwk3wq8dtc3a50qg7p7xe52qvermjyut7k2wkrtmdvncattsvpyujt","orders":[{"txHash":"754a2b7c3edfa840c664c05db480128a2582ba6fd9f9e602d579d830f0e24be9","txIndex":0},{"txHash":"9c1b6a04c6a1a0f8f5b0c3d9e2a7148b3f6c0d51e8a94b27d3c6f0a815e4b7d2","txIndex":1}],"ttlSeconds":600}},"steelswap__api__native__schemas__SwapPrice":{"properties":{"numerator":{"type":"string","title":"Numerator"},"denominator":{"type":"string","title":"Denominator"}},"type":"object","required":["numerator","denominator"],"title":"SwapPrice","description":"An exact on-chain ask-per-offer limit as a reduced rational.\n\nBoth terms are base-unit integers serialized as strings on the wire."},"steelswap__api__v1__schemas__CancelRequest":{"properties":{"utxos":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Utxos"},"txList":{"items":{"$ref":"#/components/schemas/CancelTxRef"},"type":"array","title":"Txlist"},"collateralUtxo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collateralutxo"},"ttl":{"type":"integer","title":"Ttl"},"changeAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changeaddress"},"partner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner"}},"type":"object","required":["txList","ttl"],"title":"CancelRequest","description":"Post body for a swap cancel request (V1 ``models.py``).\n\n``txList`` is a **bare array** of :class:`CancelTxRef`. ``utxos`` is\ndeclared for shape parity but unused. The authenticated partner (``token``\nheader) drives refund routing; the ``partner`` body field is accepted for\nparity but ignored by the handler (STEEL-432 / STEEL-354)."}}},"tags":[{"name":"V2 Swap","description":"Quote a swap, inspect the routes behind it, and build the unsigned transactions.\n\n`POST /swap/estimate` quotes in either direction — offer a fixed input, or request a fixed output. `GET /swap/routes/dag` reconstructs the routing graph between two tokens.\n\n`POST /swap/build` returns unsigned transaction CBOR for the client to sign and submit via CIP-30, and `POST /swap/cancel` does the same for a wallet's resting orders. `POST /swap/assemble` is the lower-level alternative: it emits the pieces — inputs, outputs and datums, redeemers, required signers, reference inputs — for a caller that assembles and balances the transaction itself. `POST /swap/notify` registers a transaction the moment you submit it, so it shows as pending during the window before the chain listener indexes it."},{"name":"V2 Orders","description":"A wallet's swap orders, folded into one logical order per originating transaction.\n\n`GET /orders` is the lean, cursor-paginated list; `GET /orders/{txHash}` returns one fully-expanded order by the hash of the transaction that created it."},{"name":"V2 Tokens","description":"The token universe: a ranked, searchable list and a batch metadata lookup.\n\n`GET /tokens/list` covers every token with an ADA pair, ranked by ADA liquidity, trailing 24h ADA volume, or virtual TVL, with a case-insensitive search over ticker and name (or an exact `unit` match). It is **curated by default** — pass `verifiedOnly=false` to see the whole ADA-tradeable universe. `POST /tokens/metadata` resolves many units at once — unknown units are dropped rather than erroring — and is `ETag`-cacheable."},{"name":"V2 Pairs","description":"Ranked ADA-quoted trading pairs.\n\nEach entry carries both tokens, the number of pools backing the pair, and the ADA-denominated price, liquidity, and 24h volume. Sort by `liquidity` or `volume24h`, or narrow the list to the pairs containing one token with `token=<unit>`."},{"name":"V2 DEXes","description":"The catalog of DEXs SteelSwap routes across.\n\nOne entry per supported DEX — id, display name, `amm` or `orderbook` type, and a logo path relative to this host. Optionally filtered with `type`. The catalog changes only on a deploy, so it is long-cacheable and carries a strong `ETag`."},{"name":"V2 FX","description":"ADA fx rates — the price of 1 ADA in a quote currency.\n\nSupported quotes are ADA, USD, EUR, BTC, and ETH; anything else is rejected with `400`. The response pairs the live spot with its fractional 24h change, which is omitted when there is no bar from ~24h ago."},{"name":"V2 Batcher","description":"Per-protocol batcher health. This endpoint is public — it needs no credential, so a status page can poll it directly.\n\nReports each tracked protocol's current status, how long its oldest unfilled demand has waited, and the thresholds behind the verdict. An optional status-history sparkline buckets the worst status seen over a window (worst-wins, not an average)."},{"name":"V2 Fees","description":"The partner fee dashboard: what has accrued, where it came from, and what has been paid out.\n\n`/fees/account` is the live collection account (claimable vs held against resting orders, and the disbursement threshold); `/fees/summary`, `/fees/bars`, and `/fees/history` are the all-time totals, per-period buckets, and recent fee-bearing transactions; `/fees/payouts` is the on-chain payout history.\n\nA partner credential always resolves to that partner's own account — one partner can never read another's. An owner or administrator names the account to read with `?partner=<slug>`. The `/fees/admin/{source}/…` reads cover an internal fee source instead of a partner and require an administrator credential."},{"name":"Token","description":"Everything about one token, keyed by its `unit`.\n\nPrices (single, batched, and percent change), OHLCV candles and derived indicators, market cap and supply, the pools holding it, its recent trades, holder counts and the top holders, social links, decimals, and the top-by-liquidity / market-cap / volume leaderboards. The two `/token/debt/…` lending paths are recognised but unimplemented and always return `501`."},{"name":"Market & Integration","description":"Chain-wide market totals plus the machine-readable integration feed.\n\n`/market/stats` and `/market/total-mcap` are the aggregate numbers. The `/integration/…` endpoints back a TradingView UDF-style indexer: a block by height or by timestamp plus the current tip, asset, pair, and exchange metadata, and swap events over an inclusive block range (each event oriented to the pool's asset0/asset1 in canonical token order)."},{"name":"DEX Stats","description":"Per-DEX market statistics over a rolling window — a SteelSwap extension, not part of the TapTools API.\n\n`/dex/stats` is the leaderboard: ADA volume, TVL, transactions, active addresses, batcher fees, active pools, market share, percent change, average trade size, and turnover for a `24h` / `7d` / `30d` window, ranked by volume, TVL, or transactions. `/dex/{dexKey}/history` is the daily series of those same metrics. All figures are ADA-denominated, computed over ADA-paired pools."},{"name":"Onchain","description":"Direct ledger reads, served from the chain index rather than from SteelSwap's market data.\n\nAn asset's on-chain supply, an address summary and its UTxOs, and a transaction's inputs and outputs."},{"name":"Wallet","description":"A wallet's holdings and activity. Every endpoint accepts either a payment address or a stake address.\n\nCurrent portfolio positions with supporting market data, portfolio value trended over a timeframe, the wallet's filled token trades (newest first), and the ADA Handles it holds."},{"name":"Handle","description":"ADA Handle lookup — a SteelSwap extension, not part of the TapTools API.\n\nResolves a handle name (given without the leading `$`) to the address currently holding it; `404` when the handle is unminted or unheld. For the opposite direction — the handles a wallet holds — use `/wallet/handles`."},{"name":"NFT","description":"TapTools NFT endpoints, recognised for drop-in compatibility but not implemented by SteelSwap.\n\nEvery path here returns `501 Not Implemented`. They are registered so a drop-in client sees an honest \"unsupported\" rather than a `404` that reads like a wrong URL."},{"name":"V1 Tokens","description":"Legacy token endpoints kept for existing integrations: token list, USD price, icon, find-pairs, pools, and orders.\n\nThese are bare-root paths (no `/api` prefix) with the original request and response shapes. They carry their credential on a lowercase `token` header, and only `POST` requests are gated — the `GET` paths need no credential."},{"name":"V1 DEX","description":"Legacy DEX listing (`GET /dex/list/`) kept for existing integrations.\n\nThese are bare-root paths (no `/api` prefix) with the original request and response shapes. They carry their credential on a lowercase `token` header, and only `POST` requests are gated — the `GET` paths need no credential."},{"name":"V1 Swap","description":"Legacy swap endpoints kept for existing integrations: `/swap/estimate/` (route + split quote), `/swap/build/`, and `/swap/cancel/`.\n\nThese are bare-root paths (no `/api` prefix) with the original request and response shapes. They carry their credential on a lowercase `token` header, and only `POST` requests are gated — the `GET` paths need no credential."},{"name":"V1 Wallet","description":"Legacy wallet endpoints kept for existing integrations: `/wallet/history/`, `/wallet/pending/`, and `/wallet/submitted/`.\n\nThese are bare-root paths (no `/api` prefix) with the original request and response shapes. They carry their credential on a lowercase `token` header, and only `POST` requests are gated — the `GET` paths need no credential."},{"name":"ATC","description":"Keyless on-chain limit orders. These endpoints need no credential.\n\nPlace a limit order offering one asset for another at a fixed price, list the open book or one owner's history, read a single order, collect or cancel via a CLOSE build, and fetch a size-aware recommended limit price. Every build returns an unsigned transaction (`txCbor`) for the owner's wallet to sign and submit via CIP-30 — the API never holds keys.\n\nFormats: asset units are `lovelace` or `<policy id hex><asset name hex>`; amounts are integer base units; UTxOs are CIP-30 `cborHex` strings (`api.getUtxos()`); order ids are `txHash#index` (URL-encode `#` as `%23`). An order's OWNER is the staking credential of the `ownerAddress` it was placed with — pass any address carrying that staking part (base `addr1…` or stake `stake1…`) as `?owner=` when listing."},{"name":"Authentication","description":"Wallet-based onboarding and account management.\n\nA CIP-8 challenge / verify pair logs a wallet in and returns a session token, which `refresh` rotates and `logout` revokes. With that session a wallet generates, lists, and revokes its own durable API keys and edits its account profile. The `/auth/admin/…` endpoints are the administrator surface for partner, key, and plan management."}],"x-tagGroups":[{"name":"SteelSwap V2 API","tags":["V2 Swap","V2 Orders","V2 Tokens","V2 Pairs","V2 DEXes","V2 FX","V2 Batcher","V2 Fees"]},{"name":"TapTools-Compatible API","tags":["Token","Market & Integration","DEX Stats","Onchain","Wallet","Handle","NFT"]},{"name":"SteelSwap V1 API","tags":["V1 Tokens","V1 DEX","V1 Swap","V1 Wallet"]},{"name":"ATC Limit Orders","tags":["ATC"]},{"name":"Authentication","tags":["Authentication"]}]}