媒小宝 开发者平台返回官网
v1 · 开发者文档

API 开放平台

把媒体资源查询、发稿订单和履约通知接入自己的业务系统。

接入流程

API 调用免费;实际发稿订单按接入账号的会员价下单扣款。限流和配额用于防刷。

  1. 注册媒小宝会员,按要求完成认证,准备下单余额。
  2. 申请开放 API 应用,获取应用凭据并按业务场景分配权限。
  3. 配置 IP 白名单与 HTTPS 回调地址,在沙箱验证签名、下单、验收及通知。
  4. 通过准入检查后切换到生产凭据与地址。
前往官网注册会员 →

鉴权与签名

服务端先换取令牌,再携带令牌与签名发送业务请求。时间窗为 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 输出小写十六进制。

完整调用示例 · Node.js
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。

接口参考

下载 OpenAPI 3.1 契约

字段表对应当前网关实现,所有响应示例使用演示数据。签名必须使用实际发送的原始请求体,查询参数需保留原顺序与编码。

cURL 示例使用 Shell 环境变量。获取令牌前按鉴权章节生成 TOKEN_BODY,业务请求使用新时间戳、Nonce 和签名。

鉴权

换取 access_tokenPOST /open/v1/auth/token

在服务端换取业务请求所需的访问令牌,有效期 2 小时。

请求参数

字段位置类型要求说明
appKey请求体string必填应用标识
timestamp请求体integer必填Unix 时间戳,单位秒
nonce请求体string必填每次请求生成新的随机串
sign请求体string必填按鉴权章节计算签名
请求示例 · cURL
curl --request POST "$API_BASE/open/v1/auth/token" \
  --header "Content-Type: application/json" \
  --data-raw "$TOKEN_BODY"

响应说明

data 内字段类型说明
access_tokenstring后续业务请求的 Bearer 令牌
expires_ininteger有效期,单位秒
响应示例 · JSON
{
  "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
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 / totalinteger当前页码、每页条数和匹配资源总数
响应示例 · JSON
{
  "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
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 / namestring资源标识与名称
categoryinteger类目编码
regionstring | null地区
availableboolean是否可售
priceOptions[]object[]priceType、label 和当前账号售价 price,两位小数字符串或 null
响应示例 · JSON
{
  "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
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 内字段类型说明
sourceIdstring资源标识
availableboolean当前是否可售
响应示例 · JSON
{
  "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
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 内字段类型说明
orderNostring平台订单编号
statusstring订单状态,见状态字典
amount / currencystring成交金额(两位小数)及币种 CNY
sandboxboolean是否为沙箱订单
resultUrlstring | null发布结果链接,尚未发布时为空
响应示例 · JSON
{
  "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
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 内字段类型说明
orderNostring平台订单编号
statusstring订单状态,见状态字典
amount / currencystring成交金额(两位小数)及币种 CNY
sandboxboolean是否为沙箱订单
resultUrlstring | null发布结果链接,尚未发布时为空
响应示例 · JSON
{
  "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
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 内字段类型说明
orderNostring平台订单编号
statusstring订单状态,见状态字典
amount / currencystring成交金额(两位小数)及币种 CNY
sandboxboolean是否为沙箱订单
resultUrlstring | null发布结果链接,尚未发布时为空
响应示例 · JSON
{
  "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
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 内字段类型说明
orderNostring平台订单编号
statusstring订单状态,见状态字典
amount / currencystring成交金额(两位小数)及币种 CNY
sandboxboolean是否为沙箱订单
resultUrlstring | null发布结果链接,尚未发布时为空
响应示例 · JSON
{
  "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
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 内字段类型说明
balancestring当前可用余额,沙箱固定 0.00
memberLevelstring | null当前账号档位
currencystringCNY
sandboxboolean是否为沙箱
响应示例 · JSON
{
  "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
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 / totalinteger分页信息
timezonestring账期使用的服务端时区
响应示例 · JSON
{
  "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,用于定位该次调用。

统一响应 · JSON
{ "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 去重。

Webhook 签名协议
X-Signature = HMAC-SHA256(appSecret, timestamp + body)
状态变更通知 · JSON 示意
{
  "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 白名单、回调地址、账户余额和限额。