{"openapi":"3.0.0","paths":{"/v2/health":{"get":{"description":"Always answers `200`, even during maintenance — the body carries the state. A `MAINTENANCE` status means every other route is returning `503`, so poll this to know when to resume instead of probing a real endpoint.","operationId":"get_health","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"summary":"Service health","tags":["System"]}},"/v2/time":{"get":{"operationId":"get_server_time","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeResponse"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"summary":"Server time for request signing and clock synchronization","tags":["System"]}},"/v2/.well-known/webhook-jwks.json":{"get":{"description":"Public JSON Web Key Set for verifying the EdDSA signature on webhook deliveries. Select the key by the `kid` in the delivery signature header.","operationId":"WebhookJwksController_jwks_v2","parameters":[],"responses":{"200":{"description":"JWKS document — `{ \"keys\": [...] }`."},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"summary":"Webhook signing JWKS","tags":["Webhooks"]}},"/v2/assets":{"get":{"operationId":"list_assets","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}}],"responses":{"200":{"description":"","schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AssetResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AssetResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List supported assets","tags":["Assets"]}},"/v2/assets/{assetSymbol}":{"get":{"description":"Reference data is identical for every key, so this response does not depend on who asks.","operationId":"get_asset","parameters":[{"name":"assetSymbol","required":true,"in":"path","description":"The asset code published as `assetSymbol` by `GET /v2/assets` (e.g. `BTC`, `NVDASPV`). Case-insensitive.","schema":{"example":"BTC","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetResource"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get a supported asset by its symbol","tags":["Assets"]}},"/v2/markets":{"get":{"operationId":"list_markets","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}}],"responses":{"200":{"description":"","schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MarketResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MarketResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List supported markets","tags":["Markets"]}},"/v2/markets/{market}":{"get":{"description":"The id is the market code returned by `GET /v2/markets` (e.g. `BTC-CLP`). Reference data is identical for every key, so this response does not depend on who asks.","operationId":"get_market","parameters":[{"name":"market","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketResource"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get a supported market by id","tags":["Markets"]}},"/v2/markets/{market}/price":{"get":{"description":"A NON-BINDING price. Nothing is reserved and there is no expiry — the response carries no order id, so it cannot be executed. To obtain a confirmable quote use `POST /v2/quotes` (scope `trading:write`), then execute it with a signed `POST /v2/orders`.\n\nSkipo prices a dealer spread, so the rate depends on size: pass `amount` + `amountAsset` to price a specific ticket, or omit both to price at the market minimum. `amount` is capped by that asset’s `maxIndicativeQuoteAmount` (see `GET /v2/assets`); above the cap the request is rejected rather than silently repriced at a smaller size.","operationId":"get_market_price","parameters":[{"name":"market","required":true,"in":"path","schema":{"type":"string"}},{"name":"side","required":true,"in":"query","description":"Which direction to price. Required — buying and selling the same market are different prices, so there is no sensible default.","schema":{"enum":["BUY","SELL"],"type":"string"}},{"name":"amount","required":false,"in":"query","description":"Amount to price, denominated in `amountAsset`. A decimal string. Requires `amountAsset`. Omit both to price at the market minimum. Capped by the `maxIndicativeQuoteAmount` of `amountAsset` from `GET /v2/assets` — an amount above the cap is rejected rather than silently reduced, because a price for an amount you did not ask for is worse than an error.","schema":{"example":"0.2","type":"string"}},{"name":"amountAsset","required":false,"in":"query","description":"Which leg `amount` is denominated in — must be one of the market's two assets. Requires `amount`.","schema":{"example":"BTC","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceResource"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get an indicative price for a market","tags":["Markets"]}},"/v2/quotes":{"post":{"description":"Creates a short-lived, single-use CONFIRMABLE quote; execute it via POST /v2/orders (a signed request). Requires the write scope because the call mints server-side state that an order later consumes, and is balance- and capacity-gated — not because funds move here. It is bearer-authenticated rather than signed precisely because the quote itself moves no money. For a NON-BINDING price with no confirmation step and no write scope, use GET /v2/markets/{market}/price.","operationId":"create_quote","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuoteDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResource"}}}},"400":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`validation_error`](https://docs.skipo.com/errors/validation_error) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unprocessable`](https://docs.skipo.com/errors/unprocessable) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Create a conversion quote","tags":["Orders"]}},"/v2/orders":{"post":{"description":"Money movement — requires a Tier-2 signed request (X-API-Key header + signed Authorization JWT), not a bare bearer key. Executes the quote identified by `orderId`. Returns 201 Created with `status: \"FILLED\"` when the balance move is booked, or 202 Accepted with `status: \"PROCESSING\"` when the trade executed but the balance credit/debit is still being reconciled internally. On 202 the order is accepted — poll GET /v2/orders/{id} for the final state and do NOT retry (a retry places a new order and double-executes).","operationId":"place_order","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceOrderDto"}}}},"responses":{"201":{"description":"Order placed and filled — the balance move is booked (`status: \"filled\"`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlacedOrderResource"}}}},"202":{"description":"Order accepted; settlement is pending (`status: \"PROCESSING\"`). The trade executed but the balance move is still reconciling internally — poll GET /v2/orders/{id}; do NOT retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlacedOrderResource"}}}},"400":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`validation_error`](https://docs.skipo.com/errors/validation_error) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable), [`invalid_signature`](https://docs.skipo.com/errors/invalid_signature) (not retryable), [`clock_skew`](https://docs.skipo.com/errors/clock_skew) (retryable), [`nonce_reused`](https://docs.skipo.com/errors/nonce_reused) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable), [`two_factor_required`](https://docs.skipo.com/errors/two_factor_required) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unprocessable`](https://docs.skipo.com/errors/unprocessable) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]},{"signedRequestJwt":[]},{"apiKeyId":[]}],"summary":"Place an order (execute a quote)","tags":["Orders"]},"get":{"operationId":"list_orders","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}},{"name":"status","required":false,"in":"query","schema":{"enum":["NEW","PARTIALLY_FILLED","FILLED","FAILED"],"type":"string"}},{"name":"baseAsset","required":false,"in":"query","description":"Filter by base asset code.","schema":{"example":"BTC","type":"string"}},{"name":"quoteAsset","required":false,"in":"query","description":"Filter by quote asset code.","schema":{"example":"CLP","type":"string"}},{"name":"market","required":false,"in":"query","description":"Filter to one market, by the `id` published by `GET /v2/markets` — the same value this endpoint returns as `market`.","schema":{"example":"BTC-CLP","type":"string"}},{"name":"side","required":false,"in":"query","schema":{"example":"BUY","enum":["BUY","SELL"],"type":"string"}},{"name":"assetFormat","required":false,"in":"query","description":"How to express tokenised-equity (xStock) amounts. `rebased` (default) = underlying equity; `base` = settled SPV tokens. No effect on other assets.","schema":{"default":"rebased","enum":["base","rebased"],"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"ISO-8601 start date.","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"ISO-8601 end date.","schema":{"type":"string"}}],"responses":{"200":{"description":"","schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OrderResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OrderResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List orders","tags":["Orders"]}},"/v2/fills":{"get":{"description":"Every fill on the account, newest first, across all orders. Filter by `orderId`, `market`, asset (either leg), side or date range. Cursor-paginated: follow `pagination.nextCursor` until it is null, and do not infer the end from a short page.","operationId":"list_fills","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}},{"name":"cursor","required":false,"in":"query","description":"Opaque cursor from the previous page's `pagination.nextCursor`.","schema":{"type":"string"}},{"name":"orderId","required":false,"in":"query","description":"Restrict to the fills of one order (its public id).","schema":{"type":"string"}},{"name":"market","required":false,"in":"query","description":"Filter to one market, by the `id` published by `GET /v2/markets` — the same value this endpoint returns as `market`.","schema":{"example":"BTC-CLP","type":"string"}},{"name":"assetSymbol","required":false,"in":"query","description":"Matches either leg — fills that touched this asset.","schema":{"example":"BTC","type":"string"}},{"name":"side","required":false,"in":"query","schema":{"example":"BUY","enum":["BUY","SELL"],"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"ISO-8601 start date (inclusive).","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"ISO-8601 end date (exclusive).","schema":{"type":"string"}},{"name":"assetFormat","required":false,"in":"query","description":"How to express tokenised-equity (xStock) amounts. `rebased` (default) = underlying equity (real shares); `base` = settled SPV tokens, i.e. what moved on chain and in the ledger. No effect on other assets.","schema":{"default":"rebased","enum":["base","rebased"],"type":"string"}}],"responses":{"200":{"description":"","schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FillResource"}},"pagination":{"$ref":"#/components/schemas/CursorMeta"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FillResource"}},"pagination":{"$ref":"#/components/schemas/CursorMeta"}}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List fills","tags":["Orders"]}},"/v2/orders/{id}":{"get":{"operationId":"get_order","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"assetFormat","required":false,"in":"query","description":"How to express tokenised-equity (xStock) amounts. `rebased` (default) = underlying equity (real shares); `base` = settled SPV tokens, i.e. what moved on chain and in the ledger. No effect on other assets.","schema":{"default":"rebased","enum":["base","rebased"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResource"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get an order by id","tags":["Orders"]}},"/v2/orders/{id}/fills":{"get":{"description":"The fills of one order, newest first. Cursor-paginated: follow `pagination.nextCursor` until it is null. A normal convert has exactly one fill; an on-credit (capacity) order is filled by several as the debt is paid down.","operationId":"list_order_fills","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}},{"name":"cursor","required":false,"in":"query","description":"Opaque cursor from the previous page's `pagination.nextCursor`.","schema":{"type":"string"}},{"name":"assetFormat","required":false,"in":"query","description":"How to express tokenised-equity (xStock) amounts. `rebased` (default) = underlying equity (real shares); `base` = settled SPV tokens, i.e. what moved on chain and in the ledger. No effect on other assets.","schema":{"default":"rebased","enum":["base","rebased"],"type":"string"}}],"responses":{"200":{"description":"","schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FillResource"}},"pagination":{"$ref":"#/components/schemas/CursorMeta"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FillResource"}},"pagination":{"$ref":"#/components/schemas/CursorMeta"}}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List the fills of an order","tags":["Orders"]}},"/v2/account":{"get":{"operationId":"get_account","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResource"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get the account for the authenticated key","tags":["Account"]}},"/v2/balances":{"get":{"operationId":"list_balances","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BalanceResource"}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List the account asset balances","tags":["Balances"]}},"/v2/balances/{assetSymbol}/history":{"get":{"operationId":"get_balance_history","parameters":[{"name":"assetSymbol","required":true,"in":"path","description":"The asset code published as `assetSymbol` by `GET /v2/assets`.","schema":{"example":"BTC","type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}},{"name":"startDate","required":false,"in":"query","description":"ISO-8601 start date. Defaults to the first movement.","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"ISO-8601 end date. Defaults to now.","schema":{"type":"string"}},{"name":"granularity","required":false,"in":"query","schema":{"default":"day","enum":["day","week","month"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoricalBalancesResponse"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Historical balances for an asset","tags":["Balances"]}},"/v2/ledger":{"get":{"description":"The double-entry record of how a balance changed, for one asset. Every entry carries a `source` back-pointer to the withdrawal, deposit or fill that caused it; filter by `sourceId` to fetch exactly those entries, or by `orderId` to fetch every entry an order produced across all of its fills.","operationId":"list_ledger","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}},{"name":"assetSymbol","required":true,"in":"query","description":"Asset to list entries for. Required.","schema":{"example":"BTC","type":"string"}},{"name":"type","required":false,"in":"query","description":"Filter by entry type.","schema":{"example":"DEPOSIT","enum":["BUY","SELL","DEPOSIT","WITHDRAWAL"],"type":"string"}},{"name":"sourceId","required":false,"in":"query","description":"Return only the entries caused by this resource. Accepts a withdrawal, deposit or fill id — the same value the resource publishes as `id` and the entry echoes as `source.id`.","schema":{"type":"string"}},{"name":"orderId","required":false,"in":"query","description":"Return every entry produced by an order, across all of its fills. The ledger does not store an order id, so this resolves the order to its fills first — one extra internal hop. Note an order settles in two assets, and `assetSymbol` selects which leg you see.","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"ISO-8601 start date.","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"ISO-8601 end date.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LedgerEntriesResponse"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List ledger entries","tags":["Ledger"]}},"/v2/ledger/{id}":{"get":{"operationId":"get_ledger_entry","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LedgerEntry"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get a ledger entry by id","tags":["Ledger"]}},"/v2/contacts":{"get":{"operationId":"list_contacts","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}},{"name":"type","required":false,"in":"query","description":"Filter by contact type.","schema":{"example":"EXTERNAL_CRYPTO","enum":["INTERNAL","EXTERNAL_CRYPTO","BANK_ACCOUNT"],"type":"string"}}],"responses":{"200":{"description":"","schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ContactResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ContactResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List contacts","tags":["Contacts"]}},"/v2/contacts/{contactId}":{"get":{"operationId":"get_contact","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResource"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get a contact by id","tags":["Contacts"]},"patch":{"operationId":"update_contact","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContactReferenceDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResource"}}}},"400":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`validation_error`](https://docs.skipo.com/errors/validation_error) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unprocessable`](https://docs.skipo.com/errors/unprocessable) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Edit a contact's reference/alias","tags":["Contacts"]}},"/v2/deposits":{"get":{"operationId":"list_deposits","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}},{"name":"assetSymbol","required":false,"in":"query","schema":{"example":"BTC","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"example":"COMPLETED","type":"string"}},{"name":"subType","required":false,"in":"query","schema":{"example":"EXTERNAL_CRYPTO","enum":["INTERNAL","EXTERNAL_CRYPTO","EXTERNAL_FIAT_BANK","EXTERNAL_FIAT_REDPAY_CHARGEBACK"],"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"ISO-8601 start date.","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"ISO-8601 end date.","schema":{"type":"string"}}],"responses":{"200":{"description":"","schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DepositResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DepositResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List deposits","tags":["Deposits"]}},"/v2/deposits/{id}":{"get":{"operationId":"get_deposit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositResource"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get a deposit by id","tags":["Deposits"]}},"/v2/withdrawals":{"get":{"operationId":"list_withdrawals","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"integer"}},{"name":"assetSymbol","required":false,"in":"query","schema":{"example":"BTC","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"example":"COMPLETED","type":"string"}},{"name":"subType","required":false,"in":"query","schema":{"example":"EXTERNAL_CRYPTO","enum":["INTERNAL","EXTERNAL_CRYPTO","EXTERNAL_FIAT_BANK","EXTERNAL_FIAT_REDPAY","NETWORK_FEE","TRANSFER_FEE"],"type":"string"}},{"name":"assetFormat","required":false,"in":"query","description":"How to express tokenised-equity (xStock) amounts. `rebased` (default) = underlying equity; `base` = settled SPV tokens. No effect on other assets.","schema":{"default":"rebased","enum":["base","rebased"],"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"ISO-8601 start date.","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"ISO-8601 end date.","schema":{"type":"string"}}],"responses":{"200":{"description":"","schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WithdrawalResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WithdrawalResource"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"List withdrawals","tags":["Withdrawals"]},"post":{"description":"Money movement — requires a Tier-2 signed request (X-API-Key header + signed Authorization JWT), not a bare bearer key.","operationId":"create_withdrawal","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWithdrawalDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawalResource"}}}},"400":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`validation_error`](https://docs.skipo.com/errors/validation_error) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable), [`invalid_signature`](https://docs.skipo.com/errors/invalid_signature) (not retryable), [`clock_skew`](https://docs.skipo.com/errors/clock_skew) (retryable), [`nonce_reused`](https://docs.skipo.com/errors/nonce_reused) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable), [`two_factor_required`](https://docs.skipo.com/errors/two_factor_required) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unprocessable`](https://docs.skipo.com/errors/unprocessable) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]},{"signedRequestJwt":[]},{"apiKeyId":[]}],"summary":"Create a withdrawal","tags":["Withdrawals"]}},"/v2/withdrawals/{id}":{"get":{"operationId":"get_withdrawal","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawalResource"}}}},"401":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`unauthorized`](https://docs.skipo.com/errors/unauthorized) (not retryable), [`key_expired`](https://docs.skipo.com/errors/key_expired) (not retryable), [`key_revoked`](https://docs.skipo.com/errors/key_revoked) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`insufficient_scope`](https://docs.skipo.com/errors/insufficient_scope) (not retryable), [`ip_not_allowed`](https://docs.skipo.com/errors/ip_not_allowed) (not retryable), [`api_access_disabled`](https://docs.skipo.com/errors/api_access_disabled) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`not_found`](https://docs.skipo.com/errors/not_found) (not retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`rate_limited`](https://docs.skipo.com/errors/rate_limited) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`internal_error`](https://docs.skipo.com/errors/internal_error) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`downstream_unavailable`](https://docs.skipo.com/errors/downstream_unavailable) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`application/problem+json` (RFC 9457) — branch on `code`, not on the status: [`maintenance`](https://docs.skipo.com/errors/maintenance) (retryable).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"bearerKey":[]}],"summary":"Get a withdrawal by id","tags":["Withdrawals"]}}},"info":{"title":"Skipo API","description":"Skipo Public API v2.\n\n## Authentication\nTwo tiers:\n- **Bearer key** — `Authorization: Bearer skp_live_...` for reads and non-sensitive writes.\n- **Signed request** — `X-API-Key: <keyId>` + a per-request Ed25519-signed JWT in\n  `Authorization: Bearer <jwt>` for money movement. See the Authentication guide.\n\n## Rate limits\nEnforced per-account **and** per-key by tier. Authenticated responses carry\n`RateLimit-Limit` / `RateLimit-Remaining` / `RateLimit-Reset` (+ legacy\n`X-RateLimit-*`); a quota 429 returns a problem+json body with `Retry-After`.\n`@Public` routes — health, server time, the spec and the webhook JWKS — are not\nper-key limited and carry no rate-limit headers.\n\n## Errors\nEvery error is RFC 9457 `application/problem+json` with a stable `type`\n(`https://docs.skipo.com/errors/{code}`), a machine `code`, and a `retryable`\nflag — see the **Problem** schema.\n\n## Pagination\nList endpoints take `page`/`limit` and return `{ data, pagination }`\n(offset-based via `page`/`limit`).","version":"2.0.0","contact":{"name":"Skipo","url":"https://docs.skipo.com","email":"dev@skipo.com"},"license":{"name":"Proprietary","url":"https://skipo.com/terms"},"termsOfService":"https://skipo.com/terms"},"tags":[{"name":"System","description":"Health, server time, and the OpenAPI spec"},{"name":"Account","description":"The authenticated account"},{"name":"Balances","description":"Current balances and historical balances"},{"name":"Ledger","description":"Double-entry ledger entries, each linked to the resource that caused it"},{"name":"Assets","description":"Supported assets — fiat, stablecoins, crypto and tokenised equities"},{"name":"Markets","description":"Supported markets, and indicative pricing. `GET /v2/markets/{market}/price` is a NON-BINDING price: nothing is reserved, it has no expiry and it carries no order id, so it cannot be executed. It is the read-only counterpart to the Orders tag’s `POST /v2/quotes`."},{"name":"Orders","description":"Quotes, orders and fills. `POST /v2/quotes` mints a short-lived, single-use CONFIRMABLE quote (scope `trading:write`) which `POST /v2/orders` then executes as a Tier-2 signed request. An order is filled by one or more fills. For a non-binding price with no confirmation step, use `GET /v2/markets/{market}/price` instead."},{"name":"Contacts","description":"Withdrawal contacts (read + reference edit)"},{"name":"Deposits","description":"Deposit history"},{"name":"Withdrawals","description":"Withdrawal history"},{"name":"Webhooks","description":"The public JWKS used to verify signed webhook deliveries. Deliveries carry a detached JWS (EdDSA) in `skipo-webhook-signature`; select the verifying key by the `kid` in the protected header so key rotation does not break you. Registering and managing webhook endpoints is done from the Skipo dashboard, not through this API."}],"servers":[{"url":"https://api.skipo.com","description":"Production"}],"components":{"securitySchemes":{"bearerKey":{"scheme":"bearer","bearerFormat":"skp_live_/skp_test_ secret key","type":"http","description":"Scoped secret key. Send as `Authorization: Bearer skp_live_...`."},"apiKeyId":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key id accompanying a signed-request JWT (Tier 2)."},"signedRequestJwt":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Per-request JWT signed with your Ed25519 key (alg EdDSA; RS256 fallback). Claims: uri, nonce, iat, exp<=iat+60s, sub, bodyHash (SHA-256 of the raw body)."}},"schemas":{"HealthResponse":{"type":"object","properties":{"status":{"type":"string","enum":["UP","MAINTENANCE"],"example":"UP","description":"`UP` when serving normally. `MAINTENANCE` when the API is in maintenance — every other route is returning `503` with the `maintenance` problem type, so retry later rather than treating it as an outage."}},"required":["status"]},"TimeResponse":{"type":"object","properties":{"serverTime":{"type":"number","example":1783003522123,"description":"Server time, milliseconds since Unix epoch."},"iso":{"type":"string","example":"2026-07-28T12:34:56.789Z","description":"The same instant as ISO-8601 UTC."}},"required":["serverTime","iso"]},"PaginationMeta":{"type":"object","properties":{"page":{"type":"number","example":1},"limit":{"type":"number","example":25},"totalItems":{"type":"number","example":100},"totalPages":{"type":"number","example":4}},"required":["page","limit","totalItems","totalPages"]},"NetworkResource":{"type":"object","properties":{"networkSymbol":{"type":"string","example":"BTC","description":"Upstream network identifier, passed through UNNORMALIZED — do not treat it as a stable key or parse it. Formats are inconsistent and mix three unrelated kinds of value: chain symbols (`BTC`, `SOL`, `ETH`), token standards that are not chains at all (`ERC20`, `BEP20`), and prose (`Dogecoin`, `Stellar Network`, `XRP Ledger`). `BEP20` and `BSC` are the same chain under two names. A canonical network registry is owned by maintainers (SPEC Phase 2g); until it lands this field is descriptive only, and a later release will replace it with normalized values. Use `assetSymbol` as the key for anything durable."},"networkName":{"type":"string","example":"Bitcoin","description":"Human-readable network name."},"withdrawalFee":{"type":"string","example":"0.0005","description":"Fee charged for a withdrawal over this network, denominated in the asset itself."}},"required":["networkSymbol","networkName","withdrawalFee"]},"AssetResource":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"BTC","description":"Asset code. This is the value every endpoint takes as `assetSymbol` — there is no bare `asset` parameter anywhere on the public API."},"assetName":{"type":"string","example":"Bitcoin"},"assetClass":{"type":"string","enum":["FIAT","STABLECOIN","STOCK","CRYPTO"],"example":"CRYPTO","description":"What kind of asset this is. `STOCK` is a tokenised equity (xStock) and is the only class whose amounts rebase — see `rebaseMultiplier`. Do not infer this from any numeric field."},"amountIncrement":{"type":"string","example":"0.00000001","description":"Smallest amount step Skipo operates on for this asset. An amount finer than this is TRUNCATED — not rejected, and not rounded up."},"displayIncrement":{"type":"string","example":"0.01","description":"Step Skipo uses when DISPLAYING this asset — coarser than `amountIncrement`. Presentation only; never validate an amount against it."},"minimumDeposit":{"type":"string","example":"0.0001","description":"Smallest deposit that will be credited."},"minimumWithdrawal":{"type":"string","example":"0.001","description":"Smallest withdrawal to an external destination."},"minimumInternalWithdrawal":{"type":"string","example":"0.0001","description":"Smallest withdrawal to another Skipo account. Usually lower than the external minimum, because no network fee is involved."},"withdrawalFee":{"type":"string","example":"0.0005","description":"Flat fee the account pays Skipo for an external withdrawal of this asset, charged in that same asset. `\"0\"` for fiat. Deposits are always free."},"maxIndicativeQuoteAmount":{"type":"string","example":"0.2","description":"Largest amount Skipo will quote for an account with no balance and no available credit. A quote within this limit is INDICATIVE — priced, but confirming it still requires funds."},"rebaseMultiplier":{"type":"string","example":"1","description":"Rebase factor currently in effect for a tokenised equity: one share = `rebaseMultiplier` settled tokens. `\"1\"` for every non-rebasing asset. This is the CURRENT factor — to render a PAST trade, use the point-in-time `multiplier` on the fill, never this one."},"networks":{"description":"Networks this asset can be withdrawn over. Empty for fiat.","type":"array","items":{"$ref":"#/components/schemas/NetworkResource"}}},"required":["assetSymbol","assetName","assetClass","amountIncrement","displayIncrement","minimumDeposit","minimumWithdrawal","minimumInternalWithdrawal","withdrawalFee","maxIndicativeQuoteAmount","rebaseMultiplier","networks"]},"MarketResource":{"type":"object","properties":{"id":{"type":"string","example":"BTC-CLP"},"baseAsset":{"type":"string","example":"BTC","description":"Base asset code. Matches a `GET /v2/assets` assetSymbol."},"quoteAsset":{"type":"string","example":"CLP","description":"Quote asset code. Matches a `GET /v2/assets` assetSymbol."},"type":{"type":"string","enum":["CRYPTO-CRYPTO","CRYPTO-FIAT","FIAT-FIAT"],"example":"CRYPTO-FIAT","description":"The asset classes this market pairs. It does NOT identify a tokenised-equity market — those are typed `CRYPTO-FIAT` too. Read `assetClass` on the asset for that."},"minBaseAmount":{"type":"string","example":"0.0001","description":"Smallest amount you may request when you denominate the trade in the BASE asset. Identical for BUY and SELL."},"minQuoteAmount":{"type":"string","example":"1000","description":"Smallest amount you may request when you denominate the trade in the QUOTE asset. Identical for BUY and SELL."},"baseIncrement":{"type":"string","example":"0.00000001","description":"Amount step on the BASE leg. A finer amount is truncated, not rejected. Equivalent to Coinbase's `base_increment` and Binance's `stepSize`."},"quoteIncrement":{"type":"string","example":"1","description":"Amount step on the QUOTE leg — e.g. `\"1\"` on a CLP market, which settles in whole pesos. Equivalent to Coinbase's `quote_increment`."},"tradingDays":{"nullable":true,"example":[1,2,3,4,5],"description":"Days of the week this market trades, as ISO weekday numbers (1 = Monday … 7 = Sunday), evaluated in UTC. `null` means it trades every day — which is the case for every crypto-only market. Tokenised-equity markets trade Monday to Friday.","type":"array","items":{"type":"number"}}},"required":["id","baseAsset","quoteAsset","type","minBaseAmount","minQuoteAmount","baseIncrement","quoteIncrement","tradingDays"]},"PriceResource":{"type":"object","properties":{"market":{"type":"string","example":"BTC-CLP","description":"The market this price is for, echoed from the request path."},"side":{"type":"string","enum":["BUY","SELL"],"example":"BUY","description":"The side priced. Buying and selling the same market are different prices — the spread is real — so a price is only meaningful together with its side."},"rate":{"type":"string","example":"59700000","description":"Quote asset per one unit of base asset. A decimal string. This is the rate for `baseAmount` specifically: Skipo prices a dealer spread, so the rate is a function of size and does NOT scale linearly to a larger amount."},"baseAmount":{"type":"string","example":"0.2","description":"Base-asset amount this price was calculated for. When the request omitted `amount`, this is the market's minimum — not a limit-free rate."},"quoteAmount":{"type":"string","example":"11940000","description":"Quote-asset amount corresponding to `baseAmount` at `rate`."},"indicative":{"type":"boolean","example":true,"description":"Always `true`. Present so a client never has to infer non-bindingness from missing fields. This price is not reserved, not held, and cannot be executed — obtaining a confirmable quote is `POST /v2/quotes`, which requires the `trading:write` scope."},"pricedAt":{"type":"string","example":"2026-07-30T04:36:02.451Z","description":"When Skipo calculated this price, ISO-8601. There is no expiry because there is nothing to expire; treat the price as a point-in-time observation and re-read it when it matters."}},"required":["market","side","rate","baseAmount","quoteAmount","indicative","pricedAt"]},"CreateQuoteDto":{"type":"object","properties":{"baseAsset":{"type":"string","example":"BTC","description":"Base asset code of the market. Together with `quoteAsset` it must name a market `GET /v2/markets` lists — the pairing is its `id`, and it is DIRECTIONAL, so the legs cannot be swapped. An unknown pairing is rejected before anything is priced."},"quoteAsset":{"type":"string","example":"CLP","description":"Quote asset code of the market."},"amountAsset":{"type":"string","example":"BTC","description":"Which leg `amount` is denominated in — it must be `baseAsset` or `quoteAsset`, and anything else is rejected. It selects which minimum applies: `minBaseAmount` or `minQuoteAmount` on `GET /v2/markets`."},"side":{"type":"string","enum":["BUY","SELL"]},"amount":{"type":"string","example":"0.5","description":"Amount to convert, denominated in `amountAsset`. A decimal string."}},"required":["baseAsset","quoteAsset","amountAsset","side","amount"]},"QuoteResource":{"type":"object","properties":{"clientOrderId":{"type":"string","deprecated":true,"description":"DEPRECATED alias of `orderId`, carrying the same value. Use `orderId`. Kept for one release so a client reading this field does not break."},"orderId":{"type":"string","description":"The id of this quote — pass it to POST /v2/orders to execute. It is also the `id` the resulting order will carry, and the value `GET /v2/orders`, `/v2/orders/{id}/fills`, `GET /v2/fills` and `GET /v2/ledger?orderId=` all key on. One id, learned once, used through the whole flow."},"market":{"type":"string","example":"BTC-CLP","description":"The market this quote priced, spelled exactly as `GET /v2/markets` publishes it — so it can be passed straight back to `GET /v2/markets/{market}`. Without it a stored quote is not self-describing: the numbers below mean nothing without knowing what was priced. This is the market Skipo RESOLVED, which is authoritative over the `baseAsset`/`quoteAsset` you sent — those are matched case-insensitively, so the casing here may differ from your request."},"rate":{"type":"string","description":"Quoted exchange rate."},"baseAmount":{"type":"string","description":"Quoted base amount. Positive magnitude."},"quoteAmount":{"type":"string","description":"Quoted quote amount. Positive magnitude."},"quotedAt":{"type":"string","nullable":true,"example":"2026-07-28T12:34:56.789Z","description":"When the quote was produced, ISO-8601. `null` if the upstream time was unusable."},"expiresAt":{"type":"string","nullable":true,"example":"2026-07-28T12:35:01.789Z","description":"When this quote stops being confirmable, ISO-8601 — about five seconds after `quotedAt`. Execute it with POST /v2/orders before this instant; afterwards expect `quotation_expired` and request a fresh quote. `null` means the expiry could not be determined — treat that as unknown, never as already expired."}},"required":["clientOrderId","orderId","market","rate","baseAmount","quoteAmount","quotedAt","expiresAt"]},"PlaceOrderDto":{"type":"object","properties":{"orderId":{"type":"string","example":"ord_abc123","description":"The orderId of the quote to execute (returned by POST /v2/quotes)."}},"required":["orderId"]},"PlacedOrderResource":{"type":"object","properties":{"id":{"type":"string","description":"Public order id (the client order id)."},"status":{"type":"string","enum":["FILLED","PROCESSING"],"description":"Placement outcome. `FILLED` — the fill executed and its balance move is booked. `PROCESSING` — the fill executed but the balance credit/debit is still being reconciled internally; the order is accepted, not yet booked. Poll GET /v2/orders/{id} for the final state, and do NOT retry a `PROCESSING` order (a retry places a new order and double-executes)."},"transactionId":{"type":"string","description":"Id of the first fill, when the order fills at placement (balance orders)."}},"required":["id","status"]},"OrderResource":{"type":"object","properties":{"id":{"type":"string","description":"Public order id (the client order id)."},"status":{"type":"string","enum":["NEW","PARTIALLY_FILLED","FILLED","FAILED"]},"side":{"type":"string","example":"BUY"},"market":{"type":"string","example":"BTC-CLP"},"baseAsset":{"type":"string"},"quoteAsset":{"type":"string"},"baseAmount":{"type":"string","description":"Ordered base amount. Positive magnitude."},"filledBaseAmount":{"type":"string","description":"Cumulative filled base amount. Positive magnitude."},"quoteAmount":{"type":"string","description":"Ordered quote amount. Positive magnitude."},"filledQuoteAmount":{"type":"string","description":"Cumulative filled quote amount. Positive magnitude."},"rate":{"type":"string"},"multiplier":{"type":"string","description":"Rebase factor applied to the base amounts and rate, as it stood when the order was placed. \"1\" when no scaling applies. Divide a base amount by it to recover the settled (SPV) figure.","example":"1"},"onCredit":{"type":"boolean","description":"Whether the order was funded on credit (capacity)."},"createdAt":{"type":"string"}},"required":["id","status","side","market","baseAsset","quoteAsset","baseAmount","filledBaseAmount","quoteAmount","filledQuoteAmount","rate","multiplier","onCredit","createdAt"]},"CursorMeta":{"type":"object","properties":{"count":{"type":"number","example":25,"description":"Number of items in THIS page."},"nextCursor":{"type":"string","nullable":true,"example":"MjAyNi0wNy0yNiAxNzo0MjowMS4wMDMzMDl8OWY4Zi00YQ","description":"Opaque token for the next page, or null on the last page. Pass it back as `cursor`. Treat it as opaque — its encoding is not part of the contract and may change."}},"required":["count","nextCursor"]},"FillOrderState":{"type":"object","properties":{"status":{"type":"string","enum":["NEW","PARTIALLY_FILLED","FILLED","FAILED"]},"filledBaseAmount":{"type":"string","description":"Cumulative filled base amount on the order. Positive magnitude."},"filledQuoteAmount":{"type":"string","description":"Cumulative filled quote amount on the order. Positive magnitude."}},"required":["status","filledBaseAmount","filledQuoteAmount"]},"FillResource":{"type":"object","properties":{"id":{"type":"string","description":"Public fill id. This is the same value the ledger entry carries as `source.id`, so a fill and its ledger movements join with no extra lookup."},"orderId":{"type":"string","description":"Id of the order this fill belongs to."},"sequence":{"type":"number","description":"1-based position of this fill within its order. A normal convert has exactly one fill; an on-credit (capacity) order has several.","example":1},"side":{"type":"string","example":"BUY"},"market":{"type":"string","example":"BTC-CLP"},"baseAsset":{"type":"string"},"quoteAsset":{"type":"string"},"baseAmount":{"type":"string","description":"Base amount filled by this fill. Positive magnitude."},"quoteAmount":{"type":"string","description":"Quote amount filled by this fill. Positive magnitude."},"rate":{"type":"string"},"multiplier":{"type":"string","description":"Rebase factor applied to `baseAmount` and `rate`, as it stood AT THIS FILL — not today. \"1\" when no scaling applies. Divide `baseAmount` by it to recover the settled (SPV) figure, which is what moved on chain and in the ledger.","example":"1"},"onCredit":{"type":"boolean","description":"Whether the owning order was funded on credit (capacity)."},"executedAt":{"type":"string"},"order":{"$ref":"#/components/schemas/FillOrderState"}},"required":["id","orderId","sequence","side","market","baseAsset","quoteAsset","baseAmount","quoteAmount","rate","multiplier","onCredit","executedAt","order"]},"AccountResource":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"email":{"type":"string"},"fullName":{"type":"string","example":"Jane Doe"},"nationalId":{"type":"string","nullable":true},"verificationStatus":{"type":"string"},"preferredCurrency":{"type":"string"}},"required":["id","username","email","fullName","nationalId","verificationStatus","preferredCurrency"]},"BalanceResource":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"BTC"},"balance":{"type":"string","example":"500"},"balanceFrozen":{"type":"string","example":"0"},"balancePending":{"type":"string","example":"100"},"balancePrefCurrency":{"type":"string","example":"500","description":"This balance converted to the account's preferred currency. The unit is not repeated here — read `preferredCurrency` from `GET /v2/account`. Named for its unit, like `balanceUSD`."},"balanceUSD":{"type":"string","example":"0.62"},"balanceCapacityTotal":{"type":"string"},"balanceCapacityAvailable":{"type":"string"},"balanceCapacitySpent":{"type":"string"}},"required":["assetSymbol","balance","balanceFrozen","balancePending","balancePrefCurrency","balanceUSD"]},"HistoricalBalancePoint":{"type":"object","properties":{"date":{"type":"string"},"balance":{"type":"string","example":"500.62","format":"number","description":"Balance at the end of the period, as an exact decimal string in plain notation — never exponential. Truncated to the asset operating precision. Parse it as a decimal, not a float."}},"required":["date","balance"]},"HistoricalBalancesResponse":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"BTC"},"granularity":{"type":"string","enum":["day","week","month"]},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/HistoricalBalancePoint"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["assetSymbol","granularity","startDate","endDate","data","pagination"]},"LedgerEntrySource":{"type":"object","properties":{"type":{"type":"string","example":"withdrawal","enum":["withdrawal","deposit","fill","other"]},"id":{"type":"string","description":"Id of the causing resource. Matches that resource’s `id`."}},"required":["type","id"]},"LedgerEntry":{"type":"object","properties":{"id":{"type":"string","description":"Id of this ledger entry."},"source":{"description":"The resource that caused this entry.","allOf":[{"$ref":"#/components/schemas/LedgerEntrySource"}]},"type":{"type":"string","example":"DEPOSIT"},"subType":{"type":"string","nullable":true,"example":"INTERNAL_EARN_DISTRIBUTION","description":"What KIND of entry this is within its type. Without it a DEPOSIT booked by an earn distribution is indistinguishable from a customer deposit."},"assetSymbol":{"type":"string","example":"BTC"},"detail":{"type":"string"},"amount":{"type":"string","example":"500","description":"Positive magnitude; direction is given by `type`."},"fee":{"type":"string","example":"0","description":"Positive magnitude."},"total":{"type":"string","example":"500","description":"Positive magnitude."},"balance":{"type":"string","example":"500.62","description":"Running balance after this entry. Signed — this is a state, not a movement."},"createdAt":{"type":"string"}},"required":["id","source","type","subType","assetSymbol","detail","amount","fee","total","balance","createdAt"]},"LedgerEntriesResponse":{"type":"object","properties":{"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/LedgerEntry"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["startDate","endDate","data","pagination"]},"CryptoContactDetails":{"type":"object","properties":{"assetSymbol":{"type":"string","nullable":true,"example":"BTC","description":"Asset code this address receives."},"assetName":{"type":"string","nullable":true,"example":"Bitcoin"},"networkSymbol":{"type":"string","nullable":true,"example":"BTC","description":"Network the address lives on."},"networkName":{"type":"string","nullable":true,"example":"Bitcoin"},"address":{"type":"string","nullable":true,"description":"The on-chain destination address."},"tag":{"type":"string","nullable":true,"description":"Destination tag / memo, for chains that require one (XRP, XLM…). Null otherwise."}},"required":["assetSymbol","assetName","networkSymbol","networkName","address","tag"]},"BankContactDetails":{"type":"object","properties":{"assetSymbol":{"type":"string","nullable":true,"example":"CLP","description":"Asset this account settles in. Always a FIAT code — a bank account cannot be denominated in a crypto asset or a tokenised equity."},"nationalId":{"type":"string","nullable":true,"description":"The account holder's national id."},"bankId":{"type":"string","nullable":true},"bankName":{"type":"string","nullable":true,"example":"Banco de Chile"},"accountTypeId":{"type":"string","nullable":true},"bankAccountType":{"type":"string","nullable":true,"example":"CHECKING"},"bankAccountNumber":{"type":"string","nullable":true},"accountEmail":{"type":"string","nullable":true}},"required":["assetSymbol","nationalId","bankId","bankName","accountTypeId","bankAccountType","bankAccountNumber","accountEmail"]},"ContactResource":{"type":"object","properties":{"id":{"type":"string"},"reference":{"type":"string","nullable":true},"type":{"type":"string","enum":["INTERNAL","EXTERNAL_CRYPTO","BANK_ACCOUNT"],"description":"Which kind of destination this is, and therefore which detail block is present: `EXTERNAL_CRYPTO` → `crypto`, `BANK_ACCOUNT` → `bank`, `INTERNAL` → neither."},"alias":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"crypto":{"description":"Present only when `type` is `EXTERNAL_CRYPTO`.","allOf":[{"$ref":"#/components/schemas/CryptoContactDetails"}]},"bank":{"description":"Present only when `type` is `BANK_ACCOUNT`.","allOf":[{"$ref":"#/components/schemas/BankContactDetails"}]}},"required":["id","reference","type","alias","createdAt","updatedAt"]},"UpdateContactReferenceDto":{"type":"object","properties":{"reference":{"type":"string","description":"New reference/alias label for the contact (does not change the destination)."}},"required":["reference"]},"DepositResource":{"type":"object","properties":{"id":{"type":"string","description":"Deposit id. Use it to re-fetch this deposit and to match its ledger entry (`source.id`)."},"type":{"type":"string","example":"DEPOSIT"},"subType":{"type":"string","enum":["INTERNAL","EXTERNAL_CRYPTO","EXTERNAL_FIAT_BANK","EXTERNAL_FIAT_REDPAY_CHARGEBACK"]},"assetSymbol":{"type":"string","example":"BTC","description":"Asset code of the deposit."},"amount":{"type":"string","description":"Amount deposited. Positive magnitude, in `assetSymbol`."},"fee":{"type":"string","example":"0","description":"Fee charged by Skipo for this deposit. Always zero — Skipo does not charge deposit fees. Present for a consistent shape across resources."},"total":{"type":"string","description":"Total credited to the balance. Positive magnitude, in `assetSymbol`."},"status":{"type":"string"},"createdAt":{"type":"string"},"depositData":{"type":"object","description":"Sub-type-specific details."}},"required":["id","type","subType","assetSymbol","amount","fee","total","status","createdAt","depositData"]},"WithdrawalResource":{"type":"object","properties":{"id":{"type":"string","description":"Withdrawal id. Use it to re-fetch this withdrawal and to match its ledger entry (`source.id`)."},"type":{"type":"string","example":"WITHDRAWAL"},"subType":{"type":"string","enum":["INTERNAL","EXTERNAL_CRYPTO","EXTERNAL_FIAT_BANK","EXTERNAL_FIAT_REDPAY","NETWORK_FEE","TRANSFER_FEE"]},"assetSymbol":{"type":"string","example":"BTC","description":"Asset code of the withdrawal."},"amount":{"type":"string","description":"Amount withdrawn, excluding the fee. Positive magnitude, in `assetSymbol`."},"fee":{"type":"string","description":"The withdrawal fee charged by Skipo, in `assetSymbol`. A flat fee — NOT the blockchain network fee, which Skipo absorbs. Positive magnitude."},"total":{"type":"string","description":"Total debited from the balance (`amount` + `fee`). Positive magnitude, in `assetSymbol`."},"status":{"type":"string"},"createdAt":{"type":"string"},"withdrawalData":{"type":"object","description":"Sub-type-specific details."}},"required":["id","type","subType","assetSymbol","amount","fee","total","status","createdAt","withdrawalData"]},"CreateWithdrawalDto":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"BTC","description":"Asset to withdraw."},"amount":{"type":"string","example":"0.05","description":"Amount to withdraw, as a positive decimal string. The withdrawal fee is charged on top — the balance is debited `amount` + `fee`."},"contactId":{"type":"string","description":"Destination contact id (a whitelisted address/account)."},"contactReference":{"type":"string","description":"Destination contact reference/alias."}},"required":["assetSymbol","amount"]},"Problem":{"type":"object","properties":{"type":{"type":"string","format":"uri","description":"Stable problem-type URI. Resolves to docs for this error.","example":"https://docs.skipo.com/errors/rate_limited"},"title":{"type":"string","description":"Short, human-readable summary (stable, English).","example":"Rate limit exceeded"},"status":{"type":"number","description":"HTTP status code.","example":429},"code":{"type":"string","description":"Stable machine-readable error code (equals the last path segment of `type`).","example":"rate_limited"},"retryable":{"type":"boolean","description":"Whether retrying the identical request may succeed.","example":true},"detail":{"type":"string","description":"Human-readable, possibly localized detail."},"instance":{"type":"string","description":"The request path that produced the error."},"traceId":{"type":"string","description":"Trace id — joins BigQuery api_request and Cloud Logging."}},"required":["type","title","status","code","retryable"]}}},"externalDocs":{"description":"Skipo API documentation","url":"https://docs.skipo.com"}}