Orders
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.
GET /v2/fills
List fills
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.
Parámetros
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
limit | query | integer | no | Default: 25. |
cursor | query | string | no | Opaque cursor from the previous page's pagination.nextCursor. |
orderId | query | string | no | Restrict to the fills of one order (its public id). |
market | query | string | no | Filter to one market, by the id published by GET /v2/markets — the same value this endpoint returns as market. |
assetSymbol | query | string | no | Matches either leg — fills that touched this asset. |
side | query | BUY | SELL | no | |
startDate | query | string | no | ISO-8601 start date (inclusive). |
endDate | query | string | no | ISO-8601 end date (exclusive). |
assetFormat | query | AssetFormat | no | 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. |
Respuestas
| Código | Descripción | Cuerpo |
|---|---|---|
200 | Éxito. | data: FillResource[] · pagination: CursorMeta |
401 | application/problem+json (RFC 9457) — branch on code, not on the status: unauthorized (not retryable), key_expired (not retryable), key_revoked (not retryable). | — |
403 | application/problem+json (RFC 9457) — branch on code, not on the status: insufficient_scope (not retryable), ip_not_allowed (not retryable), api_access_disabled (not retryable). | — |
429 | application/problem+json (RFC 9457) — branch on code, not on the status: rate_limited (retryable). | — |
500 | application/problem+json (RFC 9457) — branch on code, not on the status: internal_error (retryable). | — |
502 | application/problem+json (RFC 9457) — branch on code, not on the status: downstream_unavailable (retryable). | — |
503 | application/problem+json (RFC 9457) — branch on code, not on the status: maintenance (retryable). | — |
GET /v2/orders
List orders
One order per confirmed quote. An order is completed by one or more fills, so filledBaseAmount/filledQuoteAmount are the running totals and only equal the requested amounts once status is FILLED. An on-credit order (onCredit: true) fills over time as the debt is paid down.
For a tokenised equity only the BASE leg rebases — the quote leg is unaffected and rate moves inversely — so the field-by-field relation that holds on a deposit does NOT hold here. Compare against the base block rather than deriving it.
Parámetros
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
page | query | integer | no | Default: 1. |
limit | query | integer | no | Default: 25. |
status | query | NEW | PARTIALLY_FILLED | FILLED | FAILED | no | |
baseAsset | query | string | no | Filter by base asset code. |
quoteAsset | query | string | no | Filter by quote asset code. |
market | query | string | no | Filter to one market, by the id published by GET /v2/markets — the same value this endpoint returns as market. |
side | query | BUY | SELL | no | |
assetFormat | query | AssetFormat | no | How to express tokenised-equity (xStock) amounts. rebased (default) = underlying equity; base = settled SPV tokens. No effect on other assets. |
startDate | query | string | no | ISO-8601 start date. |
endDate | query | string | no | ISO-8601 end date. |
Respuestas
| Código | Descripción | Cuerpo |
|---|---|---|
200 | Éxito. | data: OrderResource[] · pagination: PaginationMeta |
401 | application/problem+json (RFC 9457) — branch on code, not on the status: unauthorized (not retryable), key_expired (not retryable), key_revoked (not retryable). | — |
403 | application/problem+json (RFC 9457) — branch on code, not on the status: insufficient_scope (not retryable), ip_not_allowed (not retryable), api_access_disabled (not retryable). | — |
429 | application/problem+json (RFC 9457) — branch on code, not on the status: rate_limited (retryable). | — |
500 | application/problem+json (RFC 9457) — branch on code, not on the status: internal_error (retryable). | — |
502 | application/problem+json (RFC 9457) — branch on code, not on the status: downstream_unavailable (retryable). | — |
503 | application/problem+json (RFC 9457) — branch on code, not on the status: maintenance (retryable). | — |
POST /v2/orders
Place an order (execute a quote)
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).
Autenticación: Petición firmada (Tier-2)
Cuerpo de la petición — PlaceOrderDto
Respuestas
| Código | Descripción | Cuerpo |
|---|---|---|
201 | Order placed and filled — the balance move is booked (status: "filled"). | PlacedOrderResource |
202 | 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. | PlacedOrderResource |
400 | application/problem+json (RFC 9457) — branch on code, not on the status: validation_error (not retryable). | — |
401 | application/problem+json (RFC 9457) — branch on code, not on the status: unauthorized (not retryable), key_expired (not retryable), key_revoked (not retryable), invalid_signature (not retryable), clock_skew (retryable), nonce_reused (retryable). | — |
403 | application/problem+json (RFC 9457) — branch on code, not on the status: insufficient_scope (not retryable), ip_not_allowed (not retryable), api_access_disabled (not retryable), two_factor_required (not retryable). | — |
422 | application/problem+json (RFC 9457) — branch on code, not on the status: unprocessable (not retryable). | — |
429 | application/problem+json (RFC 9457) — branch on code, not on the status: rate_limited (retryable). | — |
500 | application/problem+json (RFC 9457) — branch on code, not on the status: internal_error (retryable). | — |
502 | application/problem+json (RFC 9457) — branch on code, not on the status: downstream_unavailable (retryable). | — |
503 | application/problem+json (RFC 9457) — branch on code, not on the status: maintenance (retryable). | — |
GET /v2/orders/{id}
Get an order by id
Takes the id returned by POST /v2/orders (the client order id). Use GET /v2/orders/{id}/fills for the individual executions behind the running totals here.
Parámetros
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
id | path | string | sí | |
assetFormat | query | AssetFormat | no | 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. |
Respuestas
| Código | Descripción | Cuerpo |
|---|---|---|
200 | Éxito. | OrderResource |
401 | application/problem+json (RFC 9457) — branch on code, not on the status: unauthorized (not retryable), key_expired (not retryable), key_revoked (not retryable). | — |
403 | application/problem+json (RFC 9457) — branch on code, not on the status: insufficient_scope (not retryable), ip_not_allowed (not retryable), api_access_disabled (not retryable). | — |
404 | application/problem+json (RFC 9457) — branch on code, not on the status: not_found (not retryable). | — |
429 | application/problem+json (RFC 9457) — branch on code, not on the status: rate_limited (retryable). | — |
500 | application/problem+json (RFC 9457) — branch on code, not on the status: internal_error (retryable). | — |
502 | application/problem+json (RFC 9457) — branch on code, not on the status: downstream_unavailable (retryable). | — |
503 | application/problem+json (RFC 9457) — branch on code, not on the status: maintenance (retryable). | — |
GET /v2/orders/{id}/fills
List the fills of an order
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.
Parámetros
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
id | path | string | sí | |
limit | query | integer | no | Default: 25. |
cursor | query | string | no | Opaque cursor from the previous page's pagination.nextCursor. |
assetFormat | query | AssetFormat | no | 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. |
Respuestas
| Código | Descripción | Cuerpo |
|---|---|---|
200 | Éxito. | data: FillResource[] · pagination: CursorMeta |
401 | application/problem+json (RFC 9457) — branch on code, not on the status: unauthorized (not retryable), key_expired (not retryable), key_revoked (not retryable). | — |
403 | application/problem+json (RFC 9457) — branch on code, not on the status: insufficient_scope (not retryable), ip_not_allowed (not retryable), api_access_disabled (not retryable). | — |
404 | application/problem+json (RFC 9457) — branch on code, not on the status: not_found (not retryable). | — |
429 | application/problem+json (RFC 9457) — branch on code, not on the status: rate_limited (retryable). | — |
500 | application/problem+json (RFC 9457) — branch on code, not on the status: internal_error (retryable). | — |
502 | application/problem+json (RFC 9457) — branch on code, not on the status: downstream_unavailable (retryable). | — |
503 | application/problem+json (RFC 9457) — branch on code, not on the status: maintenance (retryable). | — |
POST /v2/quotes
Create a conversion quote
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.
Cuerpo de la petición — CreateQuoteDto
Respuestas
| Código | Descripción | Cuerpo |
|---|---|---|
201 | Creado. | QuoteResource |
400 | application/problem+json (RFC 9457) — branch on code, not on the status: validation_error (not retryable). | — |
401 | application/problem+json (RFC 9457) — branch on code, not on the status: unauthorized (not retryable), key_expired (not retryable), key_revoked (not retryable). | — |
403 | application/problem+json (RFC 9457) — branch on code, not on the status: insufficient_scope (not retryable), ip_not_allowed (not retryable), api_access_disabled (not retryable). | — |
422 | application/problem+json (RFC 9457) — branch on code, not on the status: unprocessable (not retryable). | — |
429 | application/problem+json (RFC 9457) — branch on code, not on the status: rate_limited (retryable). | — |
500 | application/problem+json (RFC 9457) — branch on code, not on the status: internal_error (retryable). | — |
502 | application/problem+json (RFC 9457) — branch on code, not on the status: downstream_unavailable (retryable). | — |
503 | application/problem+json (RFC 9457) — branch on code, not on the status: maintenance (retryable). | — |
Esquemas
CreateQuoteDto
| Campo | Tipo | Descripción |
|---|---|---|
baseAsset | string | Base asset code of the market. Together with quoteAsset it must name a market GET /v2/markets lists — the pairing is its id, and it is DIRECTIONAL, so the legs cannot be swapped. An unknown pairing is rejected before anything is priced. For a tokenised equity either spelling works: NVDAX names the same market as NVDASPV. Ej.: BTC. |
quoteAsset | string | Quote asset code of the market. Ej.: CLP. |
amountAsset | string | Which leg amount is denominated in — it must be baseAsset or quoteAsset, and anything else is rejected. It selects which minimum applies: minBaseAmount or minQuoteAmount on GET /v2/markets. Either spelling of a tokenised equity is accepted, and it names the leg ONLY — see assetFormat for what sets the units. Ej.: BTC. |
side | BUY | SELL | |
amount | string | Amount to convert, denominated in amountAsset. A decimal string. Ej.: 0.5. |
assetFormat (opcional) | any | How to express tokenised-equity (xStock) amounts — BOTH the amount above and the amounts and rate in the response. rebased (default) = underlying equity (real shares); base = settled SPV tokens, i.e. what moves on chain and in the ledger. No effect on other assets. market is unaffected either way: a market id names an instrument pair, not a quantity, and is spelled the same in both. ⚠️ This field is the ONLY thing that decides units. Either spelling of a tokenised equity is accepted in baseAsset, quoteAsset and amountAsset — NVDAX and NVDASPV name the same asset — and which one you use does NOT change how amount is read. Sending amountAsset: "NFLXX" with assetFormat: "base" prices settled tokens, because you asked for base. A symbol is a name; the representation is this field. |
CursorMeta
| Campo | Tipo | Descripción |
|---|---|---|
count | number | Number of items in THIS page. Ej.: 25. |
nextCursor | string | null | 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. Ej.: MjAyNi0wNy0yNiAxNzo0MjowMS4wMDMzMDl8OWY4Zi00YQ. |
FillBaseOrderState
| Campo | Tipo | Descripción |
|---|---|---|
filledBaseAmount | string | Cumulative filled base amount on the order, in settled units. |
filledQuoteAmount | string | Cumulative filled quote amount. Unscaled, so identical to the top level. |
FillBaseRepresentation
| Campo | Tipo | Descripción |
|---|---|---|
baseAsset | string | Settled base asset — the SPV code for a tokenised equity, the ordinary code otherwise. Ej.: BTC. |
quoteAsset | string | Quote asset. Never rebases, so it always equals the top-level quoteAsset. Ej.: CLP. |
baseAmount | string | Base amount filled by this fill, in settled units — what actually moved on chain and in the ledger. |
quoteAmount | string | Quote amount. Unscaled, so identical to the top level. |
rate | string | Rate in settled units — quote per SETTLED base unit. |
order | FillBaseOrderState |
FillOrderState
| Campo | Tipo | Descripción |
|---|---|---|
status | NEW | PARTIALLY_FILLED | FILLED | FAILED | |
filledBaseAmount | string | Cumulative filled base amount on the order. Positive magnitude. |
filledQuoteAmount | string | Cumulative filled quote amount on the order. Positive magnitude. |
FillResource
| Campo | Tipo | Descripción |
|---|---|---|
id | string | 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 | string | Id of the order this fill belongs to. |
sequence | number | 1-based position of this fill within its order. A normal convert has exactly one fill; an on-credit (capacity) order has several. Ej.: 1. |
side | string | Ej.: BUY. |
market | string | Ej.: BTC-CLP. |
baseAsset | string | |
quoteAsset | string | |
baseAmount | string | Base amount filled by this fill. Positive magnitude. |
quoteAmount | string | Quote amount filled by this fill. Positive magnitude. |
rate | string | |
multiplier | string | 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. Ej.: 1. |
assetFormat | any | Which representation the amounts and baseAsset above are in — the value you asked for, or the default. Always present, so a client never has to infer the units it was given. |
onCredit | boolean | Whether the owning order was funded on credit (capacity). |
executedAt | string | |
order | FillOrderState | |
base | any | The settled (SPV) figures for this fill. Present on every read, in either assetFormat. These are the amounts the ledger entries carrying this fill id will show, so a fill and its ledger movements reconcile without converting anything. |
OrderBaseRepresentation
| Campo | Tipo | Descripción |
|---|---|---|
baseAsset | string | Settled base asset — the SPV code for a tokenised equity, the ordinary code otherwise. Ej.: BTC. |
quoteAsset | string | Quote asset. Never rebases, so it always equals the top-level quoteAsset. Ej.: CLP. |
baseAmount | string | Ordered base amount in settled units. Ej.: 0.2. |
filledBaseAmount | string | Cumulative filled base amount in settled units. Ej.: 0.2. |
quoteAmount | string | Ordered quote amount. Unscaled, so identical to the top level. Ej.: 11940000. |
filledQuoteAmount | string | Cumulative filled quote amount. Unscaled, so identical to the top level. Ej.: 11940000. |
rate | string | Rate in settled units — quote per SETTLED base unit. Ej.: 59700000. |
OrderResource
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Public order id (the client order id). Ej.: clord_01HZY3K8QWERTY. |
status | NEW | PARTIALLY_FILLED | FILLED | FAILED | |
side | string | Ej.: BUY. |
market | string | Ej.: BTC-CLP. |
baseAsset | string | |
quoteAsset | string | |
baseAmount | string | Ordered base amount. Positive magnitude. |
filledBaseAmount | string | Cumulative filled base amount. Positive magnitude. |
quoteAmount | string | Ordered quote amount. Positive magnitude. |
filledQuoteAmount | string | Cumulative filled quote amount. Positive magnitude. |
rate | string | |
multiplier | string | 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. Ej.: 1. |
assetFormat | any | Which representation the amounts and baseAsset above are in — the value you asked for, or the default. Always present, so a client never has to infer the units it was given. |
onCredit | boolean | Whether the order was funded on credit (capacity). |
createdAt | string | |
base | any | The settled (SPV) figures for this order. Present on every read, in either assetFormat, so reconciling an order against the ledger or against its webhook never needs a second call with different parameters. On a base read it repeats the figures above. |
PaginationMeta
| Campo | Tipo | Descripción |
|---|---|---|
page | number | Ej.: 1. |
limit | number | Ej.: 25. |
totalItems | number | Ej.: 100. |
totalPages | number | Ej.: 4. |
PlaceOrderDto
| Campo | Tipo | Descripción |
|---|---|---|
orderId | string | The orderId of the quote to execute (returned by POST /v2/quotes). Ej.: ord_abc123. |
PlacedOrderResource
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Public order id (the client order id). |
status | FILLED | PROCESSING | 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 (opcional) | string | Id of the first fill, when the order fills at placement (balance orders). |
Problem
| Campo | Tipo | Descripción |
|---|---|---|
type | string | Stable problem-type URI. Resolves to docs for this error. Ej.: https://docs.skipo.com/errors/rate_limited. |
title | string | Short, human-readable summary (stable, English). Ej.: Rate limit exceeded. |
status | number | HTTP status code. Ej.: 429. |
code | string | Stable machine-readable error code (equals the last path segment of type). Ej.: rate_limited. |
retryable | boolean | Whether retrying the identical request may succeed. Ej.: true. |
detail (opcional) | string | Human-readable, possibly localized detail. |
instance (opcional) | string | The request path that produced the error. |
traceId (opcional) | string | Trace id — joins BigQuery api_request and Cloud Logging. |
QuoteBaseRepresentation
| Campo | Tipo | Descripción |
|---|---|---|
rate | string | Rate in settled units — quote asset per SETTLED base unit. Note the rate moves INVERSELY to the base amount under a rebase: the base leg divides going back to settled, so the rate multiplies. Ej.: 59700000. |
baseAmount | string | Quoted base amount in settled units. Ej.: 0.2. |
quoteAmount | string | Quoted quote amount. Never rebases — an xStock market quotes in fiat or a stablecoin — so this always equals the top-level quoteAmount. Repeated rather than omitted, which is what keeps the block one shape. Ej.: 11940000. |
QuoteResource
| Campo | Tipo | Descripción |
|---|---|---|
clientOrderId | string | DEPRECATED alias of orderId, carrying the same value. Use orderId. Kept for one release so a client reading this field does not break. |
orderId | string | 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 | string | 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. Ej.: BTC-CLP. |
rate | string | Quoted exchange rate. Ej.: 59700000. |
baseAmount | string | Quoted base amount. Positive magnitude. Ej.: 0.2. |
quoteAmount | string | Quoted quote amount. Positive magnitude. Ej.: 11940000. |
quotedAt | string | null | When the quote was produced, ISO-8601. null if the upstream time was unusable. Ej.: 2026-07-28T12:34:56.789Z. |
expiresAt | string | null | 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. Ej.: 2026-07-28T12:35:01.789Z. |
multiplier | string | This asset's rebase factor as it stands NOW, published whether or not it was applied — so a client can convert between the two representations without a second read. "1" when the asset does not rebase. It is also the factor the resulting order and its fills will carry, because it is stamped when the order is created from this quote. Ej.: 1. |
assetFormat | any | Which representation rate and baseAmount above are in — the value you asked for, or the default. Always present, so a client never has to infer the units it was given. quoteAmount is unaffected: an xStock market quotes in fiat or a stablecoin, which does not rebase. |
base | any | The same quote in SETTLED units — what the resulting order and its fills will move on chain and in the ledger. Present in BOTH representations, so a client reconciling a quote against the order it becomes never has to re-request it with a different assetFormat. On a base read it repeats the figures above rather than disappearing, which is what keeps the shape stable. |
Volver a la referencia de endpoints. Ver también: Paginación · Errores · Ids y correlación.