Download OpenAPI specification:
The ICEx API facilitates advanced and automated trade reporting for trading exchanges and market participants.
ICEx provides a comprehensive trading infrastructure that enables:
snake_case is applied on parameters naming. uppercase & snake_case are both applied for enum values.snake_case and pairs should be written in uppercase (e.g. ICEX-BTC, ICEX-ETH, ICEX-SOL, etc).API requests must include three authentication headers:
To generate the HMAC-SHA512 signature, follow these steps:
import hmac
import hashlib
import json
def generate_signature(method, path, raw_body, timestamp, client_secret):
"""
Generate HMAC-SHA512 signature for ICEx API authentication
Args:
method: HTTP method (e.g., 'POST', 'GET')
path: API endpoint path (e.g., '/v1/trades/spot')
raw_body: Raw request body JSON string (empty string for GET/DELETE)
timestamp: Unix timestamp in milliseconds
client_secret: Your API secret key
Returns:
Hexadecimal signature string
"""
# Create canonical JSON with sorted keys
if raw_body:
try:
# Parse and re-sort JSON to ensure canonical ordering
body_dict = json.loads(raw_body)
canonical_body = json.dumps(body_dict, sort_keys=True, separators=(',', ':'))
except json.JSONDecodeError:
canonical_body = raw_body
else:
canonical_body = ""
# Build payload
payload = f"{method}|{path}|{canonical_body}|{timestamp}"
# Generate HMAC-SHA512 signature
signature = hmac.new(
client_secret.encode("utf-8"),
payload.encode("utf-8"),
hashlib.sha512
).hexdigest()
return signature
# Example usage
if __name__ == "__main__":
# Sample request data
method = "POST"
path = "/v1/trades/spot"
timestamp = 1760662221648
client_secret = "your_api_secret_here"
# Sample request body
request_data = {
"request_id": "5023ed3d-321b-4b84-b1b1-d29bd4f4566f",
"message_body": {
"trades": [
{
"trade_id": "8a13fe23-3035-4015-9acf-c52823d1fc23",
"trade_ts_ms": 1760662221648,
"side": "BUY",
"price": "2000000",
"traded_qty": "2",
"notional": "4000000",
"base_asset_id": "ICEX-SOL",
"quote_asset_id": "IDR",
"notional_asset": "IDR",
"maker_id": "EXCHANGE-USER-001",
"taker_id": "EXCHANGE-USER-002",
"maker_fees": {
"platform": {"value": "4888", "asset_id": "IDR"},
"tax": {"value": "8400", "asset_id": "IDR"},
"other": {"value": "0.00", "asset_id": "IDR"},
"bourse": {"value": "0.00", "asset_id": "IDR"}
},
"taker_fees": {
"platform": {"value": "8888", "asset_id": "IDR"},
"tax": {"value": "0", "asset_id": "IDR"},
"other": {"value": "0.00", "asset_id": "IDR"},
"bourse": {"value": "0.00", "asset_id": "IDR"}
},
"extras": [
{"key": "eth_idr_rate", "value_type": "number", "value": "2000.00"}
]
}
]
}
}
# Convert to canonical JSON
raw_body = json.dumps(request_data, sort_keys=True, separators=(',', ':'))
# Generate signature
signature = generate_signature(method, path, raw_body, timestamp, client_secret)
print(f"Payload: {method}|{path}|{raw_body}|{timestamp}")
print(f"Signature: {signature}")
# Headers to include in request
headers = {
"X-API-Key": "your_api_key_here",
"X-Signature": signature,
"X-Timestamp": str(timestamp)
}
Email: support@icex.id
Retrieve the list of assets registered in the ICEx system. This endpoint returns all available assets with their IDs, codes, names, and whitelist status.
Authentication Headers:
Use Case:
Use this endpoint to fetch the complete list of assets that can be used in trade reporting. The asset IDs returned here (e.g., ICEX-SOL, BTC-1, ICEX-ETH) should be used in the base_asset_id, quote_asset_id, and fee asset_id fields when submitting trades.
Pagination:
Results are paginated with default page size of 100. Use page and limit query parameters to control pagination.
| asset_id | string Example: asset_id=ICEX-BTC Filter by asset code (e.g., ICEX-BTC, ICEX-ETH, ICEX-SOL) |
| asset_code | string Example: asset_code=BTC Filter by asset code (e.g., BTC, ETH, SOL) |
| asset_name | string Example: asset_name=Bitcoin Filter by asset name (e.g., Bitcoin, Ethereum, Solana) |
| page | integer Example: page=1 Page number for pagination (default 1) |
| limit | integer Example: limit=100 Number of items per page (default 100) |
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
{- "timestamp": 1760662221648,
- "request_id": "7a3f8d2c-4e1b-4a93-9c2d-8f1e6b5a9d3c",
- "code": 200,
- "message": "SUCCESS",
- "data": {
- "assets": [
- {
- "asset_id": "ICEX-SOL",
- "asset_code": "SOL",
- "asset_name": "Solana",
- "is_whitelisted": true,
- "reference": {
- "cmc_id": "5426",
- "coingecko_id": "solana"
}
}, - {
- "asset_id": "ICEX-BTC",
- "asset_code": "BTC",
- "asset_name": "Bitcoin",
- "is_whitelisted": true,
- "reference": {
- "cmc_id": "1",
- "coingecko_id": "bitcoin"
}
}, - {
- "asset_id": "ICEX-ETH",
- "asset_code": "ETH",
- "asset_name": "Ethereum",
- "is_whitelisted": true,
- "reference": {
- "cmc_id": "1027",
- "coingecko_id": "ethereum"
}
}, - {
- "asset_id": "IDR",
- "asset_code": "IDR",
- "asset_name": "Indonesian Rupiah",
- "is_whitelisted": true,
- "reference": {
- "cmc_id": "",
- "coingecko_id": ""
}
}
], - "pagination": {
- "limit": 100,
- "page": 1,
- "count": 4,
- "total_pages": 1
}
}
}Submit trade reports to ICEx system. The API validates the request signature, timestamp, and trade data.
Authentication Headers:
Trade Validation:
Note: Trade report submission is processed asynchronously. The API will accept the payload and enqueue it for processing. You can check the processing status of a trade report via the status API or from the ICEx dashboard.
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
Trade report payload containing one or more trades
| request_id | string <uuid> Optional request identifier sent from the client (UUID format) for tracking purposes |
required | object (MessageBody) |
{- "request_id": "5023ed3d-321b-4b84-b1b1-d29bd4f4566f",
- "message_body": {
- "trades": [
- {
- "trade_id": "8a13fe23-3035-4015-9acf-c52823d1fc23",
- "trade_ts_ms": 1760662221648,
- "side": "BUY",
- "price": "2000000",
- "traded_qty": "2",
- "notional": "4000000",
- "base_asset_id": "ICEX-SOL",
- "quote_asset_id": "IDR",
- "notional_asset": "IDR",
- "maker_id": "EXCHANGE-USER-001",
- "taker_id": "EXCHANGE-USER-002",
- "maker_fees": {
- "platform": {
- "value": "4888",
- "asset_id": "IDR"
}, - "tax": {
- "value": "8400",
- "asset_id": "IDR"
}, - "other": {
- "value": "0.00",
- "asset_id": "IDR"
}, - "bourse": {
- "value": "0.00",
- "asset_id": "IDR"
}
}, - "taker_fees": {
- "platform": {
- "value": "8888",
- "asset_id": "IDR"
}, - "tax": {
- "value": "0",
- "asset_id": "IDR"
}, - "other": {
- "value": "0.00",
- "asset_id": "IDR"
}, - "bourse": {
- "value": "0.00",
- "asset_id": "IDR"
}
}, - "extras": [
- {
- "key": "eth_idr_rate",
- "value_type": "number",
- "value": "2000.00"
}
]
}
]
}
}{- "timestamp": 1780558773688,
- "request_id": "7e1dc4e3-4040-48c9-ba67-1ba38e23dcd3",
- "code": 2000,
- "message": "SUCCESS",
- "reason": "",
- "data": {
- "status_summary": {
- "success": 5,
- "late": 0,
- "super_late": 1
}
}
}Retrieve invalid trade records associated with a specific request ID. This endpoint returns detailed information about trades that failed validation, including the reason for failure.
Authentication Headers:
Use Case: Use this endpoint to fetch invalid trades that were rejected during the trade submission process. The response includes comprehensive details about each invalid trade, including fees, timestamps, and the specific reason for rejection.
| requestId required | string Example: 5023ed3d-321b-4b84-b1b1-d29bd4f4566f The unique request ID associated with the trade submission |
| limit | integer Default: 100 Example: limit=100 Maximum number of items to return |
| offset | integer Default: 0 Number of items to skip for pagination |
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
{- "timestamp": 1772095183215,
- "code": 2000,
- "message": "SUCCESS",
- "data": {
- "items": [
- {
- "id": "16e3f581-06c9-4bef-bfdf-ccb9eadcd671",
- "exchange_id": "7c3986a1-2c02-49dc-a24c-bb6846ef5602",
- "trade_id": "16e3f581-06c9-4bef-bfdf-ccb9eadcd671",
- "maker_user_id": "tokocrypto",
- "taker_user_id": "4091096",
- "side": "BUY",
- "asset_symbol": "USDT",
- "quantity": "2.1",
- "price_quote": "16739",
- "quote_currency": "IDR",
- "notional": "35151.9",
- "notional_asset": "IDR",
- "timestamp": "2025-11-26T08:52:11.799Z",
- "report_timestamp": "2025-11-26T08:52:11.799Z",
- "is_late": false,
- "reason": "Asset ID not found: trades[0].base_asset_id is not supported, e.g: ICEX-BTC or IDR",
- "market_maker_flag": {
- "is_market_maker": false,
- "user_id": ""
}, - "taker_fees": {
- "platform": {
- "value": "0.00378",
- "asset_id": "ICEX-USDT"
}, - "tax": {
- "value": "0",
- "asset_id": "ICEX-USDT"
}, - "other": {
- "value": "0.0004662",
- "asset_id": "ICEX-USDT"
}
}, - "maker_fees": {
- "platform": {
- "value": "0",
- "asset_id": "ICEX-USDT"
}, - "tax": {
- "value": "0",
- "asset_id": "ICEX-USDT"
}, - "other": {
- "value": "0",
- "asset_id": "ICEX-USDT"
}
}, - "extras": [
- {
- "key": "is_mm",
- "value_type": "boolean",
- "value": false
}
], - "trade_ts_ms": "2025-11-26T08:52:11.799Z",
- "recon_ts_ms": "2025-11-26T08:52:11.799Z",
- "pair": "USDT/IDR",
- "idr_pair": false,
- "created_at": "2025-11-26T08:52:11.799Z",
- "updated_at": "2025-11-26T08:52:11.799Z"
}
], - "limit": 100,
- "offset": 0,
- "total_items": 1
}
}Create a new market maker profile associated with a specific user and exchange.
When you submit a trade report, it includes two user IDs:
{
"maker_id": "EXCHANGE-USER-001",
"taker_id": "EXCHANGE-USER-002"
}
In this example:
So, if you want to assign the Market Maker, set the user_id value to the same ID used in maker_id:
{
"user_id": "EXCHANGE-USER-001"
}
Regarding the type (LiquidityProvider / MarketMaker)
Refer to the example request on the right for more details.
Note: After submit, the account status in PENDING, so you need to wait for the approval from the admin before using the account. (Also you can create market maker in dashboard)
Authentication Headers:
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
Market maker creation payload
| request_id required | string <uuid> Request identifier generated by the system (e.g UUID format) |
| user_id required | string User identifier associated with this market maker |
| name required | string Market maker name/desk label |
| type required | string Market maker type (LiquidityProvider / MarketMaker) |
{- "request_id": "550e8400-e29b-41d4-a716-446655440000",
- "user_id": "EXCHANGE-USER-001",
- "name": "ACME MM Desk",
- "type": "LiquidityProvider"
}{- "timestamp": 1763381587419,
- "request_id": "c2c5bfbb-827d-4266-bb83-de6587d432d1",
- "code": 200,
- "message": "SUCCESS",
- "data": {
- "market_maker_id": "a33b2375-29c8-49f3-a2f1-ef5f69144965"
}
}Retrieve a paginated list of market makers.
Authentication Headers:
| limit | integer Example: limit=50 |
| offset | integer Example: offset=0 |
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
{- "timestamp": 1769431991787,
- "code": 200,
- "message": "SUCCESS",
- "data": {
- "items": [
- {
- "id": "ddb7c7fa-183c-4882-a895-43efdc47ecec",
- "user_id": "EXCHANGE-USER-001",
- "exchange_id": "515c05e8-145d-4e1d-adee-25367e715cbd",
- "name": "ACME MM Desk",
- "remarks": "Primary market maker for BTC/USDT",
- "type": "LiquidityProvider",
- "status": "PENDING",
- "created_at": "2025-11-27T05:25:47.16013Z",
- "created_by": "515c05e8-145d-4e1d-adee-25367e715cbd",
- "updated_at": "2025-11-27T05:27:02.73977Z",
- "deleted_at": "0001-01-01T00:00:00Z"
}
], - "limit": 50,
- "offset": 0,
- "total_items": 1
}
}Retrieve detailed information of a specific market maker by its identifier.
Authentication Headers:
| market_maker_id required | string Example: a33b2375-29c8-49f3-a2f1-ef5f69144965 market_maker_id Id base on your market maker created |
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
{- "timestamp": 1763381796480,
- "code": 200,
- "message": "SUCCESS",
- "data": {
- "item": {
- "id": "ddb7c7fa-183c-4882-a895-43efdc47ecec",
- "user_id": "EXCHANGE-USER-001",
- "exchange_id": "515c05e8-145d-4e1d-adee-25367e715cbd",
- "name": "ACME MM Desk",
- "remarks": "Primary market maker for BTC/USDT",
- "type": "LiquidityProvider",
- "status": "PENDING",
- "created_at": "2025-11-27T05:25:47.16013Z",
- "created_by": "515c05e8-145d-4e1d-adee-25367e715cbd",
- "updated_at": "2025-11-27T05:27:02.73977Z",
- "deleted_at": "0001-01-01T00:00:00Z"
}
}
}Update the name and/or type of an existing market maker.
Authentication Headers:
| market_maker_id required | string <uuid> Example: a33b2375-29c8-49f3-a2f1-ef5f69144965 Market maker identifier |
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
| request_id required | string <uuid> Request identifier generated by the system (e.g UUID format) |
| name required | string Updated market maker name |
| type required | string Enum: "LiquidityProvider" "MarketMaker" Market maker type |
{- "request_id": "550e8400-e29b-41d4-a716-446655440000",
- "name": "Market Maker test",
- "type": "MarketMaker"
}{- "request_id": "550e8400-e29b-41d4-a716-446655440000",
- "timestamp": 1763381796480,
- "code": 200,
- "message": "SUCCESS"
}Delete (soft-delete) an existing market maker from the system.
Authentication Headers:
| market_maker_id required | string <uuid> Example: a33b2375-29c8-49f3-a2f1-ef5f69144965 Market maker identifier |
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
{- "timestamp": 1763385044093,
- "code": 200,
- "message": "SUCCESS"
}Retrieve reconciliation summary data within a specific period.
Authentication Headers:
Validation Rules:
| X-API-Key required | string Example: fe770d269580c40d2355f3e93a18a6cd944da78fbdecebb6 Your unique API key provided by ICEx |
| X-Signature required | string Example: 0ced7745366bd1a62384a62272d33b2e417e4bd8d1bce96566cbff5c275e7b2c HMAC-SHA512 signature in lowercase hex format generated using the exchange's clientSecret. Payload format: "METHOD|PATH|BODY|X-Timestamp" where METHOD is the HTTP method, PATH is the request path (no host/query), BODY is the raw request body, and X-Timestamp is the same header value. |
| X-Timestamp required | integer <int64> Example: 1760662221648 Current Unix timestamp in milliseconds (must be within 5 minutes of server time) |
{- "request_id": "c2c5bfbb-827d-4266-bb83-de6587d432d1",
- "start_period": "2026-02-20T00:00:00Z",
- "end_period": "2026-03-10T23:59:59Z"
}{- "request_id": "c2c5bfbb-827d-4266-bb83-de6587d432d1",
- "timestamp": 1763385044093,
- "message": "SUCCESS",
- "payload": [
- {
- "exchange_id": "exchange-id",
- "asset_code": "IDR",
- "amount": "99999",
- "period": "21-03-2024 23:00:00",
- "period_start_at": "2024-03-21T16:00:00Z",
- "period_end_at": "2024-03-21T17:00:00Z"
}
]
}data.status_summary field to POST /v1/trades/spot responses (200, 207, 400)status_summary contains trade batch processing counts: success, late, and super_latelate and super_late in status_summary represent valid accepted trades flagged for late submission — they are not rejections and are counted in reconciliationinvalid_trades in 207 now only lists truly rejected trades (e.g., unknown asset ID, zero amount); late/super_late are no longer listed as invalidPOST /v1/trades/spot with HMAC-SHA512 authenticationplatform, tax, other, and bourse categories for both maker and takerGET /v1/trades/spot/invalid/{requestId} with pagination supportGET /v1/assets with filters (asset_id, asset_code, asset_name) and paginationLiquidityProvider (impacts balance reconciliation) and MarketMaker (does not impact balance)POST /v1/fiat/reconcile-summary with up to 30-day period rangeextras array on trades for arbitrary typed key-value metadata (string, number, boolean)bourse fee type treated as non-deduction factor, unlike platform, tax, and other