产品
产品以数字 ID 标识。本接口与网页控制台同源(同一个后端 service),返回的价格与限制即控制台所用。下表实时拉取,请以接口为准,不要硬编码本页快照。
GET
/api/open/v1/products可用产品、单价、数量范围与国家要求响应与网页控制台的产品配置接口同源(同一个后端 service),故这里看到的 ID、价格、数量范围、国家要求,与你在控制台下单时看到的完全一致。
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| id | integer | 对外产品 ID,创建任务时作为 type 传入。一经发布永不复用、永不改指向 |
| unit_price | number | USD / 每一条(不是每千条)。计费 = 有效条数 × 本值 |
| min_numbers | integer | 单个任务的最小条数,按归一去重、国家过滤后的有效条数判定,不足即拒绝 |
| max_numbers | integer | 单个任务的最大条数。超出请自行拆分为多个任务 |
| visible | boolean | false = 未对你的账号开放,传入会被拒。请按本字段过滤,不要硬编码可用 ID 列表 |
| country_required | boolean | true = 创建任务必须传 country;false(邮箱 / 用户名类)传了会被忽略 |
| allowed_countries | string[] | 国家白名单(ISO-2 大写)。非空 = 只接受名单内的国家;空数组 = 不限(转而看 blocked_countries) |
| blocked_countries | string[] | 国家黑名单(ISO-2 大写)。非空 = 除名单内之外都接受;空数组 = 不限。与 allowed_countries 互斥,两者不会同时非空 |
| result_columns | object[] | 该产品结果文件的列,顺序即 CSV 列序;每项为 { name, facet } |
| result_columns[].name | string | 列名,即结果 CSV 的表头(phone、activated、gender…) |
| result_columns[].facet | boolean | 该列是否可用作结果下载的筛选条件(对应 active_day / sex 等参数) |
| price_display_unit | integer | 控制台按「每 N 条」展示报价所用的 N,纯展示口径,不参与任何计算(顶层字段,不在 products 内) |
国家限制怎么读
两个名单互斥,永远不会同时非空——后端在服务启动时就会拒绝这种配置。所以判断逻辑很简单:
allowed_countries 非空只接受名单内的国家,其余一律拒绝blocked_countries 非空除名单内的国家外都接受两个都是空数组不限国家名单内容来自该产品当前所用上游通道的技术能力,换供应商就会变,请每次读接口,不要缓存或硬编码。country_required 为 false 的产品(邮箱 / 用户名类)不看这两个字段。
响应结构
{
"products": [
{
"id": 19,
"unit_price": 0.0025, // USD/条(注意:每一条的单价,不是每千条)
"min_numbers": 1000,
"max_numbers": 10000000,
"visible": true,
"country_required": true,
"allowed_countries": ["US", "CA"], // 空数组 = 不限
"blocked_countries": [],
"result_columns": [ { "name": "phone", "facet": false } ]
}
],
"price_display_unit": 1000 // 控制台按"每 N 条"展示价格,仅影响展示
}计费始终是「有效条数 × unit_price」。price_display_unit 只是控制台的展示口径(每千条报价),不参与任何计算。
关于产品名称
接口只返回产品 ID,不返回名称——名称是各语言的展示文案,随界面语言变化,不属于接口契约。请以 ID 作为程序中的唯一标识;需要人读的名称时,在你自己的系统里维护一份 ID → 名称的映射。
查看你账号的产品
仅保存在你的浏览器本地,不会上传到任何服务器。
填入 API Key 后即可加载你账号可用的产品与价格。