跳到主要内容
第一公关网-品牌推广一站式服务
开放 API · OpenAPI

API 对接,
省心省力

媒介方与累计充值满 500 元的会员申请 API Token 后,即可程序化对接 媒体资源、发布订单 与 AI 报告——自动查询刊例、批量下单、实时追踪发布回链,还能直接提交 SEO / 外贸 / GEO 等报告需求并取回结果。

curl
$ 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

1

登录账号

累计充值满 500 元的会员,或已开通的媒介方账号。

2

提交申请

会员中心 / 媒介门户的「API 接口」一键申请。

3

审核开通

管理员审核通过后签发专属 Token。

4

开始对接

带上 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

codeHTTP含义 / 典型 msg怎么处理
0200成功读取 data
401401缺少 API 令牌 / 令牌无效 / 令牌未开通或已停用 / 账号已停用检查 Token 与账号状态,不要重试
1200该接口仅限会员令牌调用(媒介方令牌调用了下单/订单类接口)换用会员令牌
1200缺少稿件标题或正文补齐 article_title / article_content
1200订单金额无效 / 资源不存在或已下架先用媒体列表确认 goods_id 仍在售
1200余额不足:当前余额 X,需 Y,请先充值不会创建订单、不扣费;充值后重新调用本接口即可(无需先查订单号,因为根本没建)
1400参数错误:…(JSON 结构或类型不对)按提示修正,注意 goods_id 必须是数字

请求参数

GET /openapi/v1/media
参数必填说明
type否media(新闻媒体,默认) / wemedia(自媒体) / video(短视频) / overseas(海外媒体)
channel否频道/平台 ID(对应返回里的 channel_id)
industry否行业 ID;海外媒体的媒体分类也用这个
city否地区 ID;海外媒体无此维度
kw否按媒体名称模糊搜索
page否页码,默认 1,每页 20 条
POST /openapi/v1/orders (仅会员令牌)
字段必填说明
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 换成自己的令牌,按顺序跑一遍即可确认对接是否通畅。 ①②③ 为只读,不产生任何费用;④ 会真实下单并扣款,请先用 ① 确认令牌、再用 ② 挑一个便宜的媒体。

联调建议:用 1 元底价媒体测试,全流程只花 1 块钱。新闻媒体里有一批标价 ¥1 的底价媒体,专门适合跑通「下单 → 查进度 → 回调」:
· 例如 21360 湖南新闻之窗、21348 北京新闻资讯、 21376 上海新闻之窗、21383 浙江新闻周刊、 21393 江苏新闻之窗、4461 创未来(goods_type 均为 media)
· 也可以用 kw=新闻之窗 搜索,再看返回里 price 为 1 的条目;媒体可能上下架,下单前以列表实时返回为准
· 这是真实下单:会扣 1 元、稿件会真实提交发布,退款规则与正式订单一致(媒体拒稿或发布失败自动退回余额),所以稿件内容请写正常内容,不要填乱码
· 想同时测回调:先在会员中心 › API 接口保存回调地址,下单后等状态变化即可收到 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-Eventitem.published / item.failed / item.refunded
X-PR1-Delivery投递编号,用它做幂等去重(重试会重复送达同一编号)
X-PR1-Timestamp签名用的时间戳(秒);建议拒绝偏差超过 5 分钟的请求
X-PR1-Signaturesha256=<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 报告接口,订单会停在「待生成」等待人工处理,费用照常已扣、可申请退款

让对接,省心省力

媒介方与累计充值满 500 元的会员,现在就申请 API 权限,把发布与监控接进你的系统。