// 文档
提交 URL
提交一批 URL 进行处理。需要 urls:write 权限和幂等键。
POST /api/v1/urls 接收一批 URL,做校验后为每条被接收的 URL 创建一个任务。接口是幂等的:为每次逻辑请求发送唯一的 Idempotency-Key,重试时平台会回放已存响应。
请求
| 字段 | 值 |
|---|---|
| 方法 | POST |
| 路径 | /api/v1/urls |
| 认证 | Authorization: Bearer shl_live_<key>,需 urls:write scope |
| 必需请求头 | Idempotency-Key: <唯一字符串,最长 255 字符> |
| 请求体 | 含 urls 数组的 JSON 对象 |
{
"urls": [
"https://example.com/page-a",
"https://example.com/page-b"
]
}限制:单次请求最多 100 条 URL,请求体约不超过 900 KB。
curl -X POST https://shoulu.co/api/v1/urls \
-H "Authorization: Bearer shl_live_<key>" \
-H "Idempotency-Key: batch-2026-10-25-001" \
-H "Content-Type: application/json" \
-d '{"urls":["https://example.com/page-a"]}'响应
部分或全部 URL 被接收时返回 202;整批因账单或账号限制失败时返回 429。
{
"accepted": 1,
"acceptedTasks": [
{
"id": "9b1d…",
"url": "https://example.com/page-a",
"status": "pending"
}
],
"rejectedUpfront": [
{
"url": "ftp://bad.example",
"reason": "unsupported_protocol"
}
],
"batchError": null
}accepted表示平台创建的任务数,不表示上游已受理,也不表示搜索引擎已收录。acceptedTasks[].id是任务 ID,用GET /api/v1/tasks/{id}轮询状态。rejectedUpfront列出入校时失败的 URL,每条附一个原因。batchError在整批无法创建任务时给出,取值见 错误与限制。
拒绝原因
reason | 原因 |
|---|---|
invalid_url | 字符串无法解析为 URL |
unsupported_protocol | 仅接受 http: 和 https: |
invalid_domain | 域名未通过校验 |
blacklisted_domain | 域名在平台黑名单中 |
duplicate | 该账号下相同 URL 已有待处理任务 |
over_limit | 校验后批量超出账号上限 |
幂等
Idempotency-Key 请求头为必填。幂等键按 API 密钥隔离,保留 24 小时。
- 相同键 + 相同请求体重试:返回已存响应。
- 相同键 + 不同请求体重试:返回
409 idempotency conflict。 - 首个请求仍在处理时重试:返回
425,并带Retry-After: 30。
每批提交使用新键。误用旧键会回放旧响应,而不会创建新任务。