API reference · Trading

Accept a quote

POST/v1/trades

Executes an open quote. Returns 201 when filled, or 202 while the trade is still pending; poll GET /v1/trades/{id}. Refused with price_moved when the market has moved against the quote by more than the account's tolerance. Idempotency-Key is required: on a timeout, retry with the same key.

Scope
trade
Rate-limit class
trade
Authentication
Signed
Idempotency-Key
Required

Parameters

  • Idempotency-Keystringheaderrequired

    1 to 64 characters of [A-Za-z0-9_-]. Kept for 24 h; reuse it to retry safely.

    Matches ^[A-Za-z0-9_-]{1,64}$.

Request body

application/json · CreateTradeRequest. Unknown fields are rejected.

  • quote_idstringrequired

    Starts with qt_. Example: qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W.

Responses

201 Created

The trade, filled or failed. application/json · Trade

  • idstring

    Starts with tr_.

  • quote_idstringnullable

    null for trades made before quotes existed.

    Starts with qt_.

  • assetstring

    An upper-case asset symbol.

    Matches ^[A-Z0-9]{1,15}$.

  • sidestring (enum)

    One of buy, sell.

  • quote_currency"USDC"
  • base_amountstring (decimal)
  • quote_amountstring (decimal)
  • pricestring (decimal)
  • statusstring (enum)

    One of pending, filled, failed.

  • sourcestring (enum)

    Where the record was made: this API, the mobile app or the webapp.

    One of public_api, app, web.

  • created_atstring (date-time)
  • filled_atstring (date-time)nullable
  • failure_reasonstring | null

202 Accepted

The trade, still pending. application/json · Trade

  • idstring

    Starts with tr_.

  • quote_idstringnullable

    null for trades made before quotes existed.

    Starts with qt_.

  • assetstring

    An upper-case asset symbol.

    Matches ^[A-Z0-9]{1,15}$.

  • sidestring (enum)

    One of buy, sell.

  • quote_currency"USDC"
  • base_amountstring (decimal)
  • quote_amountstring (decimal)
  • pricestring (decimal)
  • statusstring (enum)

    One of pending, filled, failed.

  • sourcestring (enum)

    Where the record was made: this API, the mobile app or the webapp.

    One of public_api, app, web.

  • created_atstring (date-time)
  • filled_atstring (date-time)nullable
  • failure_reasonstring | null

Every response carries MK-Request-Id, plus RateLimit-Policy and RateLimit.

Errors

Errors use the error envelope. Match on code.

StatusCodeMeaning
400invalid_requestThe request is malformed: bad JSON, an unknown or invalid field, or a missing header.
401invalid_signatureThe MK-* headers are missing or malformed, the key id is unknown, or the signature doesn't match.
401key_expiredThe key has passed its expiry date.
401key_revokedThe key was revoked.
401timestamp_out_of_rangeMK-Timestamp is more than 30 seconds from the server clock.
401nonce_reusedThis key already used this MK-Nonce.
403ip_not_allowedThe request came from an address outside the key's IP allowlist.
403insufficient_scopeThe key doesn't have the scope this endpoint needs.
403account_restrictedThe account can't use the API right now (for example locked, inactive, or onboarding not finished).
403api_access_disabledAPI access is switched off.
404not_foundNo such resource.
409idempotency_conflictThis Idempotency-Key was used with a different request body.
409idempotency_in_progressA request with this Idempotency-Key is still being processed.
409quote_already_usedThe quote was already accepted.
413payload_too_largeThe request body is larger than 8 KB.
415unsupported_media_typeRequest bodies must be application/json.
422quote_expiredThe quote has expired.
422price_movedThe market moved too far from the quoted price.
422insufficient_fundsThe available balance doesn't cover the trade, gift card or withdrawal.
422limit_exceededA daily or 30-day limit would be exceeded.
422asset_not_tradableThe asset can't be traded right now.
429rate_limitedToo many requests. Wait for Retry-After seconds.
429too_many_concurrent_requestsToo many requests in flight for this key or account.
429key_suspendedThe key is suspended, for example after sustained rate limiting.
500internal_errorSomething went wrong on our side.
502bad_gatewayAn upstream service answered unexpectedly.
503overloadedThe service is overloaded. Retry after Retry-After seconds.
503service_unavailableThe service is temporarily unavailable.
503maintenanceThe API is read-only for maintenance.
503trading_haltedTrading is paused: switched off, or paused for this asset for a short while after a fast price move.
504gateway_timeoutAn upstream service didn't answer in time. A POST may still complete; retry with the same Idempotency-Key.

Request

# Signed by sign-headers.sh: see Authentication
body='{"quote_id":"qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W"}'
idempotency_key=$(uuidgen)   # reuse it to retry safely
curl https://public-api.myntkaup.is/v1/trades \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $idempotency_key" \
  $(./sign-headers.sh POST /v1/trades "$body" | sed 's/^/-H /') \
  --data "$body"
import { Myntkaup } from "@myntkaup/api";

const client = new Myntkaup(); // reads the key from the environment
// Sends a random Idempotency-Key unless you pass idempotencyKey.
const trade = await client.trades.create({ quoteId: "qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W" });
console.log(trade.status, trade.base_amount);
from myntkaup import Myntkaup

client = Myntkaup()  # reads the key from the environment
# Sends a random Idempotency-Key unless you pass idempotency_key.
trade = client.trades.create(quote_id="qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W")
print(trade["status"], trade["base_amount"])

Response

201 Created
{
  "id": "tr_01JB8X2Q4M7Z3V9K5T1N6R0P2W",
  "quote_id": "qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W",
  "asset": "BTC",
  "side": "buy",
  "quote_currency": "USDC",
  "base_amount": "0.00104210",
  "quote_amount": "100.00",
  "price": "95960.12",
  "status": "filled",
  "source": "public_api",
  "created_at": "2026-11-03T10:15:12Z",
  "filled_at": "2026-11-03T10:15:13Z",
  "failure_reason": null
}
202 Accepted
{
  "id": "tr_01JB8X2Q4M7Z3V9K5T1N6R0P2W",
  "quote_id": "qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W",
  "asset": "BTC",
  "side": "buy",
  "quote_currency": "USDC",
  "base_amount": "0.00104210",
  "quote_amount": "100.00",
  "price": "95960.12",
  "status": "pending",
  "source": "public_api",
  "created_at": "2026-11-03T10:15:12Z",
  "filled_at": null,
  "failure_reason": null
}

Base URL https://public-api.myntkaup.is