跳到主要内容

K-Line API · 接口详情

历史 K 线查询​

本模块用于查询已经采集并落库的 OHLCV 蜡烛图数据,适用于绘制历史 K 线图、补齐客户端断线期间数据,以及在实时订阅前加载初始行情。

查询时需要同时指定链、池地址和 K 线周期。OHLCV 查询按 pool_address 匹配池,忽略 token 参数。接口返回数组结构,未命中数据时通常返回空数组。

查询 OHLCV 数据​

请求

GET /kline/api/v1/kline/ohlcv

请求参数

参数类型必填默认值说明
intervalstring是-K 线周期:1s、1m、15m、1h、4h、1d、1w、1M、1Y
frominteger是-查询起始时间,Unix 秒或毫秒
tointeger是-查询结束时间,Unix 秒或毫秒
limitinteger否1000最大返回条数,范围 1-5000
chain_typestring是-链类型,会自动归一化
chain_idinteger是-链 ID,正整数
pool_addressstring是-池合约地址

curl 示例

curl -H "X-API-Key: $API_KEY" "https://api.gelabs.org/kline/api/v1/kline/ohlcv?interval=1h&from=1776679200&to=1776765600&limit=500&chain_type=evm&chain_id=1&pool_address=0xabc123def456"

成功响应

data 是 OHLCV 数组,不再套 items:

{
"code": 0,
"message": "ok",
"data": [
{
"pool_id": 42,
"interval": "1h",
"open_time": 1776679200,
"open": 3500.12,
"high": 3520,
"low": 3480.5,
"close": 3510.88,
"volume": 1234567.89
}
]
}

响应字段

字段类型必返回说明
pool_idinteger是池的内部 ID
intervalstring是K 线周期
open_timeinteger是蜡烛开始时间,Unix 秒
opennumber / null是开盘价
highnumber / null是最高价
lownumber / null是最低价
closenumber / null是收盘价
volumenumber / null是成交量

缓存说明

历史 K 线查询当前未声明固定 HTTP 缓存头。业务侧可按 interval 自行设置短缓存;实时性要求高的场景建议结合 WebSocket 推送刷新最新一根蜡烛。

常见错误响应

参数缺失或格式不合法时通常返回:

{
"code": 10001,
"message": "Invalid query params",
"error": {
"type": "ValidationError",
"details": {
"fieldErrors": {
"interval": ["Required"],
"pool_address": ["Required"]
}
}
}
}

Market 行情接口​

Market 接口使用 K-Line 服务统一成功响应,data 字段返回对应市场数据。

本模块适用于查询池和代币的市场信息,例如池详情、Top Holders 和合约地址对应的代币元数据。

注意: Market 接口主要用于辅助展示和调试,不等同于 K-Line 服务内部采集状态。

获取池市场详情​

请求

GET /kline/api/v1/market/pools/{network}/{address}
参数位置类型必填说明
networkpathstring是网络标识符,1-100 字符
addresspathstring是池合约地址,1-200 字符
includequerystring否额外包含的字段,逗号分隔
include_volume_breakdownquerystring否"true" 或 "false"
include_compositionquerystring否"true" 或 "false"

curl 示例

curl -H "X-API-Key: $API_KEY" "https://api.gelabs.org/kline/api/v1/market/pools/eth/0xabc123def456?include=base_token,quote_token&include_volume_breakdown=true&include_composition=false"

缓存说明

当前接口未在文档中承诺固定缓存时长。

常见错误响应

请求失败、限流或内部异常时通常返回:

{
"code": 99001,
"message": "Internal server error",
"error": { "type": "InternalServerError" }
}

获取代币 Top Holders​

请求

GET /kline/api/v1/market/tokens/{network}/{address}/top-holders
参数位置类型必填说明
networkpathstring是网络标识符,1-100 字符
addresspathstring是代币合约地址,1-200 字符
holdersquerystring否正整数字符串或 max
include_pnl_detailsquerystring否"true" 或 "false"

curl 示例

curl -H "X-API-Key: $API_KEY" "https://api.gelabs.org/kline/api/v1/market/tokens/eth/0xabc123def456/top-holders?holders=10&include_pnl_details=false"

缓存说明

当前接口未在文档中承诺固定缓存时长;请按业务展示需求控制调用频率。

常见错误响应

{
"code": 99001,
"message": "Internal server error",
"error": { "type": "InternalServerError" }
}

通过合约地址查询代币元数据​

请求

GET /kline/api/v1/market/coins/{network}/{address}
参数位置类型必填说明
networkpathstring是平台标识符,1-100 字符
addresspathstring是代币合约地址,1-200 字符

curl 示例

curl -H "X-API-Key: $API_KEY" "https://api.gelabs.org/kline/api/v1/market/coins/ethereum/0xabc123def456"

缓存说明

当前代理接口未在文档中承诺固定缓存时长。代币元数据变化频率通常较低,客户端可按业务需要自行缓存。

常见错误响应

{
"code": 99001,
"message": "Internal server error",
"error": { "type": "InternalServerError" }
}

K-Line WebSocket​

K-Line 实时推送使用单一 WebSocket 入口,连接建立后通过 JSON 消息动态订阅或退订多个池。

本模块适用于需要低延迟接收 K 线变更的客户端,例如行情页面、告警服务和内部数据同步任务。客户端建立连接后,可通过 subscribe / unsubscribe 动态维护多个池的订阅。

推荐客户端同时保留 HTTP 历史查询能力:首次进入页面或断线重连后先用 HTTP 补齐历史数据,再使用 WebSocket 推送更新最新蜡烛。

连接要求​

连接地址

GET /kline/api/v1/kline/ws

必填请求头

Header必填说明
Upgrade: websocket是标准 WebSocket 升级头
Connection: Upgrade是标准 WebSocket 升级头
X-API-Key是公共 API Key,用于接口鉴权和计费识别

注意: X-API-Key 是对外接入唯一必填业务请求头。

未携带 WebSocket 升级头时返回 HTTP 426:

{
"code": 4000,
"message": "WebSocket upgrade required",
"error": { "type": "BadRequestError" }
}

缺少 X-API-Key 或鉴权失败时通常返回 HTTP 401 或 403,具体以网关配置为准:

{
"code": 20001,
"message": "Unauthorized",
"error": { "type": "UnauthorizedError" }
}

协议常量​

常量字符串值方向说明
WS_TYPE_PINGping客户端 → 服务端应用层心跳
WS_TYPE_PONGpong服务端 → 客户端心跳响应
WS_TYPE_SUBSCRIBEsubscribe客户端 → 服务端订阅池
WS_TYPE_UNSUBSCRIBEunsubscribe客户端 → 服务端退订池
WS_TYPE_SUBSCRIBEDsubscribed服务端 → 客户端订阅成功确认
WS_TYPE_UNSUBSCRIBEDunsubscribed服务端 → 客户端退订成功确认
WS_TYPE_OHLCVohlcv服务端 → 客户端实时或快照 K 线推送
WebSocket code说明
0成功
4001无效消息,例如 JSON 解析失败、缺少 id/type、订阅字段缺失
4002未知命令
4500内部错误,当前预留

客户端消息结构​

客户端消息必须是 JSON 文本帧:

{
"id": "req-001",
"type": "subscribe",
"data": {}
}
字段类型必填说明
idstring是请求关联 ID,服务端响应会原样带回
typestring是ping、subscribe、unsubscribe
dataobject视命令而定命令负载

subscribe.data

字段类型必填说明
chain_typestring是链类型,会自动归一化
chain_idnumber是链 ID
pool_addressstring是池合约地址,内部池键会转小写
tokenstring否已兼容保留;服务端会根据当前启用的唯一池配置自动确定 base 或 quote,客户端无需传入
intervalsstring[]否合法 K 线周期数组;省略或空数组表示接收所有周期。非法值会被静默忽略

注意: intervals 应使用 JSON 数组,不要发送逗号分隔字符串。

unsubscribe.data

字段类型必填说明
chain_typestring是链类型,会自动归一化
chain_idnumber是链 ID
pool_addressstring是池合约地址
tokenstring否已兼容保留;退订会移除当前连接上该池已有订阅,不依赖客户端传入 token

服务端消息结构​

服务端下行消息统一为:

{
"id": "req-001",
"time": 1776682800000,
"type": "subscribed",
"code": 0,
"data": {},
"msg": "ok"
}
字段类型必返回说明
idstring是请求响应会回传请求 ID;主动推送为 ""
timenumber是服务端 Unix 毫秒时间戳
typestring是pong、subscribed、unsubscribed、ohlcv、error
codenumber是WebSocket 业务码
dataobject / null是业务负载
msgstring是可读说明;实时推送为 ok,快照为 snapshot

订阅与退订示例​

心跳

{ "id": "hb-001", "type": "ping", "data": {} }

响应:

{
"id": "hb-001",
"time": 1776682800000,
"type": "pong",
"code": 0,
"data": {},
"msg": "ok"
}

订阅

{
"id": "sub-001",
"type": "subscribe",
"data": {
"chain_type": "evm",
"chain_id": 1,
"pool_address": "0xabc123def456",
"intervals": ["1m", "1h", "4h"]
}
}

订阅成功响应:

{
"id": "sub-001",
"time": 1776682800000,
"type": "subscribed",
"code": 0,
"data": {
"key": "evm:1:0xabc123def456:base",
"token": "base",
"intervals": ["1m", "1h", "4h"]
},
"msg": "ok"
}

若服务端缓存中已有该池最新 tick,订阅成功后会额外推送一条 ohlcv,msg 为 snapshot。

退订

{
"id": "unsub-001",
"type": "unsubscribe",
"data": {
"chain_type": "evm",
"chain_id": 1,
"pool_address": "0xabc123def456"
}
}

响应:

{
"id": "unsub-001",
"time": 1776682800000,
"type": "unsubscribed",
"code": 0,
"data": {
"key": "evm:1:0xabc123def456:",
"removed_keys": ["evm:1:0xabc123def456:base"]
},
"msg": "ok"
}

推送数据字段​

实时与快照推送都使用 type: "ohlcv":

{
"id": "",
"time": 1776682800000,
"type": "ohlcv",
"code": 0,
"data": {
"chain_type": "evm",
"chain_id": 1,
"pool_address": "0xabc123def456",
"token": "base",
"interval": "1h",
"open_time": 1776679200,
"open": 3500.12,
"high": 3520,
"low": 3480.5,
"close": 3510.88,
"volume": 1234567.89
},
"msg": "ok"
}
字段类型必返回说明
chain_typestring / null是链类型
chain_idnumber / null是链 ID
pool_addressstring是池地址
tokenstring是代币方向
intervalstring是K 线周期
open_timenumber是蜡烛开始时间,Unix 秒
opennumber / null是开盘价
highnumber / null是最高价
lownumber / null是最低价
closenumber / null是收盘价
volumenumber / null是成交量

KlineHub 对二进制帧会静默忽略,不返回错误消息。未订阅任何池时不会收到 ohlcv 推送。对同一池重复 subscribe 会覆盖该池的 intervals 设置。订阅成功时,服务端会使用当前启用的唯一池配置生成订阅 key;如果池不存在、未启用或配置不唯一,会返回 error,不会写入订阅状态。


WebSocket 错误消息​

{
"id": "sub-001",
"time": 1776682800000,
"type": "error",
"code": 4001,
"data": null,
"msg": "subscribe: missing required fields"
}
场景codemsg 示例
JSON 解析失败4001Invalid JSON
缺少 id 或 type4001Missing id or type
subscribe 缺少必填字段4001subscribe: missing required fields
subscribe 未找到启用池4001subscribe: active pool not found
subscribe 命中多个启用池配置4500subscribe: ambiguous active pool
unsubscribe 缺少必填字段4001unsubscribe: missing required fields
未知命令4002Unknown command: xxx

通用 WebSocket​

通用 WebSocket 路径为:

GET /kline/api/v1/ws/{topic}

topic 会作为 Durable Object 实例名称。当前公开能力仅支持应用层 ping/pong。

客户端消息

{ "id": "req-001", "type": "ping", "data": {} }

服务端响应

{
"id": "req-001",
"time": 1704070800000,
"type": "pong",
"code": 0,
"data": {},
"msg": "ok"
}

普通 HTTP 请求访问该路径会返回 HTTP 426 纯文本:

Expected WebSocket upgrade

与 KlineHub 不同,通用 WsServer 收到二进制帧会返回 error 消息,code 为 4001,msg 为 Binary messages are not supported。

注意: 通用 WebSocket 当前仅适合作为连通性或基础消息通道验证;K 线实时行情请使用 /kline/api/v1/kline/ws。


错误处理与最佳实践​

常见 HTTP 错误​

HTTP常见业务码说明
40010001 / 10002 / 10005请求参数缺失、格式不合法,或 WebSocket 预检请求错误
40410003 / 60001路由、池或资源不存在
40910004重复创建同一池等资源冲突
50099001 / 99002 / 99003服务内部异常、数据库异常或缓存异常

调用方应同时关注 HTTP 状态码和响应体 code。业务成功以 code: 0 为准。

WebSocket 接入建议​

项目建议
心跳客户端定期发送 { "id": "hb-001", "type": "ping", "data": {} } JSON 消息,并检查服务端 pong
重连连接断开后使用指数退避重连,重连成功后重新发送订阅
补数据重连后先通过 GET /kline/api/v1/kline/ohlcv 查询断线期间历史数据,再继续消费实时推送
幂等对同一池、同一 interval、同一 open_time 的 K 线更新做覆盖写入
订阅管理对同一池重复 subscribe 会覆盖该池的 intervals 设置,客户端应维护本地订阅状态

时间戳处理​

  • HTTP 查询参数 from、to 支持 Unix 秒或毫秒;服务端会将大于 10000000000 的值按毫秒处理。
  • OHLCV 字段 open_time 使用 Unix 秒,WebSocket 信封字段 time 使用 Unix 毫秒。
  • 客户端展示跨时区行情时,建议统一以 UTC 存储,再在展示层转换时区。

价格与成交量精度​

  • open、high、low、close、volume 可能为 null,客户端展示和计算时需要显式处理。
  • 对价格、成交量和市值等数值字段,建议使用高精度 decimal 类型或字符串化存储,避免 JavaScript number 精度问题。
  • Market 行情接口返回的字段类型可能与 K-Line 自身 OHLCV 字段不完全一致。

文档版本:v1.0.0 | 最后更新:2026-04-28