认证
HTTP Basic:用户名为 Key ID,密码为 Secret。Authorization: Basic base64(keyId:secret)
# 推荐写法(curl 自动编码 Basic)
curl -u "$KEY_ID:$SECRET" 'https://luno.local/api/1/balance'
# 等价写法
curl -H "Authorization: Basic $(printf '%s:%s' "$KEY_ID" "$SECRET" | base64)" 'https://luno.local/api/1/balance'
- · Secret 以 sha256 哈希存储,仅在创建时显示一次。
- · 权限:READ_INFO 可读账户数据,WRITE 可下单/转账/提现,ALL 为全部。
- · 可配置 IP 白名单(支持单个 IPv4 或 CIDR,例如 41.0.0.0/8)。
- · 限流:每个 Key + IP 每分钟 100 次;公开接口按 IP 每分钟 100 次。
- · 所有响应带 CORS 头,GET 响应为 no-store;OPTIONS 预检返回 204。
GET/api/1/tickers公开全部市场行情快照
示例请求 curl
curl 'https://luno.local/api/1/tickers'
返回示例
{
"tickers": [
{
"pair": "XBTZAR",
"base": "XBT",
"counter": "ZAR",
"timestamp": 1735689600000,
"bid": "1267000",
"ask": "1269000",
"last_trade": "1268014.00",
"open_24h": "1255000.00",
"high_24h": "1275000.00",
"low_24h": "1248000.00",
"volume_24h": "12.345",
"quote_volume_24h": "15647890.2",
"change_24h": 1.04,
"enabled": true,
"halted": false
}
]
}GET/api/1/ticker公开单市场行情快照
示例请求 curl
curl 'https://luno.local/api/1/ticker?pair=XBTZAR'
返回示例
{
"pair": "XBTZAR",
"timestamp": 1735689600000,
"bid": "1267000",
"ask": "1269000",
"last_trade": "1268014.00",
"change_24h": 1.04
}GET/api/1/orderbook公开盘口深度(买卖各 limit 档)
| 参数 | 必填 | 说明 |
|---|
| pair | 是 | 交易对 |
| limit | 否 | 每侧档位数,默认 100,最大 500 |
示例请求 curl
curl 'https://luno.local/api/1/orderbook?pair=XBTZAR&limit=50'
返回示例
{
"pair": "XBTZAR",
"timestamp": 1735689600000,
"bids": [{ "price": "1267000", "volume": "0.42", "order_count": 3 }],
"asks": [{ "price": "1269000", "volume": "0.18", "order_count": 2 }],
"bid": "1267000",
"ask": "1269000"
}- · 无撮合数据时由 Order 表按价格聚合 OPEN/PARTIAL 挂单。
GET/api/1/trades公开最近成交(倒序)
| 参数 | 必填 | 说明 |
|---|
| pair | 是 | 交易对 |
| limit | 否 | 条数,默认 100,最大 1000 |
| since | 否 | 毫秒时间戳,仅返回该时间之后的成交 |
示例请求 curl
curl 'https://luno.local/api/1/trades?pair=XBTZAR&limit=10'
返回示例
{
"pair": "XBTZAR",
"trades": [
{ "timestamp": 1735689600000, "price": "1268014.00", "volume": "0.012", "is_buy": true, "base": "XBT", "counter": "ZAR" }
]
}GET/api/1/markets公开可交易市场元数据
示例请求 curl
curl 'https://luno.local/api/1/markets'
返回示例
{
"markets": [
{
"market_id": "XBTZAR",
"pair": "XBTZAR",
"base_currency": "XBT",
"counter_currency": "ZAR",
"tick_size": "1",
"lot_size": "0.00001",
"min_notional": "10",
"maker_fee_bps": 10,
"taker_fee_bps": 20,
"enabled": true,
"halted": false,
"ticker": { "pair": "XBTZAR", "last_trade": "1268014.00" }
}
]
}GET/api/1/candles公开K 线(按 duration 聚合)
| 参数 | 必填 | 说明 |
|---|
| pair | 是 | 交易对 |
| since | 否 | 毫秒时间戳,K 线桶起点不早于该时间 |
| duration | 否 | 周期秒数,支持 60/300/900/1800/3600/14400/86400,默认 3600 |
| limit | 否 | 条数,默认 100,最大 1000 |
示例请求 curl
curl 'https://luno.local/api/1/candles?pair=XBTZAR&duration=3600&limit=24'
返回示例
{
"pair": "XBTZAR",
"duration": 3600,
"candles": [
{ "timestamp": 1735686000000, "open": "1267000", "high": "1269500", "low": "1266400", "close": "1268014", "volume": "0.87" }
]
}- · 库中仅有 1m K 线时,会按 duration 自动滚动聚合。
GET/api/1/balanceAPI Key资产余额(可用 + 冻结)
示例请求 curl
curl -u "$KEY_ID:$SECRET" 'https://luno.local/api/1/balance'
返回示例
{
"balance": [
{ "account_id": "acc_1", "asset": "XBT", "name": "Bitcoin", "balance": "0.512", "reserved": "0.05", "unconfirmed": "0" }
]
}GET/api/1/accountsAPI Key账户列表(可按资产过滤)
示例请求 curl
curl -u "$KEY_ID:$SECRET" 'https://luno.local/api/1/accounts?asset=XBT'
返回示例
{
"accounts": [
{ "id": "acc_1", "name": "Bitcoin", "asset": "XBT", "type": "SPOT", "balance": "0.512", "reserved": "0.05", "unconfirmed": "0" }
]
}POST/api/1/accountsAPI Key创建账户(createaccount,幂等)
| 参数 | 必填 | 说明 |
|---|
| asset | 是 | 资产代码(也可用 currency) |
| name | 否 | 可选显示名 |
示例请求 curl
curl -u "$KEY_ID:$SECRET" -X POST 'https://luno.local/api/1/accounts' \
-H 'content-type: application/json' \
-d '{"asset":"XBT","name":"Bitcoin"}'返回示例
{
"account_id": "acc_1",
"locked_account_id": "acc_2",
"asset": "XBT",
"name": "Bitcoin",
"balance": "0",
"reserved": "0",
"unconfirmed": "0"
}- · 权限:WRITE
- · 账户由复式记账账本惰性创建,重复调用不会重复建户。
POST/api/1/postorderAPI Key下单(LIMIT / MARKET)
| 参数 | 必填 | 说明 |
|---|
| pair | 是 | 交易对,例如 XBTZAR |
| type | 是 | BID(买入)或 ASK(卖出),也接受 BUY/SELL |
| volume | 是 | 基础资产数量,十进制字符串 |
| price | 否 | 限价;省略或 0 表示市价单 |
| order_type | 否 | LIMIT 或 MARKET,默认按 price 推断 |
| client_order_id | 否 | 客户端订单号 |
示例请求 curl
curl -u "$KEY_ID:$SECRET" -X POST 'https://luno.local/api/1/postorder' \
-H 'content-type: application/json' \
-d '{"pair":"XBTZAR","type":"BID","volume":"0.001","price":"1265000"}'返回示例
{
"order_id": "clx123",
"pair": "XBTZAR",
"type": "LIMIT",
"side": "BUY",
"side_label": "BID",
"state": "PENDING",
"status": "OPEN",
"limit_price": "1265000",
"limit_volume": "0.001",
"filled": "0",
"remaining": "0.001",
"average_price": "0",
"fee_paid": "0",
"hold_asset": "ZAR",
"success": true
}- · 权限:WRITE
- · 请求转发到撮合引擎 POST /orders(x-engine-token 内部鉴权)。
POST/api/1/stoporderAPI Key止损单(STOP_LIMIT)
| 参数 | 必填 | 说明 |
|---|
| pair | 是 | 交易对 |
| type | 是 | BID 或 ASK |
| volume | 是 | 数量 |
| stop_price | 是 | 触发价 |
| price | 否 | 触发后的限价,默认等于 stop_price |
示例请求 curl
curl -u "$KEY_ID:$SECRET" -X POST 'https://luno.local/api/1/stoporder' \
-H 'content-type: application/json' \
-d '{"pair":"XBTZAR","type":"ASK","volume":"0.002","stop_price":"1200000","price":"1198000"}'返回示例
{
"order_id": "clx124",
"pair": "XBTZAR",
"type": "STOP_LIMIT",
"side": "SELL",
"state": "PENDING",
"stop_price": "1200000",
"limit_price": "1198000",
"success": true
}GET/api/1/listordersAPI Key订单列表
| 参数 | 必填 | 说明 |
|---|
| state | 否 | PENDING(默认,含 OPEN/PARTIAL)或 COMPLETE |
| pair | 否 | 按交易对过滤 |
| limit | 否 | 默认 100,最大 1000 |
| offset | 否 | 分页偏移 |
示例请求 curl
curl -u "$KEY_ID:$SECRET" 'https://luno.local/api/1/listorders?state=PENDING'
返回示例
{
"orders": [
{
"order_id": "clx123",
"pair": "XBTZAR",
"creation_timestamp": 1735689600000,
"type": "LIMIT",
"side": "BUY",
"state": "PENDING",
"status": "OPEN",
"limit_price": "1265000",
"limit_volume": "0.001",
"filled": "0",
"remaining": "0.001",
"base": "XBT",
"counter": "ZAR"
}
]
}POST/api/1/cancelorderAPI Key撤单
示例请求 curl
curl -u "$KEY_ID:$SECRET" -X POST 'https://luno.local/api/1/cancelorder' \
-H 'content-type: application/json' \
-d '{"order_id":"clx123"}'返回示例
{ "success": true, "order_id": "clx123", "pair": "XBTZAR", "status": "CANCELLED" }- · 权限:WRITE
- · 引擎不可达时在库内撤单并通过账本释放剩余冻结。
GET/api/1/orders/{id}API Key单个订单详情
示例请求 curl
curl -u "$KEY_ID:$SECRET" 'https://luno.local/api/1/orders/clx123'
返回示例
{
"order_id": "clx123",
"pair": "XBTZAR",
"state": "PENDING",
"status": "OPEN",
"limit_price": "1265000",
"limit_volume": "0.001",
"filled": "0",
"remaining": "0.001"
}- · 权限:READ_INFO
- · 仅能查询自己的订单。
GET/api/1/transactionsAPI Key账单流水(账本分录)
| 参数 | 必填 | 说明 |
|---|
| asset | 否 | 按资产过滤 |
| limit | 否 | 默认 100,最大 1000 |
| offset | 否 | 分页偏移,回填为 row_index |
| from | 否 | ISO 时间下界 |
| to | 否 | ISO 时间上界 |
示例请求 curl
curl -u "$KEY_ID:$SECRET" 'https://luno.local/api/1/transactions?limit=20'
返回示例
{
"transactions": [
{
"row_index": 0,
"timestamp": 1735689600000,
"balance": "0.512",
"balance_delta": "-0.001",
"change": "-0.001",
"currency": "XBT",
"description": "TRADE_SETTLEMENT",
"journal_id": "jrn_1"
}
],
"limit": 20,
"offset": 0
}POST/api/1/sendAPI Key站内转账(复式记账,两腿平衡)
| 参数 | 必填 | 说明 |
|---|
| to | 是 | 收款方邮箱 / 手机号 / 用户 ID |
| amount | 是 | 金额,十进制字符串 |
| asset | 是 | 资产代码(也可用 currency) |
| description | 否 | 备注 |
示例请求 curl
curl -u "$KEY_ID:$SECRET" -X POST 'https://luno.local/api/1/send' \
-H 'content-type: application/json' \
-d '{"to":"friend@example.com","amount":"0.001","asset":"XBT","description":"补款"}'返回示例
{
"success": true,
"transfer_id": "b2c3...",
"journal_id": "jrn_2",
"asset": "XBT",
"amount": "0.001",
"recipient": { "id": "usr_2", "email": "friend@example.com", "display_name": "Friend" },
"timestamp": 1735689600000
}- · 权限:WRITE
- · 借贷两腿由 @luno/ledger post 校验 sum=0,余额不足直接 400。
GET/api/1/fee_infoAPI Key费率信息
示例请求 curl
curl -u "$KEY_ID:$SECRET" 'https://luno.local/api/1/fee_info'
返回示例
{
"maker_fee": "0.001",
"taker_fee": "0.002",
"thirty_day_volume": "0",
"pairs": [{ "pair": "XBTZAR", "maker_fee": "0.001", "taker_fee": "0.002", "maker_fee_bps": 10, "taker_fee_bps": 20 }],
"withdrawal_fees": [{ "asset": "XBT", "network": "BTC", "fee": "0.0001", "min_withdraw": "0.0005" }]
}GET/api/1/withdrawalsAPI Key提现记录
| 参数 | 必填 | 说明 |
|---|
| status | 否 | 按状态过滤,例如 REVIEW |
| limit | 否 | 默认 50,最大 500 |
| offset | 否 | 分页偏移 |
示例请求 curl
curl -u "$KEY_ID:$SECRET" 'https://luno.local/api/1/withdrawals?limit=10'
返回示例
{
"withdrawals": [
{ "id": "wd_1", "status": "REVIEW", "asset": "XBT", "amount": "0.01", "fee": "0.0001", "network": "BTC", "address": "bc1q...", "created_at": 1735689600000 }
],
"limit": 10,
"offset": 0
}POST/api/1/withdrawalsAPI Key发起提现(进入待审并冻结)
| 参数 | 必填 | 说明 |
|---|
| asset | 是 | 资产代码 |
| amount | 是 | 提现数量 |
| address | 是 | 收款地址 / 银行账户 |
| network | 否 | 网络,默认该资产首个可用网络 |
| memo | 否 | 备注 / tag |
示例请求 curl
curl -u "$KEY_ID:$SECRET" -X POST 'https://luno.local/api/1/withdrawals' \
-H 'content-type: application/json' \
-d '{"asset":"XBT","amount":"0.01","address":"bc1qexample","network":"BTC"}'返回示例
{
"id": "wd_1",
"status": "REVIEW",
"asset": "XBT",
"amount": "0.01",
"fee": "0.0001",
"network": "BTC",
"frozen": "0.0101",
"note": "Withdrawal created in REVIEW state; the amount plus fee is frozen until approval."
}- · 权限:WRITE
- · 创建 Withdrawal(status=REVIEW) 并将 amount+fee 从 SPOT 冻结到 LOCKED。