API 文档
用 HTTP 接口上传号码、报价、下单和下载结果,适合需要批量、自动处理的客户。规则和网页下单一致,价格按你的账号计算。
开通 API
- 先联系客服开户。
- 把需要的服务、账号和服务器出口 IP 发给客服。
- 运营开通后发放 API 密钥和完整接入文档。密钥有效期 1–730 天,每个密钥最多绑定 32 个出口 IP。
基本约定
基础地址
https://api.checkim.ai/openapi/v1- 认证
- 每个请求带 Authorization: Bearer <API 密钥>
- User-Agent
- 必须带,缺少时会被 Cloudflare 拦截(error 1010)
- 格式
- 请求和响应都是 JSON(上传文件除外),编码 UTF-8
- 时间
- UTC Unix 毫秒时间戳
- 金额
- 最多八位小数,请用十进制定点类型处理,不要四舍五入成两位
接入流程
- 查询服务列表和余额,保存要用的 productId。
- 查询数据使用声明;未确认时由你阅读后确认。
- 上传号码文件,保存返回的 fileId。
- 用 productId 和 fileId 报价,核对条数、单价和总价。
- 生成并保存幂等键,再按报价下单。下单会真实扣费。
- 设置 Webhook 接收订单状态推送;同时每 5–10 分钟用 updatedSince 对账一次,防止漏收。
- 订单完成后列出结果文件,逐个下载并用 sha256 校验。成功和未成功的文件都要下载。
curl 示例
把占位符换成真实值。报价和下单的完整参数见开通时提供的接入文档。
设置密钥,查询服务
export CHECKIM_TOKEN='替换为运营提供的 API 密钥' export CHECKIM_BASE='https://api.checkim.ai/openapi/v1' curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/products"上传号码文件
curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -F 'file=@./numbers.csv;type=text/csv' \ "$CHECKIM_BASE/files"报价
curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"productId":"<productId>","name":"batch-001","fileId":"<fileId>"}' \ "$CHECKIM_BASE/orders/check"下单
# 真实扣费。重试时保持幂等键和请求体完全不变。 curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: partner-request-001' \ -d '{"quoteId":"<quoteId>","clientOrderId":"partner-batch-001"}' \ "$CHECKIM_BASE/orders"查询订单,或按变化时间对账
curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>" curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ "$CHECKIM_BASE/orders?updatedSince=<UTC ms>&size=100"列出并下载结果,校验 sha256
curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>/results" curl -H "Authorization: Bearer $CHECKIM_TOKEN" -o result.csv \ "$CHECKIM_BASE/orders/<orderId>/results/<fileId>/download" shasum -a 256 result.csv
接口清单
账户与声明
| 接口 | 用途 |
|---|---|
GET/compliance | 查询数据使用声明和本人确认状态 |
POST/compliance | 确认当前版本的声明 |
GET/balance | 查询账户余额 |
GET/products | 查询可下单的服务和你的单价 |
文件与报价
| 接口 | 用途 |
|---|---|
POST/files | 上传号码文件(multipart,字段 file) |
POST/orders | 校验号码并报价,报价 180 秒有效 |
订单
| 接口 | 用途 |
|---|---|
POST/orders | 按报价下单,需带 Idempotency-Key 请求头 |
GET/orders | 查询订单:游标翻页、按状态和创建时间筛选、按 updatedSince 对账 |
GET/orders | 查询订单状态和数量 |
POST/orders | 取消订单:排队中和未派发的立即全额退款,已派发的进入取消中,执行中的不能取消 |
结果文件
| 接口 | 用途 |
|---|---|
GET/orders | 列出结果文件,每个文件带 sha256 |
GET/orders | 下载一个结果文件,支持 Range 续传和 If-None-Match |
Webhook
| 接口 | 用途 |
|---|---|
GET/webhook | 查看 Webhook 配置和投递健康 |
PUT/webhook | 设置接收地址和订阅的事件 |
DELETE/webhook | 关闭 Webhook |
GET/webhook | 查看签名密钥 |
POST/webhook | 轮换签名密钥,新旧密钥并行签名 24 小时 |
POST/webhook | 发送一条测试事件 |
GET/webhook | 查看最近的投递记录 |
查询订单与对账
- 订单列表默认按创建时间倒序。每页带 nextCursor 时,把它作为下一次的 cursor 继续取;游标翻页在持续新增订单时不会漏、不会重。
- 可按 status 和创建时间(createdFrom、createdTo,UTC 毫秒)筛选,也可以用 clientOrderId 查回某一笔订单。
- updatedSince 只返回该时间之后状态变化过的订单,按变化时间升序。定期用它补拉,Webhook 漏收也不会丢状态。
下载结果
- 结果列表里每个文件都有 sha256。下载响应的 ETag 是同一个值,下载完请比对。
- 支持 Range 断点续传。续传前先确认 sha256 没变;变了说明文件重新生成过,需要整份重下。
- 已有完整文件时,带 If-None-Match 请求,内容没变会返回 304,不再传输。
- 开启分批交付的大订单,执行中会先列出已完成批次的文件;订单完成后的最终文件是权威版本。
- 含头像的服务(TG/WS 高级检查、性别年龄检查)在结果 CSV 的 avatar 列给出带签名的图片链接,在结果保存期内可直接 GET 访问图片(无需带 Authorization 头,支持 If-None-Match)。
Webhook 推送
- 通过 API 下的订单状态变化时,平台向你的 HTTPS 地址 POST 一条事件。需要 webhook:manage 权限。
- 每条事件带 CheckIM-Signature 签名头(t=时间戳,v1=签名)。用签名密钥对“t.原始请求体”做 HMAC-SHA256 校验。
- 2xx 视为送达;失败会在约 2 天内重试 9 次。同一事件可能收到多次,请按事件 id 去重。
- 请求来自固定出口 IP 34.21.195.36,可以只放行这个地址。
| 事件 | 触发时机 |
|---|---|
order.completed | 订单结算完成,可以下载结果 |
order.cancelled | 订单已取消并全额退款 |
order.cancel_pending | 订单进入取消中,等执行端停止后结算 |
order.needs_attention | 订单进入售后或需要人工处理 |
order.partial_results | 分批交付有新的一批结果可下载 |
订单状态
| 状态 | 含义 |
|---|---|
inQueue | 排队中,继续查询 |
orderTaken | 已接单,继续查询 |
executing | 执行中。开启分批交付的大订单此时已能下载已完成批次的结果 |
completed | 已完成,下载结果并核对数量 |
waitAfterSale | 售后处理中 |
pendingCancel | 取消处理中,继续查询最终状态 |
cancelled | 已取消。排队中取消全额退款,执行中取消按实际执行量结算 |
限流与注意事项
- 默认每分钟最多:同一出口 IP 1,200 次,同一账号 240 次,同一密钥 120 次。响应头 RateLimit-Limit、RateLimit-Remaining、RateLimit-Reset 告诉你本分钟还剩多少次。
- 报价和上传较慢,同一账号同时进行中的最多 3 个,超出返回 429 TOO_MANY_CONCURRENT_REQUESTS。
- 收到 429 或 503 时,按 Retry-After 给出的秒数等待后用原请求重试。
- 没有测试环境,下单即真实扣费。
- 查询等待超时不代表下单失败。请先用 orderId 或 clientOrderId 查回订单,不要重新下单。
常见错误
错误响应带 code、requestId、message 和可选的 detail.field。程序按 code 处理;message 按 Accept-Language 返回 9 种语言之一,只用于展示。
| 错误码 | HTTP | 处理 |
|---|---|---|
INVALID_REQUEST | 400 | 按 detail.field 修正参数类型或必填项 |
INVALID_CURSOR | 400 | 游标无效,从第一页重新开始 |
INVALID_API_TOKEN | 401 | 检查密钥是否完整、是否过期或已撤销 |
PERMISSION_DENIED | 403 | 联系客服核对已开通的服务和出口 IP |
QUOTE_EXPIRED | 409 | 先确认没有下单成功,再重新报价 |
INSUFFICIENT_BALANCE | 409 | 充值后重新报价下单 |
ORDER_NOT_CANCELLABLE | 409 | 订单已开始执行或已结束,不能取消 |
RETRY_SAME_REQUEST | 409 | 与其他操作冲突,用原请求退避重试 |
COMPLIANCE_ACCEPTANCE_REQUIRED | 422 | 先查询并确认数据使用声明 |
RATE_LIMITED | 429 | 按 Retry-After 等待,降低请求频率 |
TOO_MANY_CONCURRENT_REQUESTS | 429 | 等前面的报价或上传完成,再发起新的 |
DATABASE_UNAVAILABLE | 503 | 服务暂时不可用,按 Retry-After 重试 |
需要开通 API?
把需要的服务和出口 IP 发给客服,我们会发放密钥和完整接入文档,并附带 Python 示例客户端。