静态住宅 API:报价、购买与任务状态
通过报价和幂等键购买静态住宅代理,正确处理异步任务、失败退款、超时与结果核验。
静态住宅购买分为报价、提交任务和查询结果。报价不会直接购买;提交订单会创建真实购买任务并可能扣款。请先确认购买地区、数量、业务名称和总金额。
1. 接口与权限
所有请求使用业务 API 域名和 Api-Token: YOUR_API_KEY。
| 方法与路径 | Scope | 用途 |
|---|---|---|
POST /api/user/v1/static-residential/quotes | static:inventory:read | 生成报价 |
POST /api/user/v1/static-residential/orders | static:purchase | 提交购买任务 |
GET /api/user/v1/static-residential/operations/{operation_no} | static:purchase | 查询任务状态 |
POST 请求使用 Content-Type: application/json。查询已交付 IP 还需要 static:ip:read。使用旧 Key 能查询库存,不代表已经获得购买权限。
2. 获取报价
先从国家、城市/库存和业务名称接口选择真实可用值,再提交:
| JSON 字段 | 必填 | 说明 |
|---|---|---|
country_code | 是 | 两位国家代码 |
city_name | 是 | 库存返回的原始城市名,不能自行翻译或纠正拼写 |
quantity | 是 | 正整数;默认服务上限为 20,实际以服务端限制为准 |
duration_days | 否 | 默认 30,当前仅支持 30 天 |
business_name | 否 | 默认 other,但仍须属于当前业务名称列表 |
protocol | 否 | http、socks5、both;默认 both |
以下 COUNTRY_CODE、CITY_NAME、BUSINESS_NAME 都必须替换为查询返回值。代码中的购买金额不由客户端指定。
curl --silent --show-error --max-time 30 \
"$DFIP_API_BASE/api/user/v1/static-residential/quotes" \
-H "Api-Token: $DFIP_API_KEY" \
-H 'Content-Type: application/json' \
--data '{"country_code":"COUNTRY_CODE","city_name":"CITY_NAME","quantity":1,"duration_days":30,"business_name":"BUSINESS_NAME","protocol":"both"}'
成功 data 包含 quote_id、country_code、city_name、quantity、duration_days、business_name、protocol、unit_price、total_amount、currency 和 expires_in。
报价有效期为 300 秒,属于当前调用账号。币种为 USD。提交前展示并核对 total_amount;报价校验当前库存与价格,但不锁定库存或预留账户余额。过期后需要重新报价并重新核对金额。
3. 使用幂等键提交购买
请求头 Idempotency-Key 必填:8–64 个字符,仅可使用字母、数字、点、下划线、冒号和连字符。
在发请求之前保存幂等键、购买意图和 quote_id。 每一笔有意发起的新购买使用一个新键;同一笔购买的网络重试复用原键,不要每次请求都随机生成新键。
# Use a unique key for a new purchase and retain it for retries.
export DFIP_PURCHASE_KEY='YOUR_UNIQUE_PURCHASE_KEY'
curl --silent --show-error --max-time 30 \
"$DFIP_API_BASE/api/user/v1/static-residential/orders" \
-H "Api-Token: $DFIP_API_KEY" \
-H "Idempotency-Key: $DFIP_PURCHASE_KEY" \
-H 'Content-Type: application/json' \
--data '{"quote_id":"YOUR_QUOTE_ID"}'
成功返回 HTTP 202、code: 0,以及任务 operation_no、status 等字段。此时不能把它显示为“购买成功”。
当前账号相同幂等键已有任务时,接口会返回原任务,即使旧报价已过期。不要把一个旧键用于另一笔购买,也不要依赖服务端一定会为新的参数返回冲突;调用端必须自己保存并核对键与购买意图的绑定关系。
4. 查询任务与确认交付
curl --silent --show-error --max-time 30 \
"$DFIP_API_BASE/api/user/v1/static-residential/operations/YOUR_OPERATION_NO" \
-H "Api-Token: $DFIP_API_KEY"
建议从每 2–5 秒查询一次开始,等待时间变长时逐步退避。这是调用建议,不是固定服务配额。每次请求使用原 operation_no。
| status | 含义与处理 |
|---|---|
pending | 已受理,等待处理;继续查询 |
processing | 处理中,可能已预扣余额;不要重复购买 |
finalizing | 上游已成功,正在完成本地交付记录;继续查询 |
completed | 购买任务已完成;用 local_order_id 对照订单,再查询已购 IP |
failed_refunded | 购买失败,预扣金额已退回余额;核对余额后再决定是否重新购买 |
failed | 未扣款失败;读取 message 并处理原因 |
reconcile_required | 结果待核验;保存任务号并联系客服,勿重复提交新购买 |
unknown | 未识别状态;保留任务号并联系支持,不应当作成功 |
任务 data 包含:operation_no、status、message、country_code、city_name、quantity、duration_days、business_name、amount、local_order_id、created_at、completed_at。订单号和完成时间在尚未生成时可为 null。
amount 表示报价金额,不是“已经扣款”的证明;结合状态及账户记录核对。completed 后到 已购 IP 查询 获取代理账号、密码和端口。轮询等待超时也不代表任务失败,应保留原任务继续跟踪。
5. 错误处理
| HTTP / code | 说明与处理 |
|---|---|
400 / 40002 | 地区、数量、期限、业务名称或协议无效 |
400 / 40004 | 幂等键缺失或格式错误 |
400 / 40005 | 报价不存在、过期或不属于当前账号;若已有购买任务先跟踪原任务 |
402 / 40201 | 余额不足;data 提供 available_balance、required_amount、currency |
403 / 40301 | 缺少所需 Scope |
403 / 40302 | 请求出口不在 Key 白名单 |
403 / 40303、40304、40305 | 当前账号、子账号静态权限或共享主账号不可用 |
404 / 40401 | 当前账号下找不到该任务 |
409 / 40901 | 库存不足;检查 available_stock 并重新选择 |
409 / 40902 | 幂等参数冲突;核对本地记录,不能直接换键盲目重试 |
503 / 50303 | 购买任务入队失败;保留原键,核对原任务后处理 |
503 / 50304 | 地区价格不可用,联系客服 |
503 / 50305 | 报价服务暂不可用 |
500 / 50001 | 购买提交异常;先复用原键核对原任务,避免重复购买 |
鉴权服务暂不可用可能返回 503 / 50300;缺失或失效 Key 返回 401 / 40101、40102。出现网络超时、响应丢失或服务异常时,不应自动换新幂等键重新买。
接入检查清单
- 金额和地区经确认后才提交购买。
- 本地持久保存幂等键与购买参数,获得响应后保存 operation_no。
- HTTP 202 进入处理中;只有 completed 进入已完成。
- 对 reconcile_required 停止自动重买,转人工核验。
- 不把代理密码、API Key 或完整响应写到公开日志。
当前这组开放 API 提供购买与查询,不提供续费、自动续费开关、删除或换 IP 接口;这些操作请使用控制台已有功能。