{"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":{"description":"Unauthenticated. Use it to measure your clock offset against Skipo before signing a Tier-2 request: a signed JWT carries `iat` and an `exp` at most 60 s later, so a client whose clock drifts past that window has every money-movement call rejected as expired — which looks like an auth failure rather than a clock problem. Poll it at start-up, not per request.","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":{"description":"Reference data, identical for every key. This is the authoritative source for an asset's `assetClass` (fiat, stablecoin, crypto or tokenised equity) — balances deliberately do not publish one, so join on `assetSymbol` rather than inferring a kind from the code. It also carries `amountIncrement`, the operating precision to quantise amounts to before sending them, and the rebase factor for a tokenised equity.","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. Accepts either spelling of a tokenised equity: the settled SPV code or the rebased ticker.","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`). For a tokenised equity the REBASED ticker also resolves here — `NVDAX` returns the same asset as `NVDASPV` — so either spelling works. 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":{"description":"Reference data, identical for every key. A market id is `BASE-QUOTE` and is what `POST /v2/quotes` and `GET /v2/markets/{market}/price` take. Being listed here means the pair is tradable, not that it is currently quotable — a quote can still be refused for an amount outside the market's limits.","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`). For a tokenised equity the rebased spelling also resolves — `NVDAX-CLP` returns `NVDASPV-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.\n\nEither spelling of a tokenised equity works, in `market` and in `amountAsset` alike — `NVDAX-CLP` with `amountAsset=NVDAX` prices the same ticket as `NVDASPV-CLP` with `amountAsset=NVDASPV`. The representation of `amount` is set by `assetFormat`, never by which spelling you used.","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"}},{"name":"assetFormat","required":false,"in":"query","description":"How to express tokenised-equity (xStock) amounts — BOTH the `amount` you send and the amounts and rate you get back. `rebased` (default) = underlying equity (real shares); `base` = settled SPV tokens. No effect on other assets. `market` is unaffected either way: a market id names an instrument pair, not a quantity, and is spelled the same in both.","schema":{"$ref":"#/components/schemas/AssetFormat"}}],"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":{"description":"One order per confirmed quote. An order is completed by one or more fills, so `filledBaseAmount`/`filledQuoteAmount` are the running totals and only equal the requested amounts once `status` is `FILLED`. An on-credit order (`onCredit: true`) fills over time as the debt is paid down.\n\nFor a tokenised equity only the BASE leg rebases — the quote leg is unaffected and `rate` moves inversely — so the field-by-field relation that holds on a deposit does NOT hold here. Compare against the `base` block rather than deriving it.","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":{"$ref":"#/components/schemas/AssetFormat"}},{"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":{"$ref":"#/components/schemas/AssetFormat"}}],"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":{"description":"Takes the id returned by `POST /v2/orders` (the client order id). Use `GET /v2/orders/{id}/fills` for the individual executions behind the running totals here.","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":{"$ref":"#/components/schemas/AssetFormat"}}],"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":{"$ref":"#/components/schemas/AssetFormat"}}],"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":{"description":"Identifies the account your key belongs to, and carries the settings other endpoints refer back to — most importantly `preferredCurrency`, which is the unit of every `balancePrefCurrency` field on `GET /v2/balances`. That unit is published here and nowhere else, so a client that formats balances needs this call once at start-up.","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":{"description":"Amounts are in the underlying equity for tokenised assets by default; pass `assetFormat=base` for the settled SPV quantities that moved on chain and in the ledger. Every response echoes `assetFormat` and `multiplier`, so the units are never implicit.","operationId":"list_balances","parameters":[{"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 is held on chain and in the ledger. No effect on other assets.","schema":{"$ref":"#/components/schemas/AssetFormat"}}],"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":{"description":"End-of-period balance for one asset, at day, week or month granularity.\n\nAmounts are SETTLED quantities and this endpoint takes no `assetFormat`. The points carry no per-point rebase factor, so expressing them as the underlying equity would mean applying TODAY's ratio to past history — after a 10:1 split every earlier point would appear to jump tenfold. A correct unscaled series beats a scaled and possibly false one.\n\n`assetSymbol` still accepts either spelling: `NVDAX` reads the same series as `NVDASPV`, because that only selects which asset to read, never how it is expressed. The response echoes the settled code, so the label always matches the units.","operationId":"get_balance_history","parameters":[{"name":"assetSymbol","required":true,"in":"path","description":"The asset code published as `assetSymbol` by `GET /v2/assets`. For a tokenised equity the rebased ticker also resolves — `NVDAX` reads the same series as `NVDASPV`.","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":{"description":"A single double-entry movement. `source.id` points at the resource that caused it — the deposit, withdrawal or fill — so you can go from a ledger row straight to the movement behind it.\n\nAmounts are SETTLED quantities and this endpoint takes no `assetFormat`. For a tokenised equity that means a ledger amount will not match a `rebased` read of the same movement; compare against that resource's `base` block instead. See the Ledger section for why.","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":{"description":"Saved withdrawal destinations. A contact is what `POST /v2/withdrawals` sends to, and its asset is fixed — a withdrawal whose asset does not match its destination contact is rejected. Contacts cannot be created through v2; add them from the Skipo dashboard.","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":{"description":"Use it to confirm a destination before signing a withdrawal — the asset and the address or account it resolves to are what the withdrawal will actually use.","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":{"description":"Edits YOUR label for the contact, nothing else. The destination itself — address, network, bank account, asset — is immutable through this API, so this call can never redirect where money goes. To change a destination, create a new contact from the dashboard.","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/deposit-addresses":{"get":{"description":"The addresses to send funds TO in order to fund this account, one per (asset, chain) pair. These are Skipo-owned addresses that credit your balance — the opposite direction from `GET /v2/contacts`, which lists the external destinations you can withdraw to.\n\n**Send only over the `networkId` the address is listed under.** Several chains share an address format, so the same string can appear under more than one, and a deposit sent over a chain Skipo does not sweep is not recoverable.\n\n**Where `tagRequired` is true, the tag is mandatory.** Skipo shares one address across accounts on those chains and the tag is the only thing identifying yours; a deposit without it does not credit automatically.\n\nAddresses are stable — Skipo does not rotate or retire them, and reading this endpoint never mints one. A pair with no address yet is simply absent rather than listed empty; it appears once provisioning completes.\n\n**Only assets this account has ADDED are listed.** Skipo pre-provisions an address for effectively the whole catalogue before you ask for any of it, so holding an address does not mean the asset is in use — and listing all of them would bury the handful you actually fund. An asset you have not added answers `[]`, including when you name it with `?assetSymbol=`. Add it in the Skipo app (or open the deposit screen and select it) and it appears on the next call — the address itself already exists and does not change.\n\nThis is the same set `GET /v2/balances` returns, so the two endpoints always agree about which assets are yours.\n\nFiat has no chain and is never listed: `?assetSymbol=CLP` returns `[]`, not an error. Minimums live on `GET /v2/assets` (`minimumDeposit`); this resource carries no amounts.","operationId":"list_deposit_addresses","parameters":[{"name":"assetSymbol","required":false,"in":"query","description":"Restrict to one asset. Omit for every asset you can deposit. Accepts the rebased ticker of a tokenised equity as a synonym for its settled code — nothing here is scaled, so the two spellings name the same rows.","schema":{"example":"USDT","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DepositAddressResource"}}}}},"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 deposit addresses","tags":["Deposit addresses"]}},"/v2/deposit-instructions":{"get":{"description":"Where to send a BANK TRANSFER to fund this account in CLP. The fiat counterpart of `GET /v2/deposit-addresses`, which covers crypto.\n\n**The transfer must come from a bank account in your own name and RUT.** Skipo matches an incoming transfer to an account by the originator RUT the bank reports — there is no reference code, no memo and no per-customer account number. A transfer sent from anyone else's account cannot be matched and is NOT credited, and recovering it is a manual support case. Check the RUT Skipo holds for you with `GET /v2/account` (`nationalId`).\n\nSkipo publishes more than one account. **They are interchangeable** — a deposit into any of them credits the same balance. Prefer the one at your own bank: a same-bank transfer in Chile settles faster and costs less than an interbank one.\n\nCLP only. There is no USD bank account, so this never returns one; crypto funding is `GET /v2/deposit-addresses`. Amounts are not here — `minimumDeposit` is on `GET /v2/assets`.","operationId":"list_deposit_instructions","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BankDepositInstructionResource"}}}}},"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 fiat deposit instructions","tags":["Deposit instructions"]}},"/v2/deposits":{"get":{"description":"Every credit to the account — on-chain arrivals, bank transfers and internal movements — newest first. `subType` tells them apart, and only the on-chain ones carry a `transactionHash`.\n\nAmounts default to `rebased`. For a tokenised equity that means they are stated as the underlying equity, NOT as the tokens that moved on chain — read the `base` block, which is always present, to reconcile against a ledger entry or a webhook.\n\n`assetSymbol` accepts either spelling of a tokenised equity: filtering by the rebased ticker finds the same deposits as the settled code.","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":"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 was credited on chain and in the ledger. No effect on other assets.","schema":{"$ref":"#/components/schemas/AssetFormat"}},{"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":{"description":"Takes the same `assetFormat` as the list, so one deposit reports the same figures whichever way you reach it. The id is the one carried as `source.id` on the matching ledger entry, so a ledger row and this resource can be joined without a search.","operationId":"get_deposit","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 was credited on chain and in the ledger. No effect on other assets.","schema":{"$ref":"#/components/schemas/AssetFormat"}}],"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":{"description":"Every debit from the account, newest first. One withdrawal is one row, fee included: the fee is reported as `fee` ON the withdrawal it belongs to, never as a separate row, so summing `total` over this list is the account’s outflow with no double-counting and no filtering needed.\n\nThe `NETWORK_FEE` and `TRANSFER_FEE` sub-types exist in the enum but are Skipo’s own accounting for the gas it pays, booked against a Skipo-internal account — they never appear on a customer’s list.\n\nAmounts default to `rebased`; the always-present `base` block carries the settled figures. `fee` is the flat fee Skipo charges, NOT the blockchain network fee, which Skipo absorbs.","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 (real shares); `base` = settled SPV tokens, i.e. what moved on chain and in the ledger. No effect on other assets.","schema":{"$ref":"#/components/schemas/AssetFormat"}},{"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.\n\n**Fees.** By default `amount` is the total DEBITED and the destination receives `amount` − `fee`, as on Binance, Kraken, Coinbase and OKX — so sweeping a balance is one call: send the balance. Set `feeMode: \"add\"` to make `amount` the figure that ARRIVES, debiting `amount` + `fee`. The response reports `amount` (sent), `fee` and `total` (debited) either way.\n\n**The fee is per chain, and this body does not name one.** The chain is whatever the destination contact is registered on. Read the fee from `GET /v2/assets` → `networks[].withdrawalFee` matched on the contact’s `crypto.networkId` — the asset-level `withdrawalFee` reports the cheapest chain and will understate any other.\n\nRejections move nothing: the balance is checked before any funds are held. If a withdrawal fails after it is accepted, the full `total` — amount and fee — returns to the balance.","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":{"description":"Takes the same `assetFormat` as the list. A `PENDING` withdrawal has no `transactionHash` YET — it appears on a later read once the transaction is broadcast, so poll this or subscribe to `withdrawal.status.updated` rather than treating the initial `null` as final.","operationId":"get_withdrawal","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":{"$ref":"#/components/schemas/AssetFormat"}}],"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.\n\n**Amounts here are SETTLED quantities and this tag takes no `assetFormat`.** A ledger entry records what actually moved on chain and in the ledger at the time it moved, and the entries carry no per-entry rebase factor — so expressing them as the underlying equity would mean applying TODAY's ratio to a past movement, restating history. After a 10:1 split every earlier entry would appear to jump tenfold.\n\nThis means a ledger amount will NOT match a `rebased` read of the same movement from `GET /v2/deposits`, `GET /v2/withdrawals` or `GET /v2/orders` for a tokenised equity. Neither is wrong — they are different representations. To reconcile, read the movement with `assetFormat=base`, or compare against its `base` block, which every one of those resources publishes in both representations. `GET /v2/balances/{assetSymbol}/history` is settled-only for the same reason."},{"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":"Signed HTTP callbacks Skipo sends when your transactions\nchange, so you do not have to poll.\n\nEndpoints are registered from the Skipo dashboard, not through this API — the one operation in this\nsection is the public JWKS you verify deliveries against.\n\n## The envelope\n\nEvery delivery has the same outer shape; the resource snapshot is in `data`.\n\n| Field | Type | What it is |\n|---|---|---|\n| `id` | string | Logical event id. **Your idempotency key** — stable across retries and resends. |\n| `webhookId` | string | The endpoint that received the delivery. |\n| `eventType` | string | One of the seven below. |\n| `resourceId` | string \\| null | Id of the affected resource. |\n| `createdAt` | **number** | Event time, **epoch milliseconds** — not ISO-8601. Timestamps *inside* `data` are ISO-8601. |\n| `data` | object | Snapshot of the affected resource. |\n\nEach delivery also carries `skipo-webhook-delivery-id`, `skipo-webhook-event` and\n`skipo-webhook-signature` headers.\n\n## The seven events\n\n| Event | When | `data` shape |\n|---|---|---|\n| `withdrawal.created` | A withdrawal is created and the balance frozen. | Movement |\n| `withdrawal.status.updated` | The withdrawal changes status, terminal included. | Movement |\n| `deposit.created` | A deposit is detected and booked. | Movement |\n| `deposit.status.updated` | The deposit changes status, terminal included. | Movement |\n| `order.created` | A convert order is placed at confirm, with `status: \"NEW\"`. | Order |\n| `order.status.updated` | The order changes status. | Order |\n| `fill.created` | A fill executes against an order. | Fill |\n\nSubscribe exactly (`withdrawal.created`), by category (`withdrawal.*`) or globally (`*`). The\nsubscribable categories are `withdrawal.*`, `deposit.*`, `order.*` and `fill.*`.\n\n**Ignore event types you do not recognise** — new ones can appear at any time, and new fields can\nappear inside `data`.\n\n## The three `data` shapes\n\n- **Movement** (`withdrawal.*`, `deposit.*`) — mirrors the **WithdrawalResource** /\n  **DepositResource** schemas in this reference, including the top-level `transactionHash` and\n  `bankReference`. Status values: `PENDING`, `IN_PROGRESS`, `COMPLETED`, `FAILED`.\n- **Order** (`order.*`) — mirrors **OrderResource**: `baseAmount`/`quoteAmount` requested,\n  `filledBaseAmount`/`filledQuoteAmount` executed so far, plus `onCredit`. Status values:\n  `NEW`, `PARTIALLY_FILLED`, `FILLED`, `FAILED`.\n- **Fill** (`fill.created`) — mirrors **FillResource**, with `orderId` pointing at the parent\n  order. A fill has no status: if it reached you, it executed.\n\nAll three always carry `assetFormat`, `multiplier` and a `base` block, so one amount reader works\nfor all of them. **Amounts at the top level are always `rebased`** — a webhook carries no query\nstring, so it cannot honour `assetFormat`. Comparing them against a REST read taken with\n`assetFormat=base` will not reconcile: the two are in different units and neither is wrong.\n\n## Two things that break integrations\n\n- **A fill is not ordered against its order.** Deliveries are causally ordered per\n  `(endpoint, resourceId)`, and an order and its fills have different `resourceId`s — so a\n  `fill.created` can arrive **before** its own `order.created`. Store it and reconcile; do not\n  treat an orphan fill as an error.\n- **The status channel carries transitions, not a log.** You are not guaranteed one event per\n  internal transition, and a resource can be born terminal (`.created` and `.status.updated` both\n  `COMPLETED`, sometimes in the same millisecond). Treat each payload as current state.\n\nFull detail, worked payloads and verification code: https://docs.skipo.com/concepts/webhooks"}],"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":{"networkName":{"type":"string","example":"Bitcoin","description":"Human-readable network name."},"networkId":{"type":"string","nullable":true,"example":"BITCOIN","description":"The CANONICAL chain identifier, from maintainers chain registry — `BSC`, `ETH`, `TRON`, `BITCOIN`, `STELLAR_NETWORK`. A stable key: one row per chain, unique, and the same value wherever v2 publishes it.\n\n⚠️ This REPLACES the old `networkSymbol`, which was removed from this resource. That field was never a key — it mixed chain symbols, token standards and prose (`Stellar Network`, `XRP Ledger`, `Dogecoin`) and disagreed with itself. Key on this instead. It is also what the industry uses: Binance identifies BNB Smart Chain as `network: \"BSC\"`, and so does this."},"evmChainId":{"type":"number","nullable":true,"example":1,"description":"EIP-155 chain id for an EVM chain — 56 for BNB Smart Chain, 1 for Ethereum. `null` on a non-EVM chain (Bitcoin, Solana, XRP…). The most portable identifier there is, when it exists."},"networkNativeAsset":{"type":"string","nullable":true,"example":"BTC","description":"The chain NATIVE COIN symbol — `BNB` for BNB Smart Chain, `ETH` for Ethereum. This is the asset that pays gas on the chain, NOT an identifier for the chain itself; `networkId` is that. Published because the two are easy to confuse and both are useful."},"assetType":{"type":"string","nullable":true,"example":"BEP20","description":"The TOKEN STANDARD on this chain — `ERC20`, `BEP20`, `TRC20`, `SOL_ASSET`, or `BASE_ASSET` when the asset is the chain native coin. A different axis from `networkId`: USDT on BNB Smart Chain is `networkId: \"BSC\"` with `assetType: \"BEP20\"`. The removed `networkSymbol` collapsed both onto one column, which is why it disagreed with itself."},"withdrawalFee":{"type":"string","example":"0.0005","description":"Fee charged for a withdrawal over THIS network, denominated in the asset itself. It is per-network, so a multichain asset can price each chain differently. This is the authoritative figure — the asset-level `withdrawalFee` reports the cheapest chain."},"minimumWithdrawal":{"type":"string","example":"0.001","description":"Smallest withdrawal Skipo will send over THIS network — the EFFECTIVE minimum, already resolved as the larger of the platform floor for the asset and the chain’s own floor. Validate against this rather than the asset-level `minimumWithdrawal`, which reports only the platform half and can therefore be lower than what this chain will accept.\n\nIt applies to the quantity that is SENT. Under the default `feeMode` of `deduct` that is `amount` − `withdrawalFee`, so the smallest `amount` this network accepts is `minimumWithdrawal` + `withdrawalFee`."}},"required":["networkName","networkId","evmChainId","networkNativeAsset","assetType","withdrawalFee","minimumWithdrawal"]},"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."},"rebasedSymbol":{"type":"string","example":"BTC","description":"The REBASED ticker — the name a holder sees for this asset. For a tokenised equity this is the underlying equity code (`NVDAX`) while `assetSymbol` stays the settled SPV code (`NVDASPV`); the two are the same value for every other asset. Always present, so a UI can read this field unconditionally instead of branching. ⚠️ Equal to `assetSymbol` is NOT a claim that the asset does not rebase — use `assetClass`."},"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, as a PLATFORM-wide floor for this asset. A chain may impose a higher one of its own, and the effective minimum is the larger of the two — so a withdrawal at exactly this figure can still be rejected on a chain with a higher floor. Read `networks[].minimumWithdrawal` for the figure that applies to a given chain."},"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.\n\n⚠️ On a multichain asset this is the CHEAPEST chain’s fee, because there is no single answer — USDT costs one thing on BNB Smart Chain and another on Tron. The fee actually charged is the one of the chain your destination contact is on: read `networks[].withdrawalFee`, matched on the contact’s `crypto.networkId`. This field is kept for clients written before an asset could have more than one chain, and reports the lowest so that it never OVERstates what a withdrawal costs."},"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. It multiplies the SETTLED quantity to give the underlying shares: `shares = settledTokens × rebaseMultiplier`, so one settled token is `rebaseMultiplier` shares. To go the other way, divide. `\"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","rebasedSymbol","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."},"rebasedBaseAsset":{"type":"string","example":"BTC","description":"The REBASED ticker for the base leg — the name a holder recognises. `NVDAX` where `baseAsset` is `NVDASPV`, and the same value as `baseAsset` for everything else. ⚠️ Display only: `baseAsset` is the code `GET /v2/assets` is keyed by, and `id` keeps the settled spelling because a market id never rebases."},"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","rebasedBaseAsset","quoteAsset","type","minBaseAmount","minQuoteAmount","baseIncrement","quoteIncrement","tradingDays"]},"AssetFormat":{"type":"string","enum":["base","rebased"]},"PriceBaseRepresentation":{"type":"object","properties":{"rate":{"type":"string","example":"59700000","description":"Rate in settled units — quote asset per SETTLED base unit. Moves INVERSELY to the base amount under a rebase: the base leg divides going back to settled, so the rate multiplies."},"baseAmount":{"type":"string","example":"0.2","description":"Base-asset amount in settled units. Subject to the last-place caveat above — converts rounds to 8dp upstream, so treat this as indicative, like the price itself."},"quoteAmount":{"type":"string","example":"11940000","description":"Quote-asset amount. Never rebases — an xStock market quotes in fiat or a stablecoin — so this always equals the top-level `quoteAmount`."}},"required":["rate","baseAmount","quoteAmount"]},"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."},"assetFormat":{"description":"Which representation `baseAmount` and `rate` above are in — the value you asked for, or the default. Always present, so a client never has to infer the units it was given. `quoteAmount` is unaffected: an xStock market quotes in fiat or a stablecoin, which does not rebase.","allOf":[{"$ref":"#/components/schemas/AssetFormat"}]},"multiplier":{"type":"string","example":"1","description":"This market's base-leg rebase factor as it stands NOW, published whether or not it was applied. `\"1\"` when the base asset does not rebase. It is NOT stamped on anything — a price is a calculation, not a record — so an order placed later carries the factor in force at ITS creation, which may differ."},"base":{"description":"The same price in SETTLED units. Present in BOTH representations, so a client comparing an indicative price against a ledger entry or an existing position never has to re-request it. On a `base` read it repeats the figures above rather than disappearing.\n\nIndicative, like everything else on this resource — see the schema notes for the last-place rounding caveat that applies here and not to `POST /v2/quotes`.","allOf":[{"$ref":"#/components/schemas/PriceBaseRepresentation"}]}},"required":["market","side","rate","baseAmount","quoteAmount","indicative","pricedAt","assetFormat","multiplier","base"]},"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. For a tokenised equity either spelling works: `NVDAX` names the same market as `NVDASPV`."},"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`. Either spelling of a tokenised equity is accepted, and it names the leg ONLY — see `assetFormat` for what sets the units."},"side":{"type":"string","enum":["BUY","SELL"]},"amount":{"type":"string","example":"0.5","description":"Amount to convert, denominated in `amountAsset`. A decimal string."},"assetFormat":{"default":"rebased","description":"How to express tokenised-equity (xStock) amounts — BOTH the `amount` above and the amounts and rate in the response. `rebased` (default) = underlying equity (real shares); `base` = settled SPV tokens, i.e. what moves on chain and in the ledger. No effect on other assets. `market` is unaffected either way: a market id names an instrument pair, not a quantity, and is spelled the same in both.\n\n⚠️ This field is the ONLY thing that decides units. Either spelling of a tokenised equity is accepted in `baseAsset`, `quoteAsset` and `amountAsset` — `NVDAX` and `NVDASPV` name the same asset — and which one you use does NOT change how `amount` is read. Sending `amountAsset: \"NFLXX\"` with `assetFormat: \"base\"` prices settled tokens, because you asked for `base`. A symbol is a name; the representation is this field.","allOf":[{"$ref":"#/components/schemas/AssetFormat"}]}},"required":["baseAsset","quoteAsset","amountAsset","side","amount"]},"QuoteBaseRepresentation":{"type":"object","properties":{"rate":{"type":"string","example":"59700000","description":"Rate in settled units — quote asset per SETTLED base unit. Note the rate moves INVERSELY to the base amount under a rebase: the base leg divides going back to settled, so the rate multiplies."},"baseAmount":{"type":"string","example":"0.2","description":"Quoted base amount in settled units."},"quoteAmount":{"type":"string","example":"11940000","description":"Quoted quote amount. Never rebases — an xStock market quotes in fiat or a stablecoin — so this always equals the top-level `quoteAmount`. Repeated rather than omitted, which is what keeps the block one shape."}},"required":["rate","baseAmount","quoteAmount"]},"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","example":"59700000","description":"Quoted exchange rate."},"baseAmount":{"type":"string","example":"0.2","description":"Quoted base amount. Positive magnitude."},"quoteAmount":{"type":"string","example":"11940000","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."},"multiplier":{"type":"string","example":"1","description":"This asset's rebase factor as it stands NOW, published whether or not it was applied — so a client can convert between the two representations without a second read. `\"1\"` when the asset does not rebase. It is also the factor the resulting order and its fills will carry, because it is stamped when the order is created from this quote."},"assetFormat":{"description":"Which representation `rate` and `baseAmount` above are in — the value you asked for, or the default. Always present, so a client never has to infer the units it was given. `quoteAmount` is unaffected: an xStock market quotes in fiat or a stablecoin, which does not rebase.","allOf":[{"$ref":"#/components/schemas/AssetFormat"}]},"base":{"description":"The same quote in SETTLED units — what the resulting order and its fills will move on chain and in the ledger. Present in BOTH representations, so a client reconciling a quote against the order it becomes never has to re-request it with a different `assetFormat`. On a `base` read it repeats the figures above rather than disappearing, which is what keeps the shape stable.","allOf":[{"$ref":"#/components/schemas/QuoteBaseRepresentation"}]}},"required":["clientOrderId","orderId","market","rate","baseAmount","quoteAmount","quotedAt","expiresAt","multiplier","assetFormat","base"]},"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"]},"OrderBaseRepresentation":{"type":"object","properties":{"baseAsset":{"type":"string","example":"BTC","description":"Settled base asset — the SPV code for a tokenised equity, the ordinary code otherwise."},"quoteAsset":{"type":"string","example":"CLP","description":"Quote asset. Never rebases, so it always equals the top-level `quoteAsset`."},"baseAmount":{"type":"string","example":"0.2","description":"Ordered base amount in settled units."},"filledBaseAmount":{"type":"string","example":"0.2","description":"Cumulative filled base amount in settled units."},"quoteAmount":{"type":"string","example":"11940000","description":"Ordered quote amount. Unscaled, so identical to the top level."},"filledQuoteAmount":{"type":"string","example":"11940000","description":"Cumulative filled quote amount. Unscaled, so identical to the top level."},"rate":{"type":"string","example":"59700000","description":"Rate in settled units — quote per SETTLED base unit."}},"required":["baseAsset","quoteAsset","baseAmount","filledBaseAmount","quoteAmount","filledQuoteAmount","rate"]},"OrderResource":{"type":"object","properties":{"id":{"type":"string","example":"clord_01HZY3K8QWERTY","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"},"assetFormat":{"description":"Which representation the amounts and `baseAsset` above are in — the value you asked for, or the default. Always present, so a client never has to infer the units it was given.","allOf":[{"$ref":"#/components/schemas/AssetFormat"}]},"onCredit":{"type":"boolean","description":"Whether the order was funded on credit (capacity)."},"createdAt":{"type":"string"},"base":{"description":"The settled (SPV) figures for this order. Present on every read, in either `assetFormat`, so reconciling an order against the ledger or against its webhook never needs a second call with different parameters. On a `base` read it repeats the figures above.","allOf":[{"$ref":"#/components/schemas/OrderBaseRepresentation"}]}},"required":["id","status","side","market","baseAsset","quoteAsset","baseAmount","filledBaseAmount","quoteAmount","filledQuoteAmount","rate","multiplier","assetFormat","onCredit","createdAt","base"]},"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"]},"FillBaseOrderState":{"type":"object","properties":{"filledBaseAmount":{"type":"string","description":"Cumulative filled base amount on the order, in settled units."},"filledQuoteAmount":{"type":"string","description":"Cumulative filled quote amount. Unscaled, so identical to the top level."}},"required":["filledBaseAmount","filledQuoteAmount"]},"FillBaseRepresentation":{"type":"object","properties":{"baseAsset":{"type":"string","example":"BTC","description":"Settled base asset — the SPV code for a tokenised equity, the ordinary code otherwise."},"quoteAsset":{"type":"string","example":"CLP","description":"Quote asset. Never rebases, so it always equals the top-level `quoteAsset`."},"baseAmount":{"type":"string","description":"Base amount filled by this fill, in settled units — what actually moved on chain and in the ledger."},"quoteAmount":{"type":"string","description":"Quote amount. Unscaled, so identical to the top level."},"rate":{"type":"string","description":"Rate in settled units — quote per SETTLED base unit."},"order":{"$ref":"#/components/schemas/FillBaseOrderState"}},"required":["baseAsset","quoteAsset","baseAmount","quoteAmount","rate","order"]},"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"},"assetFormat":{"description":"Which representation the amounts and `baseAsset` above are in — the value you asked for, or the default. Always present, so a client never has to infer the units it was given.","allOf":[{"$ref":"#/components/schemas/AssetFormat"}]},"onCredit":{"type":"boolean","description":"Whether the owning order was funded on credit (capacity)."},"executedAt":{"type":"string"},"order":{"$ref":"#/components/schemas/FillOrderState"},"base":{"description":"The settled (SPV) figures for this fill. Present on every read, in either `assetFormat`. These are the amounts the ledger entries carrying this fill id will show, so a fill and its ledger movements reconcile without converting anything.","allOf":[{"$ref":"#/components/schemas/FillBaseRepresentation"}]}},"required":["id","orderId","sequence","side","market","baseAsset","quoteAsset","baseAmount","quoteAmount","rate","multiplier","assetFormat","onCredit","executedAt","order","base"]},"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"]},"BalanceBaseRepresentation":{"type":"object","properties":{"asset":{"type":"string","example":"NVDASPV","description":"Asset code of the settled token — the SPV code for a tokenised equity, and the ordinary code otherwise. Always present."},"balance":{"type":"string","example":"10","description":"Balance in settled units."},"balanceFrozen":{"type":"string","example":"0","description":"Frozen balance in settled units."},"balancePending":{"type":"string","example":"0","description":"Pending balance in settled units."}},"required":["asset","balance","balanceFrozen","balancePending"]},"BalanceResource":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"NVDAX","description":"The asset, named in the representation the amounts below are in — the rebased ticker on a `rebased` read of a tokenised equity, the settled code otherwise."},"balance":{"type":"string","example":"10.5"},"balanceFrozen":{"type":"string","example":"0"},"balancePending":{"type":"string","example":"0"},"balancePrefCurrency":{"type":"string","example":"1837.50","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":"1837.50"},"balanceCapacityTotal":{"type":"string","example":"5000"},"balanceCapacityAvailable":{"type":"string","example":"5000"},"balanceCapacitySpent":{"type":"string","example":"0"},"multiplier":{"type":"string","example":"1.05","description":"This asset's rebase factor as it stands NOW, published whether or not it was applied — so a client can convert between the two representations without a second read. `\"1\"` when the asset does not rebase. On a `rebased` read divide an amount by it to recover the settled (SPV) figure; on a `base` read multiply. Unlike an order or a fill — whose factor is the one stamped when they settled — a balance is a current holding, so the current factor is the correct one."},"assetFormat":{"example":"rebased","description":"Which representation the amounts and `assetSymbol` above are in — the value you asked for, or the default. Always present, so a client never has to infer the units it was given.","allOf":[{"$ref":"#/components/schemas/AssetFormat"}]},"base":{"description":"The same holding in SETTLED units — what is held on chain and in the ledger. Present in BOTH representations, so a client reconciling against a webhook or a ledger entry never has to re-read with a different `assetFormat`. On a `base` read it repeats the figures above rather than disappearing, which is what keeps the shape stable.","allOf":[{"$ref":"#/components/schemas/BalanceBaseRepresentation"}]}},"required":["assetSymbol","balance","balanceFrozen","balancePending","balancePrefCurrency","balanceUSD","multiplier","assetFormat","base"]},"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. For a tokenised equity this is the SETTLED quantity: see the note on `assetSymbol` for why this one series is not offered in the rebased representation."}},"required":["date","balance"]},"HistoricalBalancesResponse":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"BTC","description":"The SETTLED asset code, echoed regardless of which spelling the request used — a tokenised equity is named by its SPV code here because the balances below are settled quantities. This series carries no `assetFormat` and is never rebased: the points have no per-point factor, so scaling them would apply today's ratio to past history."},"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,"example":"2026-07-01T00:00:00.000Z","description":"The start of the window this page was filtered by — the `startDate` you sent, echoed back. `null` when you sent none, which means the page is unbounded at that end."},"endDate":{"type":"string","nullable":true,"example":"2026-07-31T23:59:59.000Z","description":"The end of the window this page was filtered by — the `endDate` you sent, echoed back. `null` when you sent none."},"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, exactly as it was stored when the contact was created — passed through UNNORMALIZED. Kept for compatibility; it is NOT a stable key. **Use `networkId` below instead** — it is the canonical chain identifier and it is published on `GET /v2/assets` too, so the two sides now join directly.\n\nWhy this field cannot be that key: it conflates the chain with the token standard and with the chain native coin. A BNB Smart Chain contact reports `BNB` here (the native COIN), while a movement on the same chain, to the same address, reports `BEP20` (the TOKEN STANDARD). Neither is the chain, which is `BSC`.\n\nThe inconsistency is not confined to contacts. Measured on production, the MOVEMENT rows carry two spellings for one chain: 164,192 withdrawals say `BEP20` while 1,614 say `BSC`; 1,501 say `ETH` while 455 say `ERC20`; Avalanche appears as both `AVAXC` and `AVAX`. The field also carries values that are not networks at all (`INTERNAL` on 56,745 withdrawals, `FIAT_NETWORK` on 15,396, plus `EARN` and `REDPAY`) and prose (`Dogecoin`, `Stellar Network`, `XRP Ledger`). Movements are unchanged and still read this way.\n\n`GET /v2/assets` no longer publishes a `networkSymbol` at all — it was removed rather than rewritten, because the reference surface now reads the canonical registry (`crypto_network`) and any value carried over would have silently changed meaning. Contacts keep theirs because here it is the contact own stored data, not a lookup."},"networkName":{"type":"string","nullable":true,"example":"Bitcoin","description":"Human-readable network name, for DISPLAY. It agrees with `GET /v2/assets` and with the movement payloads, but do not key on it: it is prose, and `Ethereum (ERC20)` is the one name on production that does not resolve to a single network.\n\n**To match a contact against an asset supported networks, use `networkId`.** It is the canonical chain identifier and it is now published on BOTH this resource and `GET /v2/assets`, so the two sides join directly. Earlier revisions of this field said to match on the name until a canonical registry existed — it exists, and this is it."},"networkId":{"type":"string","nullable":true,"example":"BITCOIN","description":"The CANONICAL chain identifier, from maintainers chain registry — `BSC`, `ETH`, `TRON`, `BITCOIN`, `STELLAR_NETWORK`. This is the field to match against the `networkId` published by `GET /v2/assets`, and it is a stable key, which `networkSymbol` above is not.\n\nIt is also what the industry keys on: Binance identifies BNB Smart Chain as `network: \"BSC\"`, and this says `BSC` too. `null` only when the network does not resolve in the registry."},"evmChainId":{"type":"number","nullable":true,"example":1,"description":"EIP-155 chain id for an EVM chain — 56 for BNB Smart Chain, 1 for Ethereum. `null` on a non-EVM chain."},"networkNativeAsset":{"type":"string","nullable":true,"example":"BTC","description":"The chain NATIVE COIN symbol — `BNB` for BNB Smart Chain. This is the asset that pays gas, NOT an identifier for the chain; `networkId` is that. Note `networkSymbol` above happens to carry this value today, which is exactly the confusion `networkId` resolves."},"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","networkId","evmChainId","networkNativeAsset","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"]},"TagType":{"type":"string","enum":["MEMO","DESTINATION_TAG"]},"DepositAddressResource":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"USDT","description":"Asset this address credits, as the SETTLED asset code — the same value every other v2 endpoint takes as `assetSymbol`."},"networkId":{"type":"string","example":"TRON","description":"The chain this address is on. The SAME key as `GET /v2/assets` `networks[].networkId` and `GET /v2/contacts` `crypto.networkId`, so an address, an asset and a destination line up without parsing prose.\n\n⚠️ An address is only valid on THIS chain. Several chains can share an address format — every EVM chain does — so the same string may appear under more than one `networkId`. Sending over a chain that is not listed here loses the funds: Skipo credits only the chains it sweeps."},"networkName":{"type":"string","example":"Tron (TRC20)","description":"Human-readable chain name. Display only."},"address":{"type":"string","example":"TDunhSa7jkTNuKrusUTU1MUHtqXoBPKETV","description":"The address to send to. Stable: Skipo does not rotate or retire deposit addresses, so it is safe to cache and to re-display. Re-reading this endpoint never mints a new one."},"tag":{"type":"string","nullable":true,"example":null,"description":"Destination tag / memo, on the chains that route by it. `null` when the chain has none — never an empty string, so a missing tag and a blank tag cannot be confused.\n\n⚠️ When `tagRequired` is true this value is MANDATORY. On those chains Skipo shares one address across accounts and the tag is the only thing that identifies yours: a deposit sent without it, or with the wrong one, does not credit automatically."},"tagRequired":{"type":"boolean","example":false,"description":"Whether the chain routes by tag. Read THIS rather than testing `tag` for null — it is the chain's property, not this row's."},"tagType":{"nullable":true,"example":null,"description":"Which of the two names this chain uses for the tag — `MEMO` (Stellar) or `DESTINATION_TAG` (XRP). `null` when `tagRequired` is false. A machine key, not a label: render it in your own copy and your own language.","allOf":[{"$ref":"#/components/schemas/TagType"}]},"tagLabel":{"type":"string","example":"Memo","nullable":true,"description":"The chain's own word for the tag, as Skipo shows it. Display only; branch on `tagType`."}},"required":["assetSymbol","networkId","networkName","address","tag","tagRequired","tagType","tagLabel"]},"BankDepositInstructionResource":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"CLP","description":"Currency this account accepts. CLP only today."},"accountHolder":{"type":"string","nullable":true,"example":"Skipo Chile SpA","description":"Account holder name, exactly as the receiving bank has it."},"accountHolderNationalId":{"type":"string","nullable":true,"example":"77.777.777-7","description":"The RUT of the account HOLDER — Skipo's, not yours. It identifies the destination; it is not the RUT the transfer has to come from. See `mustMatchSenderNationalId`."},"bankName":{"type":"string","nullable":true,"example":"Banco de Chile"},"accountType":{"type":"string","nullable":true,"example":"Cuenta Corriente"},"accountNumber":{"type":"string","nullable":true,"example":"00-123-45678-90"},"accountEmail":{"type":"string","nullable":true,"example":"deposits@skipo.com","description":"Email some Chilean banks require on the transfer form."},"mustMatchSenderNationalId":{"type":"boolean","example":true,"description":"Always `true`, and the single most important field on this resource.\n\nThe transfer MUST come from a bank account held in YOUR OWN name, under the same `nationalId` that `GET /v2/account` reports (in Chile, your RUT). Skipo matches an incoming transfer to an account by the originator RUT the bank reports, and there is no reference code, no memo and no per-customer account number to fall back on.\n\n⚠️ A transfer from a third party — a company account for a personal balance, a partner, a payment processor, a friend — CANNOT be matched and is NOT credited. Recovering it is a manual support case, not an automatic return. This is the fiat equivalent of omitting a destination tag on a crypto deposit."}},"required":["assetSymbol","accountHolder","accountHolderNationalId","bankName","accountType","accountNumber","accountEmail","mustMatchSenderNationalId"]},"DepositBaseRepresentation":{"type":"object","properties":{"asset":{"type":"string","nullable":true,"example":"USDT","description":"Asset code of the settled token. Populated on every read, including a rebased one — the rebased ticker maps back to the settled code through the maintainers snapshot. `null` only if that lookup misses, which means the asset is unknown to the snapshot rather than that the code was unobtainable. It is never the underlying ticker: a plausible-looking wrong code is worse than an obvious gap when reconciling against a webhook."},"amount":{"type":"string","example":"2000","description":"Amount deposited, in settled units. Positive magnitude."},"fee":{"type":"string","example":"0","description":"Always zero — Skipo charges no deposit fees."},"total":{"type":"string","example":"2000","description":"Total credited, in settled units. Positive magnitude."}},"required":["asset","amount","fee","total"]},"DepositResource":{"type":"object","properties":{"id":{"type":"string","example":"503c85d1-b415-4ad4-9c0c-3881e105101e","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":"USDT","description":"Asset code of the deposit."},"amount":{"type":"string","example":"2000","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","example":"2000","description":"Total credited to the balance. Positive magnitude, in `assetSymbol`."},"status":{"type":"string","example":"COMPLETED"},"createdAt":{"type":"string","example":"2026-07-15T18:08:14.637Z"},"transactionHash":{"type":"string","nullable":true,"example":"0x6392dc8a37abbfdc125c599aa57704100f7423e460d001ccabd09bc939c89e4d","description":"On-chain transaction hash, when this deposit had one. `null` otherwise — an off-chain deposit (bank transfer, internal transfer, earn distribution) never has one, and an on-chain deposit that has not been broadcast yet does not have one YET.\n\nTop-level so that reading it never requires branching on `subType`. It is the same value as `depositData.transactionHash`, which remains for the sub-types that already published it; this field additionally covers on-chain sub-types that carry a hash but publish no `depositData` block.\n\nNOT a bank reference: on a fiat deposit this is always `null`, even though the underlying record may hold the bank's own transaction id. Do not assume a `0x` prefix — BTC, Solana and Tron hashes have none."},"bankReference":{"type":"string","nullable":true,"example":null,"description":"The bank's or payment provider's own reference for this deposit, when one was recorded. `null` on every non-fiat deposit, and `null` on a fiat deposit that carries no reference (the large majority — 225 of 112,281 bank deposits on prod have one).\n\nThe counterpart of `transactionHash`: a deposit is settled either on a chain or through a bank, so at most one of the two fields is ever populated. Free-form and short (1-19 characters, not always numeric) — it is whatever the bank supplied, so treat it as an opaque string for reconciliation, never parse it."},"senderName":{"type":"string","nullable":true,"example":"JANE DOE","description":"Name of the bank account the transfer came FROM, as the sending bank reported it. `null` on every non-fiat deposit and on a fiat deposit created by an operator. Unnormalised — casing and accents are the bank’s, not ours."},"senderNationalId":{"type":"string","nullable":true,"example":"12.345.678-9","description":"National id of the sending account holder (in Chile, the RUT), and the key Skipo matches an incoming transfer on.\n\n⚠️ Published ONLY when it equals your own — the `nationalId` on `GET /v2/account`. It is `null` whenever the money came from anyone else, so this field confirms a deposit was self-funded and never discloses a third party. On the automated rail that is the normal case by construction: Skipo credits whoever owns the sending id, so the sender IS the holder.\n\nCompared ignoring formatting, so `12.345.678-9` and `123456789` match."},"senderBankId":{"type":"string","nullable":true,"example":"BANCO_DE_CHILE","description":"Identifier of the sending bank, as the rail reported it. Opaque — do not parse."},"senderAccount":{"type":"string","nullable":true,"example":"00-123-45678-90","description":"Account number the transfer came from, as the sending bank reported it."},"bankDescription":{"type":"string","nullable":true,"example":"transferencia","description":"Free text the sender put on the transfer, when the rail carried any. Empty on most deposits (76.5% on prod), so treat its absence as normal rather than as an error. Distinct from `bankReference`, which is the operator’s own number for the movement."},"valueDate":{"type":"string","nullable":true,"example":"2026-08-20T14:03:11Z","description":"When the money actually MOVED, as the rail reported it — as opposed to `createdAt`, which is when Skipo credited it. `null` on every non-fiat deposit.\n\nUse this to reconcile a month-end: on prod the two fall in different months on 1 deposit in 27 months, and the median gap is 91 seconds. Join to the ledger on `source.id`.\n\nNOT the clearing deadline the rail also publishes — that one falls AFTER the credit and would push deposits into the following month."},"assetFormat":{"example":"rebased","description":"Which representation the top-level money fields are expressed in. Echoes what the request RESOLVED to, so a response that took the default is as self-describing as one that asked.","allOf":[{"$ref":"#/components/schemas/AssetFormat"}]},"multiplier":{"type":"string","example":"1","description":"Rebase factor as it stood when the deposit was created — not today. `\"1\"` when no scaling applies. `base.amount x multiplier = amount` when `assetFormat` is `rebased`. `\"1\"` is NOT a claim that the asset does not rebase; read `GET /v2/assets` for its class."},"base":{"$ref":"#/components/schemas/DepositBaseRepresentation"},"depositData":{"type":"object","description":"Sub-type-specific details. The keys depend on `transactionSubType`, so branch on that rather than probing for fields.\n\nFor `EXTERNAL_CRYPTO` this carries the CANONICAL chain identity, the same five fields `GET /v2/assets[].networks` and `GET /v2/contacts` publish — `networkId` (`BSC`, `ETH`, `TRON`), `networkName`, `networkNativeAsset`, `evmChainId` and `assetType` (the token standard, `BEP20`/`ERC20`/`TRC20`). **Join on `networkId`**: it is the one field that means the same thing on every v2 resource, so a movement, an asset and a saved destination line up without parsing prose.\n\n⚠️ `networkSymbol` has been REMOVED from this block. It was the raw stored value and it disagreed with itself across the estate — 164,192 movements say `BEP20` for the same chain 1,614 call `BSC`, and it also carried values that are not networks (`INTERNAL`, `FIAT_NETWORK`) and prose (`Dogecoin`, `XRP Ledger`). `networkId` replaces it and is a stable key. `networkName` above is the human-readable form.\n\nThe canonical fields are always present on an `EXTERNAL_CRYPTO` movement and are `null` when the chain cannot be resolved, so the shape never changes underneath you."}},"required":["id","type","subType","assetSymbol","amount","fee","total","status","createdAt","transactionHash","bankReference","senderName","senderNationalId","senderBankId","senderAccount","bankDescription","valueDate","assetFormat","multiplier","base","depositData"]},"WithdrawalBaseRepresentation":{"type":"object","properties":{"asset":{"type":"string","nullable":true,"example":"USDT","description":"Asset code of the settled token. Populated on every read, including a rebased one — the rebased ticker maps back to the settled code through the maintainers snapshot. `null` only if that lookup misses, which means the asset is unknown to the snapshot rather than that the code was unobtainable. It is never the underlying ticker: a plausible-looking wrong code is worse than an obvious gap when reconciling against a webhook."},"amount":{"type":"string","example":"1954.78138064","description":"Amount withdrawn excluding the fee, in settled units. Positive magnitude."},"fee":{"type":"string","example":"0.5","description":"Skipo withdrawal fee, in settled units. Positive magnitude."},"total":{"type":"string","example":"1955.28138064","description":"Total debited (`amount` + `fee`), in settled units. Positive magnitude."}},"required":["asset","amount","fee","total"]},"WithdrawalResource":{"type":"object","properties":{"id":{"type":"string","example":"9bba6d71-5966-4045-962f-77a737e14226","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":"USDT","description":"Asset code of the withdrawal."},"amount":{"type":"string","example":"1954.78138064","description":"Amount withdrawn, excluding the fee. Positive magnitude, in `assetSymbol`."},"fee":{"type":"string","example":"0.5","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","example":"1955.28138064","description":"Total debited from the balance (`amount` + `fee`). Positive magnitude, in `assetSymbol`."},"status":{"type":"string","example":"COMPLETED"},"createdAt":{"type":"string","example":"2026-07-16T16:58:54.216Z"},"transactionHash":{"type":"string","nullable":true,"example":"0x8b3275b467d90d99bd99bb7bfec9402e393ce870d741131a9d69a7d42640ac5b","description":"On-chain transaction hash, when this withdrawal had one. `null` otherwise — an off-chain withdrawal (bank payout, internal transfer) never has one, and an on-chain withdrawal that has not been broadcast yet does not have one YET, so a `PENDING` withdrawal reports `null` and the hash appears on a later read.\n\nTop-level so that reading it never requires branching on `subType`. It is the same value as `withdrawalData.transactionHash`, which remains for the sub-types that already published it; this field additionally covers on-chain sub-types that carry a hash but publish no `withdrawalData` block.\n\nNOT a bank reference: on a fiat payout this is always `null`, even though the underlying record may hold the bank's own transaction id. Do not assume a `0x` prefix — BTC, Solana and Tron hashes have none."},"bankReference":{"type":"string","nullable":true,"example":null,"description":"The bank's or payment provider's own reference for this payout, when one was recorded. `null` on every non-fiat withdrawal, and `null` on a fiat withdrawal that carries no reference (the large majority — 73 of 14,502 bank payouts on prod have one). It is recorded when the payout is confirmed, so a `PENDING` bank withdrawal reports `null`.\n\nThe counterpart of `transactionHash`: a withdrawal settles either on a chain or through a bank, so at most one of the two fields is ever populated. Free-form and short (3-19 characters, not always numeric) — it is whatever the bank supplied, so treat it as an opaque string for reconciliation, never parse it."},"assetFormat":{"example":"rebased","description":"Which representation the top-level money fields are expressed in. Echoes what the request RESOLVED to, so a response that took the default is as self-describing as one that asked. `POST /v2/withdrawals` always answers `base`: a creation returns the figures as booked.","allOf":[{"$ref":"#/components/schemas/AssetFormat"}]},"multiplier":{"type":"string","example":"1","description":"Rebase factor as it stood when the withdrawal was created — not today. `\"1\"` when no scaling applies. `base.amount x multiplier = amount` when `assetFormat` is `rebased`. `\"1\"` is NOT a claim that the asset does not rebase; read `GET /v2/assets` for its class."},"base":{"$ref":"#/components/schemas/WithdrawalBaseRepresentation"},"withdrawalData":{"type":"object","description":"Sub-type-specific details. The keys depend on `transactionSubType`, so branch on that rather than probing for fields.\n\nFor `EXTERNAL_CRYPTO` this carries the CANONICAL chain identity, the same five fields `GET /v2/assets[].networks` and `GET /v2/contacts` publish — `networkId` (`BSC`, `ETH`, `TRON`), `networkName`, `networkNativeAsset`, `evmChainId` and `assetType` (the token standard, `BEP20`/`ERC20`/`TRC20`). **Join on `networkId`**: it is the one field that means the same thing on every v2 resource, so a movement, an asset and a saved destination line up without parsing prose.\n\n⚠️ `networkSymbol` has been REMOVED from this block. It was the raw stored value and it disagreed with itself across the estate — 164,192 movements say `BEP20` for the same chain 1,614 call `BSC`, and it also carried values that are not networks (`INTERNAL`, `FIAT_NETWORK`) and prose (`Dogecoin`, `XRP Ledger`). `networkId` replaces it and is a stable key. `networkName` above is the human-readable form.\n\nThe canonical fields are always present on an `EXTERNAL_CRYPTO` movement and are `null` when the chain cannot be resolved, so the shape never changes underneath you."}},"required":["id","type","subType","assetSymbol","amount","fee","total","status","createdAt","transactionHash","bankReference","assetFormat","multiplier","base","withdrawalData"]},"FeeMode":{"type":"string","enum":["deduct","add"]},"CreateWithdrawalDto":{"type":"object","properties":{"assetSymbol":{"type":"string","example":"BTC","description":"Asset to withdraw, as the SETTLED asset code. ⚠️ Unlike every read endpoint, this one does NOT accept the rebased ticker of a tokenised equity: `amount` here is in settled units and the body declares no `assetFormat`, so accepting `NVDAX` would move a different quantity than the one you signed. Sending it is rejected with the settled code and the conversion."},"amount":{"type":"string","example":"0.05","description":"Amount to withdraw, as a positive decimal string. How it is read against the fee depends on `feeMode`, which defaults to `deduct`: `amount` is the total DEBITED from the balance and the destination receives `amount` − `fee`. To sweep a balance, send the balance.\n\nThe fee is per CHAIN and the chain comes from the contact, not from this body — read it from `GET /v2/assets` → `networks[].withdrawalFee`, matched on the contact’s `crypto.networkId`. The asset-level `withdrawalFee` is the cheapest chain’s and will understate a withdrawal over any other one."},"feeMode":{"default":"deduct","description":"How `amount` relates to the withdrawal fee.\n\n`deduct` (default) — `amount` is the total debited; the destination receives `amount` − `fee`. This is what Binance, Kraken, Coinbase and OKX do, and it is what makes sweeping a balance a single call.\n\n`add` — `amount` is what the destination receives; the balance is debited `amount` + `fee`. Use it when the arriving figure must be exact — settling an invoice, a payroll line, topping an address to a specific number.\n\n⚠️ `add` was the behaviour of this endpoint before `feeMode` existed. Either value is fully supported; the response is identical in shape and always reports all three of `amount` (sent), `fee` and `total` (debited), so neither mode requires the caller to re-derive anything.\n\nNo effect on internal transfers or bank payouts, which carry no fee — set it unconditionally rather than branching on the destination type.","allOf":[{"$ref":"#/components/schemas/FeeMode"}]},"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"}}