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
.