采集是异步的:提交 run → 轮询 → 取数。端到端示例见 快速开始,本页是信封/状态/计费/错误的完整参考。
认证方式
所有调用在请求头携带 API Key:
Authorization: Bearer YOUR_API_KEY
获取 API Key
- 登录 AntsData 控制台
- 进入 API Keys 页面 → Create New Key
- 复制生成的 Key(格式
ants_xxxxxxxxxxxx,只显示一次,请妥善保存)
安全建议
-
不要把 API Key 硬编码或提交到 Git;用环境变量存储;定期轮换。
export ANTSDATA_API_KEY="ants_xxxxxxxxxxxx" # Linux / macOS $env:ANTSDATA_API_KEY="ants_xxxxxxxxxxxx" # Windows PowerShell
import os, requests API_KEY = os.getenv("ANTSDATA_API_KEY") H = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
统一响应信封
所有响应共用信封,code === 0 即成功:
{ "code": 0, "message": "ok", "data": <object> }
code == 0是唯一成功判据(无success布尔)。- 出错时返回对应 HTTP 状态码 +
{ "code": <int>, "message": <人类可读> }。 - 计费不在信封顶层,而在 run 对象上(
chargedCredits/recordCount)。
Run 生命周期
POST /v1/scraper/{平台}/{资源} → 201 { id, status:"queued" } 创建 run(async,冻结积分)
→ 200 { status:"succeeded"|"failed" } sync 阻塞内到终态
→ 202 { id, status:"queued"|"running"} sync 超时 fallback(转轮询)
GET /v1/scraper/runs/{id} → { status, targetsOk, tasks[], ... } 轮询至终态
GET /v1/scraper/runs/{id}/records?page=&pageSize= → 分页记录 succeeded 后取数
GET /v1/scraper/runs/{id}/download?format=json|csv|excel → 附件下载
提交返回码取决于
deliveryMode:async恒201;sync到终态200、超时 fallback202(详见 quick-start「同步模式」)。
状态机
queued ──▶ running ──▶ succeeded (终态)
└──▶ failed (终态)
- 仅 4 态:
queued/running/succeeded/failed(无 pending/completed/cancelled)。 - 终态为
succeeded|failed;轮询到终态即停。 - 无 progress 百分比:用
targetCount/targetsOk/targetsFailed计数看进度。
Run 对象字段参考
POST 创建与 GET /runs/{id} 返回同一 Run 对象(data):
| 字段 | 类型 | 说明 |
|---|---|---|
id |
int64 | run 号(任务 id,后续查询都用它) |
actorName / endpointName |
string | 平台名 / 接口名 |
status |
string | queued/running/succeeded/failed |
deliveryMode |
string | sync / async |
recordLimit |
int | 每个目标的记录上限 |
targetCount |
int | 目标总数 |
targetsOk / targetsFailed |
int | 成功 / 失败目标数 |
recordCount |
int | 产出总记录数 |
maxCost |
string | 提交时冻结的积分上界 |
chargedCredits |
string | 实扣积分(succeeded 前为 "0") |
createdAt |
string | ISO 8601 |
tasks[] |
array | 逐目标结果(见下) |
deliveries[] |
array | 逐交付渠道状态(配了 deliveries 时) |
逐目标结果 tasks[]
一个 run 的 N 个 targets 内部展开成 N 个 task,单目标成败在这里(不在结果记录里):
| 字段 | 说明 |
|---|---|
targetIndex |
对齐请求里 targets[] 的序号 |
taskId |
平台侧 task id(字符串) |
submitState |
pending / submitted / submit_failed(投递态) |
status |
queued / running / succeeded / failed(执行态) |
recordCount |
该目标产出条数 |
errorMessage |
失败原因(失败时) |
部分成功:只要有 ≥1 目标成功,run 即
succeeded并按成功条数出数计费;失败目标在tasks[]里各自带errorMessage。
取数与下载
- 分页记录:
GET /v1/scraper/runs/{id}/records?page=1&pageSize=20→data = { total, page, pageSize, items:[...] };pageSize默认 20、上限 100;run 未成功时返回空集。 - 下载:
GET /v1/scraper/runs/{id}/download?format=json|csv|excel(默认 json)→ 附件流。 - 结果留存约 90 天,请及时取用。
计费:冻结 → 结算 / 释放
按成功产出的数据条数计费(每 1000 条记录一个单价):
| 时点 | 动作 | 字段 |
|---|---|---|
| 提交 | 冻结 maxCost = 目标数 × ⌈recordLimit/1000⌉ × 单价;余额不足则提交被拒(402) |
maxCost |
| 成功 | 结算 chargedCredits = ⌈成功记录数/1000 × 单价⌉(≤ maxCost) |
chargedCredits / recordCount |
| 全失败 | 释放冻结,不计费 | — |
各端点单价与套餐见定价页面。
错误码
统一信封错误:真实 HTTP 状态码 + {code, message}。
| 状态码 | 含义 | 处理方式 |
|---|---|---|
400 |
参数 / targets 不符要求 |
检查请求体与目标字段 |
401 |
未认证 / API Key 无效 | 检查 Key |
402 |
积分不足(提交被拒) | 充值 |
404 |
run 不存在 / 越权 | 检查 run id |
429 |
请求频率超限 | 降频,见 Retry-After |
500 |
服务端错误 | 稍后重试 |
503 |
服务不可用 | 稍后重试 |
具体业务
code值沿用平台 errcode(run 域 4000+、积分不足等),最终值以服务端为准。单目标失败不产生顶层错误:run 仍可succeeded(部分成功),失败细节看tasks[].errorMessage。
重试策略
import time
def poll_run(base, headers, run_id, max_wait=300):
waited = 0
for delay in [1, 2, 5, 5, 5, 5, 5, 5, 5, 5]:
r = requests.get(f"{base}/scraper/runs/{run_id}", headers=headers)
if r.status_code >= 500: # 服务端错误:退避重试
time.sleep(delay); waited += delay; continue
run = r.json()["data"]
if run["status"] in ("succeeded", "failed"):
return run
time.sleep(delay); waited += delay
if waited >= max_wait:
raise TimeoutError(f"run {run_id} 未在 {max_wait}s 内完成")
return run
| 情况 | 是否重试 |
|---|---|
轮询中 running |
✅ 退避轮询(1s→5s) |
429 / 5xx |
✅ 退避重试(配 Retry-After) |
401 / 400 / 402 |
❌ 修正后再试 |
run failed |
❌ 看 tasks[].errorMessage;必要时重新提交失败目标 |
最佳实践
- 用环境变量存 API Key,不要硬编码。
- 轮询用指数退避(1s→2s→5s 封顶),别高频空转;设总超时。
- 一个 run 多目标:
targets批量提交比逐个提交高效,逐目标状态看tasks[]。 - 合理设
recordLimit控制单次成本;0=不限会按可用积分反算冻结。 - 大结果用
/download,逐页浏览用/records。
计费与价格
按成功返回的数据条数计费:每返回一条数据按该端点单价扣减,失败记录不计费;实扣体现在 run 的 chargedCredits。各端点单价与套餐详见定价页面。
下一步
- 快速开始 — 端到端提交/轮询/取数示例
- Scraper 平台指南:TikTok · X · Instagram · Facebook · LinkedIn · Google · YouTube · Amazon
- 同步搜索:Google SERP — 一次调用直接返回搜索结果
FAQ
Q: API Key 有有效期吗?
无固定有效期,可随时在控制台撤销与重新生成;建议为不同应用/环境用不同 Key。
Q: 轮询频率有建议吗?
指数退避(1s→2s→5s 封顶),到 succeeded/failed 即停;避免高频空转触发限流。
Q: 采集失败会扣费吗?
不会。全失败释放冻结、不计费;部分成功只按成功产出的条数结算。
Q: 如何查看用量与账单?
登录控制台 Billing 页查看积分消耗与账单明细。
Q: 遇到技术问题怎么联系支持?
控制台提交工单、邮件 [email protected]、或加入 Discord 社区。
