Trade with a quote

Request a price, execute an RFQ order, and check its status.

Before trading

Use a registered key with trading access (trade) and the agreed outbound IP allowlist. Complete account verification and any required risk assessment, enable authenticator-app 2FA (TOTP) in the Coinhako app, and fund the payment currency. The quote and order APIs check that TOTP is enabled on the account; these requests do not take a one-time 2FA code.

These examples buy BTC with USD from the account balance. Confirm the pair is available to your account. Each call needs a fresh signature .

1. Create a quote

Call Create Order Quote :

POST /v1/order_quotes
{
  "symbol": "BTC-USD",
  "side": "buy",
  "quantity": "100.0",
  "currency": "USD",
  "payment_method": "user_balance"
}

This requests a quote to spend 100 USD, not to buy 100 BTC. currency tells the API which currency the quantity represents. For BTC-USD, BTC is the base currency and USD is the counter currency. When omitted, quantity defaults to the counter currency for a buy and the base currency for a sell.

On 201, save quote_id, review locked_price, and read expires_at as Unix milliseconds. Getting a quote does not execute a trade. The expiry is returned per quote; do not assume a fixed lifetime.

2. Execute the quote

Call Create Order before the quote expires:

POST /v1/orders
{
  "execution_type": "rfq",
  "order_quote_id": "<QUOTE_ID_FROM_STEP_1>"
}

The quote response’s quote_id becomes order_quote_id in this request. The quote determines the pair, side, quantity, and payment method, so you do not need to repeat them. Use a quote from the same account and environment.

Use the latest matching quote. Creating another quote for the same account, amount, pair, and payment method can make the earlier quote unusable even before its expiry. A quote that already has an order is also unusable.

You may supply a client_order_id, usually a UUID, that is unique across orders on this account. Save it before submitting so you can match the result in the order list after a timeout. A second order cannot use the same ID on the same account. A repeated create request can return an error; it does not return the original success response automatically. Omit the field when unused.

An expired quote needs a new quote and a newly signed order request.

Check the order

A 201 response means the order was created. Save its id and inspect status; creation alone does not mean the order has completed.

GET /v1/orders/<ORDER_ID>

Use Get order details to track the order, or Get orders to reconcile activity. Documented statuses include Pending, Open, Cancelling, Completed, and Cancelled; the API can also return lowercase values, so compare status values without relying on capitalization.

If submission times out, reconcile recent orders before sending again. Match your client_order_id when supplied, and retain it for any retry of the same intended order. A new ID represents a new order and bypasses that duplicate-ID protection. If the API returns an account limit, insufficient balance, or risk-assessment error, use the troubleshooting guide .

Search guides

Search the guides. Use the API reference search for endpoints.