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