Limit Order Endpoints¶
This section covers API endpoints related to limit orders. Limit order operations allow users to exchange currencies within the platform at a specific price set by the user. Unlike swaps, limit orders are not executed immediately but remain active until either the specified price condition is met and the order executes, or until the user cancels the order. Limit orders are ideal for users who want to exchange at a specific target price rather than the current market rate.
Feature Activation Required
To use limit order features, you need to request this feature to be enabled for your account by contacting support. Once enabled, you must also ensure that your API keys have the appropriate allow_limit_order permission. All API features require specific permissions which you can select when creating or updating API keys.
Get Available Trading Pairs¶
Returns the list of trading pairs available to the authenticated user.
Required Permissions¶
allow_limit_order
Rate Limit¶
30 requests per minute
Response Fields¶
| Field | Type | Description |
|---|---|---|
symbol | string | Trading pair symbol (e.g., BTCUSDT) |
base_currency | string | Base currency code |
quote_currency | string | Quote currency code |
price_precision | integer | Decimal precision for the price |
amount_precision | integer | Decimal precision for the amount |
total_precision | integer | Decimal precision for the quote amount (value) |
min_base_amount | string | Minimum allowed amount |
max_base_amount | string | Maximum allowed amount |
min_quote_value | string | Minimum allowed value (amount * price) |
max_quote_value | string | Maximum allowed value (amount * price) |
is_enabled | bool | Trading is active |
fee_percent | string | Trading fee percentage |
fee_deduction | string | Algorithm of fees deduction: received - from received currency; quote - always from quote currency (default) |
latest_price | string | Current market price. It may be null when do data available |
Response Example¶
[
{
"symbol": "BTCUSDT",
"base_currency": "BTC",
"quote_currency": "USDT",
"price_precision": 2,
"amount_precision": 6,
"total_precision": 8,
"min_base_amount": "0.000100",
"max_base_amount": "10.000000",
"min_quote_value": "10.00",
"max_quote_value": "1000000.00",
"is_enabled": true,
"fee_percent": "0.25",
"latest_price": "29485.25"
},
{
"symbol": "ETHUSDT",
"base_currency": "ETH",
"quote_currency": "USDT",
"price_precision": 2,
"amount_precision": 5,
"min_base_amount": "0.000100",
"max_base_amount": "10.000000",
"min_quote_value": "10.00",
"max_quote_value": "1000000.00",
"is_enabled": true,
"fee_percent": "0.25",
"latest_price": "1843.75"
}
]
Response Fields¶
| Field | Type | Description |
|---|---|---|
symbol | string | Trading pair symbol (e.g., BTCUSDT) |
base_currency | string | Base currency code |
quote_currency | string | Quote currency code |
price_precision | integer | Decimal precision for the price |
amount_precision | integer | Decimal precision for the amount |
total_precision | integer | Decimal precision for the quote amount (value) |
min_base_amount | string | Minimum allowed amount |
max_base_amount | string | Maximum allowed amount |
min_quote_value | string | Minimum allowed value (amount * price) |
max_quote_value | string | Maximum allowed value (amount * price) |
is_enabled | bool | Trading is active |
fee_percent | string | Trading fee percentage |
fee_deduction | string | Algoruthm of fees deduction: received - from received currency; quote - always from quote currency (default) |
latest_price | string | Current market price. It may be null when do data available |
Create Limit Order¶
Places a new limit order.
Required Permissions¶
allow_limit_order
Rate Limit¶
600 requests per minute
Request Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
pair | string | Yes | Trading pair symbol (e.g., BTCUSDT) (see Get Available Trading Pairs) |
side | string | Yes | Order side: "buy" or "sell" |
limit_price | string | No* | Limit price in quote currency |
spend_amount | string | No* | Order amount that you going to spend for order |
receive_amount | string | No* | Order amount that you want to receive for order (after fees) |
callback_url | string | No | URL that will be called with status updates |
custom_id | string | No | Custom identifier for tracking this order |
Amounts and limit prices are optional, but two of three parameters must be provided: limit_price, spend_amount, or receive_amount. Choose combination most suitable for your use case. Also note that spent_amount and receive_amount express different currencies depending on order side. So is you set both amounts - limit price will be calculated automatically based on those amounts and fees.
Placed order will be in open status until it is filled or cancelled by user or system in rare cases.
Example Request¶
{
"pair": "BTCUSDT",
"side": "buy",
"receive_amount": "0.01000000",
"limit_price": "29000.00",
"callback_url": "https://example.com/callbacks/orders",
"custom_id": "my-order-123"
}
Response¶
{
"code": "LMT123456",
"custom_id": "my-order-123",
"callback_url": "https://example.com/callbacks/orders",
"pair": "BTCUSDT",
"side": "buy",
"receive_amount": "0.01000000",
"limit_price": "29000.00",
"spend_amount": "290.00",
"base_amount": "0.01000000",
"quote_amount": "290.00",
"filled_base_amount": "0.00000000",
"filled_quote_amount": "0.00",
"filled_fee_amount": "0.00000000",
"fee_currency": "USDT",
"status": "open",
"reason_code": null,
"reason_message": null,
"created_at": "2023-01-15T14:30:15Z",
"updated_at": "2023-01-15T14:30:15Z",
"done_at": null
}
Response Fields¶
| Field | Type | Description |
|---|---|---|
code | string | Unique order code |
custom_id | string | Custom identifier provided in the request |
callback_url | string | URL that will be called with status updates |
pair | string | Trading pair symbol |
side | string | Order side: "buy" or "sell" |
limit_price | string | Limit price in quote currency |
spend_amount | string | Order amount reserved to spend |
receive_amount | string | Order amount expected after execution |
base_amount | string | Base amount of order |
quote_amount | string | Quote amount of order |
filled_base_amount | string | Filled amount in base currency |
filled_quote_amount | string | Filled value in quote currency |
filled_fee_amount | string | Fee amount |
fee_currency | string | Fee currency code |
status | string | Current status of the order |
reason_code | string | Error code (if the order failed) |
reason_message | string | Error message (if the order failed) |
created_at | string | Creation timestamp (ISO 8601 format) |
updated_at | string | Last update timestamp (ISO 8601 format) |
done_at | string | Completion timestamp (ISO 8601 format) |
Cancel Limit Order¶
Cancels an open limit order.
Required Permissions¶
allow_limit_order
Rate Limit¶
600 requests per minute
Request Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
code | string | Yes* | Unique order code |
custom_id | string | Yes* | Custom identifier |
At least one of the parameters code or custom_id must be provided. If both are provided, the code parameter will be used first.
Example Request¶
Response¶
Same as the order object, with status updated to cancelled.
List Limit Orders¶
Returns a list of limit orders.
Required Permissions¶
allow_limit_order
Rate Limit¶
600 requests per minute
Query Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter by status (see Order Status Values) |
pair | string | No | Filter by trading pair (see Get Available Trading Pairs) |
side | string | No | Filter by side (buy or sell) |
custom_id | string | No | Filter by custom ID |
start_at | string | No | Filter by start datetime on field created_at (inclusive, ISO 8601 format) |
end_at | string | No | Filter by end datetime on field created_at (inclusive, ISO 8601 format) |
limit | integer | No | Number of results to return (default: 100, max: 200) |
offset | integer | No | Number of results to skip (for pagination) |
Response¶
[
{
"code": "LMT123456",
"custom_id": "my-order-123",
"callback_url": "https://example.com/callbacks/orders",
"pair": "BTCUSDT",
"side": "buy",
"receive_amount": "0.01000000",
"limit_price": "29000.00",
"spend_amount": "290.00",
"base_amount": "0.01000000",
"quote_amount": "290.00",
"filled_base_amount": "0.00000000",
"filled_quote_amount": "0.00",
"filled_fee_amount": "0.00000000",
"fee_currency": "USDT",
"status": "open",
"reason_code": null,
"reason_message": null,
"created_at": "2023-01-15T14:30:15Z",
"updated_at": "2023-01-15T14:30:15Z",
"done_at": null
}
// More orders...
]
Response Fields¶
Same as the creation order response. The results are returned as a direct array without pagination metadata.
Pagination¶
The API uses simple offset-based pagination with limit and offset parameters. Offset is limited for maximum 10000, if you set more - error will be returned. The default limit is 100, and the maximum limit is 200. The response is a direct list of limit order objects without pagination metadata wrapper. If you need to fetch more than 200 limit orders, you should use the start_at and end_at parameters to fetch limit orders in smaller date ranges. List is sorted by creation date in descending order.
Get Order Details¶
Returns details of a specific order.
Required Permissions¶
allow_limit_order
Rate Limit¶
600 requests per minute
Path Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
code | string | Yes | Unique order code |
Response¶
Same as a single order object from the list endpoint.
Order Status Values¶
| Status | Description |
|---|---|
queued | Order is queued, awaiting to be placed on exchange |
open | Order is placed on the exchange |
cancelling | Order cancellation has been requested |
success | Order has been successfully completed, balance changed |
failed | Order has failed or been rejected (see reason_code for details) |
Callback Notifications¶
If a callback_url was provided when creating the order, the system will send POST requests to this URL when the order status changes.
Important Note: You may not receive callbacks for every intermediate status change or field update if changes occur very rapidly. When operations transition through multiple states quickly, intermediate callbacks may be skipped. However, you will always receive callbacks for the final states of operations. Design your callback handling to be idempotent and not dependent on receiving every single state transition.
Callback Security
Currently, callbacks are not signed. The signature mechanism for callbacks is planned for a future update. You should validate callback data by making an authenticated API request to verify the order status.
Callback Payload¶
The callback payload contains the same data as the order details response, with essential fields for status updates:
{
"code": "LMT123456",
"custom_id": "my-order-123",
"callback_url": "https://example.com/callbacks/orders",
"pair": "BTCUSDT",
"side": "buy",
"receive_amount": "0.01000000",
"limit_price": "29000.00",
"spend_amount": "290.00",
"base_amount": "0.01000000",
"quote_amount": "290.00",
"filled_base_amount": "0.00000000",
"filled_quote_amount": "0.00",
"filled_fee_amount": "0.00000000",
"fee_currency": "USDT",
"status": "open",
"reason_code": null,
"reason_message": null,
"created_at": "2023-01-15T14:30:15Z",
"updated_at": "2023-01-15T14:30:15Z",
"done_at": null
}
Securing Callbacks¶
Since callbacks are not currently signed, you should implement these security measures:
- Whitelist IPs: Accept callbacks only from the service's IP addresses. Contact support to get the list of server IPs.
- Verify Data: Always make an authenticated API request to
/limit-order/{code}to verify the status and details of any order after receiving a callback. - Use HTTPS: Ensure your callback URL uses HTTPS to encrypt the data in transit.
Common Use Cases¶
- Trading strategy execution: Implement buy/sell signals from trading strategies
- Arbitrage: Place orders on multiple exchanges
- Market making: Provide liquidity by placing buy and sell orders
- Dollar-cost averaging: Place regular buy orders at predetermined prices