API 对接,
省心省力
媒介方与累计充值满 500 元的会员申请 API Token 后,即可程序化对接 媒体资源、发布订单 与 AI 报告——自动查询刊例、批量下单、实时追踪发布回链,还能直接提交 SEO / 外贸 / GEO 等报告需求并取回结果。
$ curl -H "Authorization: Bearer pr1_xxx" \
http://pr1.cn/openapi/v1/media?type=media
{ "code":0, "data":{ "list":[ … ], "total":128 } }
一套接口,打通媒体与订单
媒体资源查询
按类型 / 频道 / 行业 / 地区筛选新闻媒体、自媒体、短视频、海外媒体,价格按你的会员等级实时返回。
程序化下单
指定媒体 + 稿件一键下单,余额自动结算并派发履约,无需登录后台手动操作。
订单与回链追踪
实时查询订单状态与每篇稿件的发布回链,轻松接入你自己的系统与报表。
AI 报告直连
程序化提交 SEO / 外贸 / GEO / 商业计划书等报告需求,余额结算、进度可查、完成后回传报告链接。
字段自描述
报告产品的表单字段由接口自身返回(含必填标记),无需硬编码,产品调整后你的对接无需改代码。
统一余额结算
发布与报告共用账户余额,按会员等级计价;参数校验不通过的请求不创建订单、不扣费。
四步拿到你的 API Token
登录账号
累计充值满 500 元的会员,或已开通的媒介方账号。
提交申请
会员中心 / 媒介门户的「API 接口」一键申请。
审核开通
管理员审核通过后签发专属 Token。
开始对接
带上 Token 调用接口,立即自动化。
OpenAPI v1
所有接口统一鉴权:请求头 Authorization: Bearer <你的Token>(也支持 ?token=)。返回 {"code":0,"data":…},code 非 0 为错误。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /openapi/v1/ping | 校验令牌,返回归属信息 |
| GET | /openapi/v1/media | 媒体列表(type/channel/industry/city/kw/page)· 返回含平台/行业/地区中文名 |
| POST | /openapi/v1/orders | 下单(goods_type, goods_id, article_title, article_content)· 仅会员 |
| GET | /openapi/v1/orders | 我的订单列表 · 仅会员 |
| GET | /openapi/v1/orders/{no} | 订单详情 + 明细(含状态与回链)· 仅会员 |
| AI 报告 | ||
| GET | /openapi/v1/ai-reports/products | 可下单的报告产品与其表单字段(含必填标记) |
| POST | /openapi/v1/ai-reports | 提交报告需求(product_id, fields)· 仅会员 |
| GET | /openapi/v1/ai-reports | 我的报告订单列表 · 仅会员 |
| GET | /openapi/v1/ai-reports/{no} | 报告订单详情(状态 + 报告链接)· 仅会员 |
通用约定
| 鉴权 | 三种方式任选其一:Authorization: Bearer <Token>(推荐)、X-API-Token: <Token>、或 ?token=<Token>(便于浏览器直接测试,注意会留在访问日志里)。失败返回 HTTP 401 + code=401 |
| 返回信封 | {"code":0,"msg":"ok","data":{…}};以 code 判断成败,不要只看 HTTP 状态码——除鉴权失败外,业务错误一律返回 HTTP 200 + code≠0 |
| 字符编码 | 请求与返回均为 UTF-8;POST 支持 application/json 与 application/x-www-form-urlencoded |
| 分页 | 列表类接口每页 20 条,用 page 翻页(从 1 开始),返回 page / pages / total |
| 计价 | 媒体列表返回的 price 已按你的会员等级计算;web_price 为标价 |
| 扣费时机 | 下单即从账户余额扣款;参数校验不通过、余额不足的请求都不创建订单、不扣费(API 下单只支持余额支付,没有充值后再补付这一步) |
错误码与常见 msg
| code | HTTP | 含义 / 典型 msg | 怎么处理 |
|---|---|---|---|
| 0 | 200 | 成功 | 读取 data |
| 401 | 401 | 缺少 API 令牌 / 令牌无效 / 令牌未开通或已停用 / 账号已停用 | 检查 Token 与账号状态,不要重试 |
| 1 | 200 | 该接口仅限会员令牌调用(媒介方令牌调用了下单/订单类接口) | 换用会员令牌 |
| 1 | 200 | 缺少稿件标题或正文 | 补齐 article_title / article_content |
| 1 | 200 | 订单金额无效 / 资源不存在或已下架 | 先用媒体列表确认 goods_id 仍在售 |
| 1 | 200 | 余额不足:当前余额 X,需 Y,请先充值 | 不会创建订单、不扣费;充值后重新调用本接口即可(无需先查订单号,因为根本没建) |
| 1 | 400 | 参数错误:…(JSON 结构或类型不对) | 按提示修正,注意 goods_id 必须是数字 |
请求参数
| 参数 | 必填 | 说明 |
|---|---|---|
| type | 否 | media(新闻媒体,默认) / wemedia(自媒体) / video(短视频) / overseas(海外媒体) |
| channel | 否 | 频道/平台 ID(对应返回里的 channel_id) |
| industry | 否 | 行业 ID;海外媒体的媒体分类也用这个 |
| city | 否 | 地区 ID;海外媒体无此维度 |
| kw | 否 | 按媒体名称模糊搜索 |
| page | 否 | 页码,默认 1,每页 20 条 |
| 字段 | 必填 | 说明 |
|---|---|---|
| goods_type | 是 | 同 type:media / wemedia / video / overseas |
| goods_id | 是 | 媒体 ID,须为 JSON 数字;传成字符串会判参数错误 |
| article_title | 是 | 稿件标题 |
| article_content | 是 | 稿件正文 |
| qty | 否 | 数量,默认 1 |
媒体列表响应示例(GET /openapi/v1/media?type=wemedia)
{
"code": 0,
"data": {
"list": [
{
"id": 10086,
"type": "wemedia",
"title": "某某美妆号",
"price": 180.00,
"web_price": 200.00,
"channel_id": 211,
"channel_name": "小红书",
"platform": "小红书",
"industry_id": 176,
"industry_name": "美妆",
"city_id": 19,
"city_name": "广东",
"case_url": "https://...",
"link_type": "超链接",
"remark": "安排不撤 改稿不通知"
}
],
"page": 1, "pages": 7, "total": 128
}
}
platform为自媒体 / 短视频专有(抖音、小红书、微博…),与channel_name同值;媒体与海外媒体不返回该字段- 媒体的
channel_name是频道(如「新闻资讯」);海外媒体无频道维度,其媒体分类在industry_name(如「Technology」) - 原有
*_id字段保持不变,名称为新增字段,已对接的程序无需改动 - 详情接口
/api/media/{type}/{id}在data.labels与data.metrics下返回同一组名称与指标
媒体质量指标字段(新闻媒体最全)
| 字段 | 含义 | 取值 | 适用资源 |
|---|---|---|---|
| inclusion_rate | 收录率 | 0–100(百分数) | 媒体 |
| publish_rate | 出稿率 | 0–100(百分数) | 媒体 |
| pc_weight | 电脑权重 | 0–10 | 媒体;海外媒体仅早期入库资源有 |
| mobile_weight | 移动权重 | 0–10 | 媒体;海外媒体仅早期入库资源有 |
| news_source | 新闻源 | 百度新闻源 / 头条新闻源 / 百度&头条新闻源 | 媒体(仅新闻源媒体,约 5%) |
| inclusion_cond | 收录情况 | 不包收录 / 百度包收录 / 头条包收录 | 媒体 |
| link_type | 链接情况 | 不带联系方式 / 超链接 / 网址 / 微信QQ | 媒体;海外媒体仅早期入库资源有 |
| remark | 备注 | 文本 | 全部 |
- 字段不出现 = 该资源没有这项数据;出现且为
0则表示实测值就是 0。收录率 0%、权重 0 都是真实存在的取值,不要把「缺失」当成 0 处理 - 这七项以新闻媒体最全(上架资源基本全有值)。自媒体 / 短视频只有
remark——上游接口不提供这类权重/收录数据 - 海外媒体的权重与链接情况只有早期入库的资源带(媒介盒子海外接口的返回里没有这些字段),媒体分类见
industry_name - 数据随每日同步刷新,来源为媒介盒子接口
发布状态回调(Webhook)——不用再轮询
在会员中心 › API 接口填入你的接收地址后,稿件状态落地时由本站主动 POST 给你,
无需再定时轮询订单接口。留空即关闭。
POST https://your-server.com/pr1/callback
X-PR1-Event: item.published
X-PR1-Delivery: 1024
X-PR1-Timestamp: 1788318691
X-PR1-Signature: sha256=9f86d081...
{
"event": "item.published",
"order_no": "PR17883186911920",
"item_id": 55,
"goods_type": "media",
"goods_title": "极目新闻网",
"status": 2,
"status_text": "已发布",
"backlink": "https://www.ctdsb.net/...",
"fail_reason": "",
"amount": 50,
"occurred_at": 1788318691
}
- 事件:
item.published(带 backlink 回链)·item.failed·item.refunded(带 fail_reason 拒稿原因)。中间状态不推送 - 验真:
X-PR1-Signature=HMAC-SHA256(密钥, X-PR1-Timestamp + "." + 原始正文)的十六进制值, 密钥(Secret)在会员中心 › API 接口保存回调地址后自动生成,就显示在回调地址下方,可复制、可重置。请按原始字节计算,不要先反序列化再拼回去 - 幂等:网络重试可能让同一事件重复送达,请用
X-PR1-Delivery或item_id + event去重 - 重试:请在 10 秒内返回 2xx;非 2xx 按 1 分 → 5 分 → 15 分 → 30 分 → 60 分退避,最多 6 次后放弃。 投递结果可在会员中心「最近投递」自查
- 回调地址必须是公网可访问的 http/https 地址,指向内网或本机的地址会被拒绝
- 回调只是加速通知,订单接口仍是权威数据源;漏收时按订单号查一次即可对齐
下单示例
curl -X POST http://pr1.cn/openapi/v1/orders \
-H "Authorization: Bearer pr1_你的Token" \
-H "Content-Type: application/json" \
-d '{"goods_type":"media","goods_id":123,"article_title":"标题","article_content":"正文内容…"}'
goods_id须为 JSON 数字类型(如123),传成字符串(如"123")会被判定为参数错误- 下单需会员令牌(媒介方令牌无下单权限);累计充值满 500 元方可申请开通 API,开通后每次下单不再校验该门槛
订单详情响应示例(GET /openapi/v1/orders/{no})
{
"code": 0,
"data": {
"order": { "order_number": "PR...", "order_state": 1, "order_paid": 7.00, ... },
"items": [
{
"status": 1,
"backlink": "",
"article_url": "",
"refund_state": 0,
"fail_reason": ""
}
]
}
}
status:0 待支付 · 1 处理中 · 2 已发布(backlink为回链)· 3 发布失败 · 4 已退款fail_reason:稿件未能发布时的原因。媒体方拒稿会原样带回对方给的理由(如「内容不适合」),并自动退款到账户余额(此时 status=4)。据此提示用户改稿重发,不必人工问客服- 发布通常需数小时至数天,建议按订单号轮询本接口,不要因为一时没有回链就判定失败
- 明细在
data.items数组中(非扁平结构),一个订单可含多条稿件明细 status为数字状态码(非字符串):0 待支付 / 1 处理中 / 2 已发布 / 3 发布失败 / 4 已退款backlink稿件实际发布上线后才会回填,发布前为空字符串属正常状态
对接自测用例(复制即可运行)
把 pr1_你的Token 换成自己的令牌,按顺序跑一遍即可确认对接是否通畅。
①②③ 为只读,不产生任何费用;④ 会真实下单并扣款,请先用 ① 确认令牌、再用 ② 挑一个便宜的媒体。
21360 湖南新闻之窗、21348 北京新闻资讯、
21376 上海新闻之窗、21383 浙江新闻周刊、
21393 江苏新闻之窗、4461 创未来(goods_type 均为 media)kw=新闻之窗 搜索,再看返回里 price 为 1 的条目;媒体可能上下架,下单前以列表实时返回为准item.published / item.failed / item.refunded# ① 校验令牌(预期 code=0,返回归属信息)
curl -H "Authorization: Bearer pr1_你的Token" \
http://pr1.cn/openapi/v1/ping
# ② 找 1 元底价媒体(只读;在返回的 list 里挑 price=1 的,记下它的 id)
curl -H "Authorization: Bearer pr1_你的Token" \
"http://pr1.cn/openapi/v1/media?type=media&kw=新闻之窗"
# ③ 鉴权失败长什么样(预期 HTTP 401 + code=401)
curl -i -H "Authorization: Bearer pr1_wrong" \
http://pr1.cn/openapi/v1/ping
# ④ 下单(会真实扣款,1 元媒体就扣 1 元;goods_id 换成 ② 里的 id,注意是数字不是字符串)
curl -X POST http://pr1.cn/openapi/v1/orders \
-H "Authorization: Bearer pr1_你的Token" \
-H "Content-Type: application/json" \
-d '{"goods_type":"media","goods_id":21360,"qty":1,
"article_title":"测试稿件标题","article_content":"测试稿件正文…"}'
# → {"code":0,"data":{"order_no":"PR…","amount":1,"order_state":1},"msg":"下单成功"}
# ⑤ 用 ④ 返回的 order_no 查进度(发布需数小时至数天,请轮询或改用回调)
curl -H "Authorization: Bearer pr1_你的Token" \
http://pr1.cn/openapi/v1/orders/PR你的订单号
# → items[].status: 1 处理中 → 2 已发布(带 backlink) / 3 失败 / 4 已退款(带 fail_reason)
- 参数错误不会创建订单、不扣费,可放心用错误参数试探接口行为
- 若 ④ 返回「余额不足」,不会创建订单、不扣费;充值后重新调用一次 ④ 即可,无需查订单号(这种情况下不会有订单号)
- 联调阶段建议先用上面的 1 元底价媒体跑通全流程,再切到目标媒体
回调验签示例
签名 = HMAC-SHA256(密钥, X-PR1-Timestamp + "." + 原始请求体)。
务必对原始字节计算——先反序列化再拼回 JSON 会因键序或空格不同导致签名对不上。
# PHP
$raw = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_PR1_TIMESTAMP'];
$sig = 'sha256=' . hash_hmac('sha256', $ts . '.' . $raw, $secret);
if (!hash_equals($sig, $_SERVER['HTTP_X_PR1_SIGNATURE'])) { http_response_code(403); exit; }
if (abs(time() - (int)$ts) > 300) { http_response_code(403); exit; } # 防重放
http_response_code(200); echo 'ok';
# Python (Flask)
raw = request.get_data()
ts = request.headers.get('X-PR1-Timestamp', '')
sig = 'sha256=' + hmac.new(secret.encode(), (ts + '.').encode() + raw, hashlib.sha256).hexdigest()
if not hmac.compare_digest(sig, request.headers.get('X-PR1-Signature', '')):
return '', 403
return 'ok', 200
# Node.js (Express,注意要拿原始 body)
app.post('/pr1/callback', express.raw({type:'*/*'}), (req, res) => {
const ts = req.get('X-PR1-Timestamp');
const sig = 'sha256=' + crypto.createHmac('sha256', secret)
.update(ts + '.' + req.body.toString()).digest('hex');
if (sig !== req.get('X-PR1-Signature')) return res.sendStatus(403);
res.send('ok');
});
| 请求头 | 说明 |
|---|---|
| X-PR1-Event | item.published / item.failed / item.refunded |
| X-PR1-Delivery | 投递编号,用它做幂等去重(重试会重复送达同一编号) |
| X-PR1-Timestamp | 签名用的时间戳(秒);建议拒绝偏差超过 5 分钟的请求 |
| X-PR1-Signature | sha256=<hex>,见上方算法 |
- 返回 2xx 即视为成功;其余状态码或超时(10 秒)按 1 分 → 5 分 → 15 分 → 30 分 → 60 分退避重试,共 6 次后放弃
- 请先返回 2xx 再处理业务:把耗时逻辑放进队列,避免因处理慢触发重试
- 投递结果(成功/失败/已放弃、对方状态码、错误原因)可在会员中心 › API 接口的「最近投递」自查
- 回调是加速通知,订单接口仍是权威数据源;漏收时按订单号查一次即可对齐
AI 报告接口
新增与站内「AI 智能报告」同一套下单与计费:提交需求后自动生成,完成后回写报告链接。报告由 aireport.store(智研 Max) 生成,你只需对接本站接口,无需自行申请对方账号。
① 取产品与字段定义
curl -H "Authorization: Bearer pr1_你的Token" \
http://pr1.cn/openapi/v1/ai-reports/products
{ "code":0, "data": { "list": [
{ "product_id":1, "biz_type":1, "name":"深度网站SEO分析报告", "price":200,
"fields":[ {"key":"url","label":"目标网址","required":true},
{"key":"keywords","label":"核心关键词(3–20 个)","required":true} ] } ] } }
② 提交报告需求(余额扣款)
curl -X POST http://pr1.cn/openapi/v1/ai-reports \
-H "Authorization: Bearer pr1_你的Token" \
-H "Content-Type: application/json" \
-d '{"product_id":1,"fields":{"url":"https://example.com","keywords":"外贸 SEO"}}'
{ "code":0, "msg":"下单成功,报告生成中",
"data":{ "order_no":"AI1786261476088870", "amount":200,
"status":1, "status_text":"queued", "report_url":"" } }
③ 轮询进度 / 取回报告
curl -H "Authorization: Bearer pr1_你的Token" \
http://pr1.cn/openapi/v1/ai-reports/AI1786261476088870
{ "code":0, "data":{ "status":3, "status_text":"completed",
"report_url":"https://aireport.store/r/xxxx" } }
fields的键用 products 返回的key(英文)或label(中文)均可,便于不同语言的系统对接status:1 待生成 / 2 生成中 / 3 已完成 / 4 生成失败 / 5 已退款;同时返回英文status_text便于判断- 必填字段缺失或 product_id 无效时直接报错,不创建订单、不扣费;报告费用与站内一致,按 products 返回的
price从余额扣除 - 建议轮询间隔 ≥30 秒;生成通常分钟级完成,完成后
report_url才有值 - 若管理员尚未在后台启用 AI 报告接口,订单会停在「待生成」等待人工处理,费用照常已扣、可申请退款