/api/v1/parse,解析成功才扣费,失败不扣。鉴权(任选其一):请求头 Authorization: Bearer <KEY>(推荐)或 query 参数 key=<KEY>。
限流:每个 Key 默认 5 次/秒、120 次/分钟,超出返回 42901。相同链接 10 分钟内命中缓存,同样按成功计费。
GET POST /api/v1/parse
| 参数 | 必填 | 说明 |
|---|---|---|
| url | 是 | 分享链接,或包含链接的整段分享文案(自动提取)。POST 支持 JSON 或表单。 |
| key | 否 | API Key(未使用 Authorization 头时) |
v2 在原有字段基础上新增 videos / music / text / counts / pack,旧字段全部保留,向下兼容。
{
"code": 0, "msg": "成功", "request_id": "c1f2…",
"data": {
"type": "video", // video 视频 / images 图集 / live 实况图
"platform": "douyin",
"title": "标题", "desc": "描述", "cover": "封面地址",
"video_url": "无水印视频地址(= videos[0].url)",
"video_backup": ["备用地址"],
"images": ["图集图片地址"],
"live": [{"image": "封面图", "video": "实况短视频"}],
"author": {"nickname": "", "avatar": "", "id": ""},
// ↓ v2 新增:按内容分类
"videos": [{"url": "", "quality": "1080p", "width": 1920, "height": 1080, "ext": "mp4"}], // 多清晰度,首个为主
"music": {"url": "", "title": "", "author": "", "cover": "", "duration": 15} , // 无背景音乐时为 null
"text": {"title": "", "desc": "", "tags": ["话题"]},
"audios": [{"url": "", "ext": "m4a", "abr": 128}], // 可选参数 mode=audio 只返回音频
"subtitles": [{"lang": "en", "ext": "vtt", "auto": false, "url": ""}], // sub_lang=en 过滤
// 可选参数:quality=max|1080|720|480… mode=audio|mute sub_lang=en|all(均不额外计费)
"counts": {"cover": 1, "video": 1, "music": 0, "text": 1, "images": 0, "live": 0},
"pack": {"url": "/api/v1/pack/ID?exp=..&sig=..", "expires_at": 1730000000, "count": 4, "files": 4, "max_files": 50} // 有图集/实况时返回,否则 null
}
}直链有防盗链/时效,请尽快下载;失败时 data 为 null。
GET data.pack.url(可追加 &sel=0,2,5 只打包选中项,序号按 images 在前、live 在后)→ 直接返回 application/zip 流。
POST /api/v1/pack(需 API Key,不扣费)请求体 {"urls":["图片直链"],"live":[{"image":"","video":""}],"title":"文件名前缀","referer":"可选"} → 返回 {"url","expires_at","count","files"}。
_说明.txt。序号_标题.扩展名。POST /api/v1/batch body {"urls":["链接1","链接2"],"quality":"可选","async":false},单次最多 20 条。
同步:逐条返回 items[i].code / data,每条独立计费,只扣成功的;汇总 success / failed / cost_li。"async":true:每条建一个异步任务,返回 task_id,结果走 Webhook 或 /api/v1/tasks/{id}。
POST 请求带 Idempotency-Key: 任意唯一串,24 小时内重放返回首次结果(响应头 Idempotent-Replayed: true),不会重复扣费;同 Key 不同请求体返回 40902,处理中返回 40901。
每个响应带 X-Request-Id;计费接口额外返回 X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset(秒),429 时带 Retry-After。
公开状态:/status 页面、GET /api/v1/status;错误码表:GET /api/v1/errors;按 Key / 平台用量:GET /api/v1/usage?days=30&by=key。
控制台可给每个 Key 设权限 parse, batch, tasks, transcript, read(默认全部)、每日消费上限(厘)和 IP 白名单。越权返回 40304,超上限返回 40305。建议线上服务只给 parse,统计脚本只给 read。
| code | HTTP | 含义 | 扣费 |
|---|---|---|---|
| 0 | 200 | 成功 | 是 |
| 40001 | 400 | 参数错误(缺少 url / 不含链接) | 否 |
| 40101 | 401 | API Key 缺失、无效或已禁用 | 否 |
| 40201 | 402 | 余额不足 | 否 |
| 40401 | 404 | 不支持的平台 / 平台已下线 | 否 |
| 40303 | 403 | 调用 IP 不在 Key 白名单 | 否 |
| 40304 | 403 | Key 无此接口权限 | 否 |
| 40305 | 403 | Key 今日消费达上限 | 否 |
| 40901 | 409 | 同一幂等请求正在处理 | 否 |
| 40902 | 409 | 幂等 Key 被用于不同请求 | 否 |
| 42901 | 429 | 请求过于频繁(限流) | 否 |
| 50001 | 502 | 解析失败(链接失效/已删除/风控) | 否 |
控制台「调用记录」会显示失败原因:不支持 / 需 Cookie / 风控 / 已删除 / 超时 / 签名失效等。
GET /api/v1/quota → {"balance_li":50000,"balance_yuan":50.0,"price_li":1,"remaining_calls":50000}
GET /api/v1/usage?days=7 → 今日/累计调用、成功、消费,及按天明细。
GET /api/v1/platforms(无需鉴权)→ 平台列表、状态、单价。
金额单位“厘”:1 元 = 1000 厘。
POST /api/v1/tasks body {"kind":"parse"|"transcript","url":"分享链接","webhook_url":"可选"} → 立即返回 {"task_id":"…","status":"queued"}。
GET /api/v1/tasks/{task_id} → status:queued / running / success / failed;成功时 result 与同步接口的 data 相同,cost_li 为实际扣费(失败不扣费)。GET /api/v1/tasks 分页列出自己的任务。
Webhook:任务结束后向 webhook_url(请求里指定,或控制台设置的账户默认地址)发送 POST,body 为 {"event":"task.success|task.failed","task":{…同 GET 返回…}}。非 2xx 或超时按 10s / 1min / 5min / 30min 重试。仅允许公网 http(s) 地址。
验签:请求头 X-Nowm-Timestamp、X-Nowm-Signature: sha256=…,签名 = HMAC_SHA256(webhook_secret, timestamp + "." + 原始 body),密钥在控制台「预警 / Webhook」。建议同时校验时间戳在 5 分钟内。
import hmac, hashlib, time
def verify(secret, headers, raw_body: bytes):
ts = headers["X-Nowm-Timestamp"]; sig = headers["X-Nowm-Signature"].split("=", 1)[1]
exp = hmac.new(secret.encode(), ts.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(sig, exp) and abs(time.time() - int(ts)) < 300GET/POST /api/v1/summary AI 摘要(目前免费):传 url,或 title + text(如转写文案);输出语言随 Accept-Language / ?lang=。也可在 /api/v1/parse 加 summary=1。返回 summary、provider、degraded(额度不足时为简版)。
POST /api/v1/transcript body {"url":"分享链接或音视频直链","language":"可选,如 zh / en","webhook_url":"可选"} → 返回 task_id(异步),用 GET /api/v1/tasks/{task_id} 取结果。
流程:先解析分享链接拿到音频/视频 → 下载 → 语音识别。结果字段:text 全文、segments(start/end/text)、duration 秒、language、engine、minutes_billed、platform、title。
计费:按音频分钟,不足 1 分钟按 1 分钟,成功才扣费。单条上限见服务端配置(默认 60 分钟 / 200MB)。
OpenAPI 3 规范:/openapi.json,Swagger UI:/swagger(运营方可关闭)。
轻量 SDK(零依赖,见源码 sdk/ 目录):
# Python(sdk/python/nowm.py,仅用标准库)
from nowm import Nowm
c = Nowm("YOUR_KEY", base="https://api.example.com")
d = c.parse("https://x.com/SpaceX/status/1732824684683784516")
print(d["video_url"], d["balance"], d["low_balance"])
t = c.transcript("分享链接", wait=True) # 异步任务 + 轮询
print(t["result"]["text"])
// JavaScript(sdk/js/nowm.mjs,Node 18+ / 浏览器,基于 fetch)
import { Nowm } from "./nowm.mjs";
const c = new Nowm("YOUR_KEY", { base: "https://api.example.com" });
const d = await c.parse("分享链接");请求头 Accept-Language(或 ?lang=)决定错误信息 msg 的语言,支持 zh-Hans, zh-Hant, en, ja, ko, de, fr, es, pt, ru, ar, hi, id, it,未识别时返回简体中文;code 不随语言变化,请以 code 判断。GET /api/v1/i18n 返回语言列表。
GET /api/v1/fx(免费、无需鉴权)→ 展示汇率(1 CNY = x 外币),支持 CNY, USD, EUR, GBP, JPY, KRW, HKD, AUD,每日更新,可手动覆盖。余额与扣费均按人民币厘结算,仅支持支付宝充值,外币仅为参考换算。
成功解析 ¥0.001 / 次,失败不扣费。按量付费,无月费,余额长期有效。
支付宝充值,最低 ¥50(≈ 50000 次)。个别平台单价以平台表为准。
登录后自动填充“在线调试”专用 Key(可在控制台禁用/删除)。
// 返回结果