接入流程
API 调用免费;实际发稿订单按接入账号的会员价下单扣款。限流和配额用于防刷。
- 注册媒小宝会员,按要求完成认证,准备下单余额。
- 申请开放 API 应用,获取应用凭据并按业务场景分配权限。
- 配置 IP 白名单与 HTTPS 回调地址,在沙箱验证签名、下单、验收及通知。
- 通过准入检查后切换到生产凭据与地址。
鉴权与签名
服务端先换取令牌,再携带令牌与签名发送业务请求。时间窗为 5 分钟;每次请求使用新的 Nonce。凭据应保存在接入方服务端。
① 换取令牌
POST /open/v1/auth/token
body: appKey + timestamp + nonce + sign
sign = HMAC-SHA256(appSecret, appKey + timestamp + nonce)
→ access_token(TTL 2 小时)
② 业务请求
headers:
X-App-Key: ak_xxx
X-Timestamp: 1728450000
X-Nonce: 随机串(Redis 去重,TTL 10 分钟)
X-Signature: HMAC-SHA256(appSecret, LF.join(method, requestTarget, timestamp, nonce, SHA256(body)))
Authorization: Bearer <access_token>查看 Node.js 签名示例
示例获取令牌并查询资源。签名串使用 UTF-8,摘要和 HMAC 输出小写十六进制。
import { createHash, createHmac, randomUUID } from 'node:crypto';
// 摘要和签名均为小写十六进制。
function sign(secret, message) {
return createHmac('sha256', secret).update(message, 'utf8').digest('hex');
}
const timestamp = String(Math.floor(Date.now() / 1000));
const nonce = randomUUID();
const appKey = process.env.APP_KEY;
const secret = process.env.APP_SECRET;
const base = process.env.API_BASE;
if (!appKey || !secret || !base) throw new Error('请设置 APP_KEY、APP_SECRET 和 API_BASE');
const tokenBody = {
appKey,
timestamp: Number(timestamp),
nonce,
sign: sign(secret, appKey + timestamp + nonce),
};
function signedHeaders(method, path, body, accessToken) {
const timestamp = String(Math.floor(Date.now() / 1000));
const nonce = randomUUID();
const hash = createHash('sha256').update(body, 'utf8').digest('hex');
return {
'X-App-Key': appKey,
'X-Timestamp': timestamp,
'X-Nonce': nonce,
'X-Signature': sign(secret, [method, path, timestamp, nonce, hash].join('\n')),
Authorization: 'Bearer ' + accessToken,
};
}
// GET 无请求体时传空字符串。POST 应签名实际发送的 JSON 字符串。
const tokenResponse = await fetch(new URL('/open/v1/auth/token', base), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(tokenBody),
});
const tokenResult = await tokenResponse.json();
if (!tokenResponse.ok) throw new Error('取令牌失败:' + tokenResult.code);
const path = '/open/v1/resources?page=1&pageSize=20';
const headers = signedHeaders('GET', path, '', tokenResult.data.access_token);
const resourceResponse = await fetch(new URL(path, base), { headers });
console.log(await resourceResponse.json());权限范围:resources:read、orders:read、orders:write、balance:read、reconciliation:read。
接口参考
字段表对应当前网关实现,所有响应示例使用演示数据。签名必须使用实际发送的原始请求体,查询参数需保留原顺序与编码。
cURL 示例使用 Shell 环境变量。获取令牌前按鉴权章节生成 TOKEN_BODY,业务请求使用新时间戳、Nonce 和签名。
鉴权
换取 access_tokenPOST /open/v1/auth/token
在服务端换取业务请求所需的访问令牌,有效期 2 小时。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
appKey | 请求体 | string | 必填 | 应用标识 |
timestamp | 请求体 | integer | 必填 | Unix 时间戳,单位秒 |
nonce | 请求体 | string | 必填 | 每次请求生成新的随机串 |
sign | 请求体 | string | 必填 | 按鉴权章节计算签名 |
curl --request POST "$API_BASE/open/v1/auth/token" \
--header "Content-Type: application/json" \
--data-raw "$TOKEN_BODY"响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
access_token | string | 后续业务请求的 Bearer 令牌 |
expires_in | integer | 有效期,单位秒 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"access_token": "<access-token>",
"expires_in": 7200
}
}时间戳和 Nonce 都要在请求时生成。遇到 40101,检查应用凭据、时间窗与签名串。
媒体资源
资源列表(15 类全开放,筛选 / 分页)GET /open/v1/resources
按类目查询可供选择的媒体资源,并按页读取结果。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
category | 查询 | integer | 可选 | 类目编码 1–15 |
keyword | 查询 | string | 可选 | 媒体名称关键词 |
region | 查询 | string | 可选 | 地区精确匹配 |
page | 查询 | integer | 可选 | 默认 1,最大 10000 |
pageSize | 查询 | integer | 可选 | 默认 20,最大 100 |
curl --request GET "$API_BASE/open/v1/resources?page=1&pageSize=20" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE"响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
items[] | object[] | 资源摘要,包含资源标识、名称、类目、地区、当前账号可用售价及可售状态 |
page / pageSize / total | integer | 当前页码、每页条数和匹配资源总数 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"items": [
{
"sourceId": "101",
"name": "示例媒体",
"category": 1,
"region": "北京",
"available": true,
"priceOptions": [
{
"priceType": 1,
"label": "默认",
"price": "120.00"
}
]
}
],
"page": 1,
"pageSize": 20,
"total": 1
}
}筛选支持类目、名称关键词和地区。详情与列表使用同一资源结构。
资源详情GET /open/v1/resources/{sourceId}
获取单个媒体资源的详情,用于选媒与下单前核对。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
sourceId | 路径 | string | 必填 | 从资源列表取得的资源标识 |
curl --request GET "$API_BASE/open/v1/resources/101" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE"响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
sourceId / name | string | 资源标识与名称 |
category | integer | 类目编码 |
region | string | null | 地区 |
available | boolean | 是否可售 |
priceOptions[] | object[] | priceType、label 和当前账号售价 price,两位小数字符串或 null |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"sourceId": "101",
"name": "示例媒体",
"category": 1,
"region": "北京",
"available": true,
"priceOptions": [
{
"priceType": 1,
"label": "默认",
"price": "120.00"
}
]
}
}遇到 40401,重新查找资源。下单时仍需校验当前状态和报价。
资源上下架状态POST /open/v1/resources/state
在提交订单前核对资源当前是否可售。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
sourceId | 请求体 | string | 必填 | 需要查询的资源标识 |
curl --request POST "$API_BASE/open/v1/resources/state" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE" \
--header 'Content-Type: application/json' \
--data-raw '{"sourceId":"101"}'响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
sourceId | string | 资源标识 |
available | boolean | 当前是否可售 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"sourceId": "101",
"available": true
}
}状态查询结果可能随时变化。遇到 40902 时重新核对资源状态。
订单与验收
创建订单(支持 Idempotency-Key)POST /open/v1/orders
按账号可用售价创建一笔投放订单,并通过幂等键避免重复提交。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
Idempotency-Key | 请求头 | string | 必填 | 建议使用接入方的订单编号 |
sourceId | 请求体 | string | 必填 | 要投放的资源标识 |
title | 请求体 | string | 必填 | 稿件标题 |
content | 请求体 | string | 必填 | 稿件正文,生产环境执行平台稿件合规校验 |
price | 请求体 | number | string | 必填 | 接入方确认的当前售价 |
priceType | 请求体 | integer | 可选 | 从 priceOptions 选取,默认 1 |
remark | 请求体 | string | 可选 | 投放要求或说明 |
curl --request POST "$API_BASE/open/v1/orders" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE" \
--header "Idempotency-Key: client-demo-001" \
--header 'Content-Type: application/json' \
--data-raw '{"sourceId":"101","title":"示例企业新品发布","content":"沙箱演示稿件。生产请求请提交符合稿件规格的完整正文。","price":"120.00"}'响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
orderNo | string | 平台订单编号 |
status | string | 订单状态,见状态字典 |
amount / currency | string | 成交金额(两位小数)及币种 CNY |
sandbox | boolean | 是否为沙箱订单 |
resultUrl | string | null | 发布结果链接,尚未发布时为空 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"orderNo": "ORD-DEMO-001",
"status": "PENDING_REVIEW",
"amount": "120.00",
"currency": "CNY",
"sandbox": false,
"resultUrl": null
}
}同一笔订单重试时复用原幂等键。42201 先刷新报价,42202 核对价格类别,50301 检查余额。
查询订单状态GET /open/v1/orders/{orderNo}
查询订单进度及已生成的发布结果。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
orderNo | 路径 | string | 必填 | 创建订单后获得的订单编号 |
curl --request GET "$API_BASE/open/v1/orders/ORD-DEMO-001" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE"响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
orderNo | string | 平台订单编号 |
status | string | 订单状态,见状态字典 |
amount / currency | string | 成交金额(两位小数)及币种 CNY |
sandbox | boolean | 是否为沙箱订单 |
resultUrl | string | null | 发布结果链接,尚未发布时为空 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"orderNo": "ORD-DEMO-001",
"status": "PENDING_CONFIRM",
"amount": "120.00",
"currency": "CNY",
"sandbox": false,
"resultUrl": "https://example.com/published/demo"
}
}查询返回 40401 时,检查订单编号及其归属。
验收完成POST /open/v1/orders/{orderNo}/confirm
核对发布链接和稿件内容后提交验收。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
orderNo | 路径 | string | 必填 | 创建订单后获得的订单编号 |
curl --request POST "$API_BASE/open/v1/orders/ORD-DEMO-001/confirm" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE"响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
orderNo | string | 平台订单编号 |
status | string | 订单状态,见状态字典 |
amount / currency | string | 成交金额(两位小数)及币种 CNY |
sandbox | boolean | 是否为沙箱订单 |
resultUrl | string | null | 发布结果链接,尚未发布时为空 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"orderNo": "ORD-DEMO-001",
"status": "PUBLISHED",
"amount": "120.00",
"currency": "CNY",
"sandbox": false,
"resultUrl": null
}
}先查询订单是否待确认。请求体留空,状态不允许时返回 40902。
反馈 / 驳回POST /open/v1/orders/{orderNo}/feedback
发布结果有问题时提交反馈,供后续处理。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
orderNo | 路径 | string | 必填 | 创建订单后获得的订单编号 |
reason | 请求体 | string | 必填 | 具体问题与期望修改内容 |
curl --request POST "$API_BASE/open/v1/orders/ORD-DEMO-001/feedback" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE" \
--header 'Content-Type: application/json' \
--data-raw '{"reason":"发布标题与提交稿件不一致,请核对。"}'响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
orderNo | string | 平台订单编号 |
status | string | 订单状态,见状态字典 |
amount / currency | string | 成交金额(两位小数)及币种 CNY |
sandbox | boolean | 是否为沙箱订单 |
resultUrl | string | null | 发布结果链接,尚未发布时为空 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"orderNo": "ORD-DEMO-001",
"status": "PUBLISHING",
"amount": "120.00",
"currency": "CNY",
"sandbox": false,
"resultUrl": null
}
}需有待验收投放,状态不允许时返回 40902。
账户
账户余额与会员档位GET /open/v1/account/balance
查询当前应用归属账号的余额和会员档位。
请求参数
使用通用鉴权请求头。
curl --request GET "$API_BASE/open/v1/account/balance" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE"响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
balance | string | 当前可用余额,沙箱固定 0.00 |
memberLevel | string | null | 当前账号档位 |
currency | string | CNY |
sandbox | boolean | 是否为沙箱 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"balance": "500.00",
"memberLevel": "P1",
"currency": "CNY",
"sandbox": false
}
}查得的余额仅供预判,下单能否扣款以订单请求结果为准。
对账
对账单导出(我方自建)GET /open/v1/reconciliation
导出接入方自身的交易对账单。
请求参数
| 字段 | 位置 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
startDate | 查询 | string | 必填 | 示例账期开始日期 |
endDate | 查询 | string | 必填 | 结束日期,含当日 |
page | 查询 | integer | 可选 | 默认 1 |
pageSize | 查询 | integer | 可选 | 默认 20,最大 100 |
curl --request GET "$API_BASE/open/v1/reconciliation?startDate=2026-10-01&endDate=2026-10-31" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "X-App-Key: $APP_KEY" \
--header "X-Timestamp: $TIMESTAMP" \
--header "X-Nonce: $NONCE" \
--header "X-Signature: $SIGNATURE"响应说明
| data 内字段 | 类型 | 说明 |
|---|---|---|
items[] | object[] | 应用名下的已支付订单及退款标记 |
page / pageSize / total | integer | 分页信息 |
timezone | string | 账期使用的服务端时区 |
{
"code": 0,
"message": "ok",
"requestId": "req_example",
"data": {
"items": [
{
"orderNo": "ORD-DEMO-001",
"status": "PUBLISHED",
"amount": "120.00",
"currency": "CNY",
"paidAt": "2026-10-15T10:00:00+08:00",
"refunded": false
}
],
"page": 1,
"pageSize": 20,
"total": 1,
"timezone": "Asia/Shanghai"
}
}查询最多 31 天,返回分页 JSON。沙箱账单为空。
资源类目与字段差异
统一通过资源列表、详情和状态查询覆盖各类目。下表是产品的类目能力说明,接口筛选键见资源列表,类目是否可用以实际资源为准。
| 资源类目 | 适用场景 | 需关注的属性 |
|---|---|---|
软文资源 | 主力媒体库(门户/新闻源) | 按分类/区域/发稿速度/入口级别/新闻源/权重筛选;收录承诺标记;案例链接;批量投放 |
自媒体资源 | 主力媒体库(账号型) | 按平台/行业/认证/粉丝档/阅读档筛选;账号主页入口;可发视频标记 |
海外发稿 | 高客单利润中心 | 按国家/语言/产品类型/新闻源筛选;翻译/配音/底部信息/发布授权开关;国际排名与预估浏览展示;汇率与本币报价 |
海外社媒 | 海外社媒投放 | 按 Instagram/Facebook/YouTube/TikTok/Twitter/LinkedIn/其他筛选;在线时长、发布方式、粉丝档 |
贴吧资源 | 长尾口碑 | 联系方式可否、置顶/加精、链接有效期、评论数量 |
论坛资源 | 长尾口碑 | 论坛分类/区域、联系方式、置顶/加精、链接有效期 |
问答资源 | 口碑/搜索占位 | 分类、联系方式、回答数量、链接有效期 |
友链资源 | SEO 外链 | 网站类型、单站/套餐、站长权重、百度收录量、友链时间 |
文案资源 | 代写服务(与 AI 写作联动) | 擅长领域、推广渠道、文章字数、修改次数、交稿时间、个人/团队 |
小红书资源 | 种草主战场 | 账号质量(普通/优质)、收录效果、粉丝档、点赞档、收藏档 |
百科资源 | 品牌背书 | 词条类型、百科类型、出链时间、展现版本(基础/标准/高级) |
短视频资源 | 视频分发(直发/合拍) | 平台、所在地、性别/年龄/职业、粉丝、平均点赞、累计获赞、可修改内容、是否可合拍 |
微信资源 | 公众号投放 | 微信号、区域、行业、粉丝档、阅读档、头像、发布速度 |
微博资源 | 微博传播 | 区域、行业、粉丝档、认证(金V/红V/蓝V)、头像 |
母语资源 | 海外母语原创 | 语言、地区、产品分类、发布速度、案例 |
短视频、微信和微博支持不同发布形式。下单前应先核对资源支持的价格类别与当前报价。
响应与错误码
排查问题时保留 requestId,用于定位该次调用。
{ "code": 0, "message": "ok", "requestId": "req_20261009_xxx", "data": {} }| 错误码 | 含义 |
|---|---|
0 | 成功 |
40001 | 参数错误 |
40101 | 鉴权失败 |
40301 | 无权限 / scope 不足 / 授权或会员状态异常 |
40401 | 资源或订单不存在 |
40901 | 同一幂等键被用于不同请求体(HTTP 409) |
40902 | 资源状态冲突 |
42201 | 价格已变更 |
42202 | 价格类别不支持 |
42901 | 超过限流 |
50001 | 服务暂不可用(HTTP 500) |
50301 | 余额不足(HTTP 422) |
订单与回调
创建订单必须传 Idempotency-Key,建议使用接入方订单号。重试同一笔订单时复用原键,相同应用与原始请求体复用首次成功结果。复用同一个键提交不同请求体会返回 40901。
查看订单状态字典
以下为开放接口使用的平台订单状态。
| 状态值 | 含义 |
|---|---|
PENDING_PAY | 待支付 |
PENDING_REVIEW | 待审核 |
PENDING_UPSTREAM | 待上游回传 |
REVIEWING | 审核中 |
PUBLISHING | 发稿中 |
PENDING_CONFIRM | 待确认 |
PUBLISHED | 已发布 |
REJECTED | 已驳回 |
CLOSED | 已关闭 |
REFUNDING | 退款中 |
REFUNDED | 已退款 |
状态变更、验收完成、退款完成分别对应 order.status_changed、order.confirmed、order.refunded。回调使用 HTTPS POST JSON,接收方验签后按 eventId 去重。
X-Signature = HMAC-SHA256(appSecret, timestamp + body){
"eventId": "evt_example_001",
"event": "order.status_changed",
"occurredAt": "2026-10-15T10:00:00+08:00",
"data": {
"orderNo": "ORD-DEMO-001",
"status": "PENDING_CONFIRM",
"amount": "120.00",
"currency": "CNY",
"sandbox": false
}
}读取 X-Timestamp 和 X-Signature,用应用密钥和原始请求体验签。处理成功返回 2xx,重复 eventId 返回 2xx。
投递失败最多重试 6 次,间隔为 1 分钟、5 分钟、30 分钟、1 小时、3 小时、6 小时。
沙箱与上线
沙箱使用独立凭据和模拟订单,创建后进入待验收,可测试确认和反馈。沙箱订单不扣余额、不进入生产履约。生产接入前请核对应用权限、IP 白名单、回调地址、账户余额和限额。