01 — 差异
同一件事,两条完全不同的路
所有扫描类 App,能力都只长在手机界面上,每一步都要一个人在场。超牛把同样的能力做成了可调用的接口,调用方是程序。
手机 App 的做法
每一步都要人
- 打开 App人要在手机旁边
- 对准、拍照 / 选图一张一张来
- 点「增强」,等看着进度条
- 点「保存」/「导出」存到相册或文件
- 再手动传给下一个环节复制、发微信、上传系统
一份合同、一次会议,人要点十几次。量一上来就只能加人。
超牛的做法
Agent 自己跑完
- Agent 拿到原始文件邮箱附件 / 对象存储 / 对方发来的照片
- 调
enhance,照片变成扫描件找边、拉正、去阴影,视觉模型才读得准 - 调
seal/cutout,把公章抠出来验证有没有章、章是谁的 - 调
audio/transcriptions,录音变成带时间轴的文字长录音按任务号异步取 - 把结果喂给模型,继续往下走提风险条款、写纪要、入库、发通知
一次接入,之后一千份和一份一样,没有人点屏幕。
调用方
你的 Agent / 后端服务 Claude Code · 自建 Agent · 任务脚本凭证
一把超牛 Key cn_live_…接法 A · 零代码
远程 MCPPOST /mcp接法 B · 任意语言
RESTPOST /open/v1/…MCP 这条路不用写代码:在支持 MCP 的客户端里配一次,文件处理能力就成为模型可调用的工具。 REST 这条路给你的服务端用,任何能发 HTTP 请求的语言都行。两边的额度、单价、幂等规则完全一致。
02 — 最低门槛的接法
接上 MCP,不用写代码
MCP(Model Context Protocol)是 AI 客户端连外部工具的标准协议。超牛的 MCP 是远程服务,不用在本机装任何东西 —— 填一个地址加一把 Key 就行。
支持远程 MCP 的客户端
在客户端自己的 MCP 配置里加一项,地址加一个请求头:
例如 ~/.cursor/mcp.json、或客户端设置里的「自定义 MCP 服务器」
{
"mcpServers": {
"chaoniu": {
"url": "https://chaoniudoc.com/mcp",
"headers": { "Authorization": "Bearer cn_live_你的Key" }
}
}
}
只支持本地(stdio)MCP 的客户端
用官方的 mcp-remote 转一层,仍然是远程服务,本机不处理任何图片:
{
"mcpServers": {
"chaoniu": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://chaoniudoc.com/mcp",
"--header", "Authorization: Bearer cn_live_你的Key"]
}
}
}
配置文件的位置和字段名由客户端决定,上面两段是目前通行的写法,具体以你用的客户端文档为准。 协议细节:Streamable HTTP、无状态、只回 JSON(不用 SSE),支持协议版本 2025-06-18 / 2025-03-26 / 2024-11-05,不支持 JSON-RPC 批量请求。
配完能用的工具
| MCP 工具 | 模型能用它做什么 | 参数 |
|---|---|---|
enhance_image | 把拍歪、带阴影的文档照片变成找过边、拉正、增强后的扫描件(返回 JPEG + 结果 JSON) | image_base64 |
cutout_seal | 把照片里的印章抠成透明底 PNG(返回 PNG + 结果 JSON) | image_base64、effect、color、crop |
transcribe_audio | 提交一段录音或带音轨的视频去转文字,返回任务号(异步) | audio_base64 或 audio_url、profile、request_id、wait_seconds |
get_transcription | 按任务号取转写状态与文字稿(全文 + 每句起止时间) | task_id、wait_seconds |
get_balance | 查会员状态、API 可用点数、各能力当前单价、今日调用量 | 无 |
read_pdf | 读取 PDF 原有可选文字,按页返回;扫描图片页不做 OCR | pdf_base64、可选 pages |
render_pdf_page | 把 PDF 指定页变为 JPEG 图片,交给视觉模型读取 | pdf_base64、可选 page |
images_to_pdf | 将 1~10 张图片按顺序组成 PDF | images_base64 |
merge_pdfs | 将 2~3 份 PDF 按顺序合并 | pdfs_base64 |
extract_pdf_pages | 提取并调序 PDF 页面 | pdf_base64、pages |
compress_pdf | 无损重写并压缩 PDF 结构与资源 | pdf_base64 |
encrypt_pdf | 为 PDF 设置 AES-256 打开密码 | pdf_base64、password、可选 owner_password |
decrypt_pdf | 用正确密码解密 PDF | pdf_base64、password |
pdf_to_long_image / place_image_on_pdf / create_qr_code | PDF 转长图、将签名或印章贴入 PDF、生成二维码 | 详见 tools/list |
generate_image / get_image_job / get_image_result | 一句话生图或产品设计图;异步查询出图、扣费状态并下载成品 | prompt、request_id、可选参考图 |
extract_video_copy / get_video_job / analyze_video_copy | 解析视频、提取音频和口播文案,再拆解亮点与原创脚本骨架 | url、job_id、request_id |
analyze_audio_copy / write_audio_script | 分析转写后的音频文案,或按主题写原创口播稿 | transcript 或 topic |
get_app_prices | 查 App 生图、视频工具箱和 AI 助手的实时报价、试用及额度 | 无 |
工具调用的计费、24 小时同图 / 同音频不重复扣点的规则与 REST 完全一致,每次工具调用对应一条用量。出错时返回 isError: true 的文本结果,内容是「错误码:说明」。
转文字在 MCP 里也是异步的:先 transcribe_audio 拿 task_id,再 get_transcription(task_id, wait_seconds=60) 直到 done。重试时带同一个 request_id 不会重复扣点。音频 base64 走 MCP 的上限同样是 40 MB,更大的用 audio_url。
03 — 有什么服务,多少钱
能力清单与价目表
旧图像、音频接口按 API 可用点数收费;生图、视频解析与拆解沿用 App 的超牛次数与试用规则。程序里不要硬编码价格:旧能力查 GET /open/v1/me,App 同源能力查 GET /open/v1/app/capabilities。
| 能力 | 接口 | MCP 工具 | 计价 | 单价 |
|---|---|---|---|---|
| 超牛增强文档照片找边、拉正、去阴影,输出扫描件 JPEG | POST /open/v1/enhance |
enhance_image |
按张 · 同步 | 1 点 / 张≈ ¥0.11–0.17 |
| 抠印章照片里的印章抠成透明底 PNG,可选还原 / 清晰 / 实心与配色 | POST /open/v1/seal/cutout |
cutout_seal |
按次 · 同步 | 2 点 / 次≈ ¥0.22–0.34 |
| 音频转文字录音或带音轨的视频 → 全文 + 每句起止时间 | POST /open/v1/audio/transcriptions |
transcribe_audioget_transcription |
按时长,每 5 分钟一档 · 异步 | 1 点 / 5 分钟≈ ¥1.3–2.0 每小时 |
| 查余额与单价会员状态、API 可用点数、各能力当前单价、今日调用量 | GET /open/v1/me |
get_balance |
不计费 · 同步 | 0 点也不计入日限 |
| PDF 文档处理读取、转图、合并、提取、压缩、加解密、转长图、贴签章;另可生成二维码 | POST /open/v1/documents/<工具名> | 11 项文档工具,详见上表 | 会员 API 权益内 | 不扣点 |
| 旗舰生图一句话生图、产品设计图,可选参考图 | POST /open/v1/app/generate_image | generate_image、get_image_job、get_image_result | App 同源任务,成功出图扣费 | 以 App 实时报价为准 |
| 视频解析与文案拆解视频音频、口播文字、亮点与原创脚本骨架 | POST /open/v1/app/<工具名> | extract_video_copy、get_video_job、analyze_video_copy | App 首条试用、重复复用及失败退款规则 | 以 App 实时报价为准 |
| 音频文案分析与撰写 | POST /open/v1/app/<工具名> | analyze_audio_copy、write_audio_script | App AI 助手每日对话额度 | 查询当前额度 |
价格核对于 2026-11-07;音频转文字不足一档按一档算。人民币折算只是按点数包的单点均价换的参考区间,实际扣的是点数。
生图与视频能力使用 App 同一套任务、余额和实时价格;request_id 用于幂等重试,结果用相应的 get_*_job 查询。Agent 可将这些能力接入自己的文档工作流。
点数多少钱
在超牛文档 App(安卓)或微信小程序「我的 → 超牛点数」购买。点数永久有效,不过期。
| 点数包 | 价格 | 单点均价 | 按这个价,大约能做 |
|---|---|---|---|
| 34 点 | ¥5.8 | ¥0.171 / 点 | 34 张增强 · 17 次抠章 · 170 分钟转写 |
| 154 点 | ¥22.8 | ¥0.148 / 点 | 154 张增强 · 77 次抠章 · 770 分钟转写 |
| 500 点 | ¥56.9 | ¥0.114 / 点 | 500 张增强 · 250 次抠章 · 2500 分钟转写 |
| 自定义 50 ~ 1000 点 | ¥0.11 / 点 | ¥0.11 / 点 | 按需充,单点最便宜的一档 |
会员是门票:先得是会员,才能生成 Key
| 超牛会员 | 价格 | 时长 | 每期附带超牛次数 |
|---|---|---|---|
| 月卡 | ¥12 | 30 天 | 100 次 |
| 季卡 | ¥32 | 90 天 | 300 次 |
| 年卡 | ¥115 | 365 天 | 1200 次 |
两套计费口径,请先看所调的能力
抠章、超牛增强和开放音频转文字沿用原开放 API 点数规则:只扣用微信、支付宝、抖音支付购买的 API 可用点数。生图、视频解析及拆解则调用 App 原任务,直接按 App 的超牛次数、试用、复用和退款规则计费。以下限制只针对原开放点数接口:
- 会员每期附带的次数(上面表里的 100 / 300 / 1200 次)—— 原开放点数接口不能用;App 同源生图与视频工具可按 App 规则使用;
- 在 iPhone 上买的点数 —— 都属于苹果内购;
- 新用户赠送、邀请奖励、兑换码、客服补发得到的点数。
这些额度会在 GET /open/v1/me 里以 quota_member(会员次数)和 points_unusable(不可用点数)单独列出来,
提醒你这些额度不能用于原开放点数接口。该接口真正能扣的只有 api_points。
iPhone 用户若要调用原开放点数接口,请在微信小程序里购买点数。生图、视频的实际报价与试用状态请查 GET /open/v1/app/capabilities。
计费规则:什么时候扣、什么时候不扣
| 情况 | 扣不扣 | 说明 |
|---|---|---|
| 处理成功 | 扣 | 响应头 X-Charged(或 JSON 的 charged)是本次实际扣的点数 |
| 处理失败 | 不扣 | 图里没找到印章、格式不支持、上游处理失败、服务繁忙,全部不扣 |
| 点数不足 / 被限流 / 会员到期 | 不扣 | 请求直接被拒(402 / 429 / 403),不产生费用,也不计入日限 |
| 同一张图 24 小时内再调 | 不扣 | 按图片内容哈希判断。抠章换 effect / color / crop 参数算同一张图,也不再扣,直接返回结果(X-Cache: HIT、X-Charged: 0) |
| 同一段音频 24 小时内再提交 | 不扣 | 内容完全一致的音频返回同一个任务;也可以自己带 request_id 做幂等号 |
| 异步转文字:提交时 | 先预占 | 按音频实测时长预占点数(points_reserved),此时 charged 还是 0 |
| 异步转文字:转写成功 | 才真扣 | 终态 done 时 charged 是实扣点数,points_reserved 归 0 |
| 异步转文字:失败 / 排队超时 | 全额退回 | 终态 failed,预占的点数一点不留 |
| 重试 | 幂等,不重复扣 | 图走 24 小时同图窗口;音频走内容哈希或你带的 request_id |
查余额 GET /open/v1/me | 不扣 | 也不计入每日调用次数 |
点数不足返回 402 INSUFFICIENT_POINTS,响应里会写清本次需要几点、现在可用几点、账号里还有哪些 API 用不了的额度。
用量明细在超牛文档 App「我的 → 开放 API」查。
限流与配额
| 限制项 | 值 | 超了怎么样 |
|---|---|---|
| 每把 Key 的频率 | 2 次 / 秒 | 429 RATE_LIMITED,按 Retry-After 退避 |
| 每个账号的频率(所有 Key 合计) | 5 次 / 秒 | 同上 |
| 每把 Key 每天 | 2000 次 | 429 DAILY_LIMIT(北京时间自然日) |
| 每个账号每天 | 5000 次 | 同上 |
| 同一张图每小时 | 20 次 | 429 SAME_IMAGE_LIMIT,10 分钟后再试 |
| 同一账号同时未完成的转写任务 | 3 个 | 429 TOO_MANY_TASKS |
| 每个账号每天提交的音频时长 | 600 分钟 | 429 ASR_DAILY_MINUTES |
| 同时持有的有效 Key | 5 把 | 409 KEY_LIMIT,先吊销不用的 |
| 单图大小 / 像素 | 8 MB / 4000 万像素 | 413 TOO_LARGE(短边不小于 16 像素) |
音频直传 / audio_url | 40 MB / 200 MB | 413 TOO_LARGE |
| 单个音频时长 | 1 秒 ~ 180 分钟 | 413 AUDIO_TOO_LONG |
| 一次同步调用的总期限 | 160 秒 | 客户端超时请设到 180 秒,不要更短 |
| 转写排队等待 | 最长 30 分钟 | 超过按失败退回(BUSY),点数全退 |
怎么拿 Key
- 先成为超牛会员。在超牛文档 App「我的 → 超牛会员」开通或续费。不是会员不能生成 Key;会员到期后已生成的 Key 立即停用(403
MEMBER_REQUIRED,Key 不会被删除),续费后原 Key 自动恢复,不用改代码。 - 买点数。在 App(安卓)或微信小程序「我的 → 超牛点数」用微信 / 支付宝 / 抖音支付购买。iPhone 请走微信小程序。
- 生成 Key。超牛文档安卓版「我的 → 开放 API」→ 新建 Key。同一页能看已有的 Key、吊销、看用量。需要安卓 2.3.40 及以上(App 内「我的 → 检查更新」可升)。
iOS 的同一个页面已经做好,但 iOS 还在 TestFlight 测试、没上 App Store,所以暂时只有安卓能自助生成;微信小程序没有这个页面。手上只有 iPhone 的,先用安卓机或安卓模拟器生成一次 —— Key 跟账号绑定,在哪调用都一样。 - 把 Key 放服务器端。Key 形如
cn_live_xxxxxxxx…,明文只在生成时显示一次;丢了就吊销、再生成一把。每个账号最多同时持有 5 把有效 Key,每天最多新建 20 把。吊销立即生效,用这把 Key 的程序会收到 401KEY_REVOKED。
Key 等同于你的账号余额。只放在服务器的环境变量或密钥管理里,不要写进网页、小程序、App 安装包,也不要提交到代码仓库。开放 API 不返回 CORS 头,本来就不能从浏览器前端直接调。
App 同源能力 · REST 与 MCP
生图、视频与音频文案
先用 GET /open/v1/app/capabilities 或 MCP 的 get_app_prices 获取当前价格、试用状态与可用额度。生图、视频解析与拆解直接使用 App 的任务与账务:生成成功才扣生图次数,视频解析失败会退款,同一视频链接的复用规则也与 App 一致。Agent 重试时保持同一个 request_id。
| 任务 | 提交 | 取结果 |
|---|---|---|
| 一句话生图 / 产品设计图 | generate_image:prompt、request_id(UUID)、可选 kind、ratio、reference_images_base64 | get_image_job 查状态;成功后 get_image_result 取 JPEG |
| 视频解析与口播文字 | extract_video_copy:url、request_id | get_video_job 取音频信息与完整文字稿 |
| 视频文案拆解 | analyze_video_copy:已有 job_id、request_id | get_video_job 取亮点、借鉴角度与原创脚本骨架 |
| 音频文案 | 原始音频先交给 transcribe_audio;文字稿交给 analyze_audio_copy,或用 write_audio_script 撰写原创口播稿 | 分析与撰写走 App AI 助手每日对话额度 |
curl --fail-with-body https://chaoniudoc.com/open/v1/app/generate_image \
-H "Authorization: Bearer $CHAONIU_KEY" \
-H 'Content-Type: application/json' \
--data '{"prompt":"暖色调的咖啡馆产品海报","kind":"prompt_image","request_id":"a02d7f90-971b-42c5-882a-29d8c49806c1"}'
上述请求只演示参数;请先取得当前报价。结果是异步任务,使用返回的 id 调用 get_image_job。图片与视频处理仅用于你有权处理的内容。
文档处理 · REST 与 MCP
让 Agent 直接整理 PDF
十一项文档工具已开放给有效会员,属于会员 API 权益,目前不扣超牛点数;每次调用计入 Key 与账号的速率及日限。已有默认全能力正式 Key 可直接使用;内测 Key 与单独限权的 Key 不自动扩权。
| 工具 | 作用 | 输入 |
|---|---|---|
read_pdf | 读取原有可选文字,默认前 20 页,最多 5 万字 | pdf_base64、可选 pages |
render_pdf_page | 指定页转 JPEG,适合交给视觉模型 | pdf_base64、可选 page |
images_to_pdf | 1~10 张图片组成 PDF | images_base64 |
merge_pdfs | 2~3 份 PDF 合并 | pdfs_base64 |
extract_pdf_pages | 提取或调序最多 20 页 | pdf_base64、pages |
compress_pdf | 无损重写 PDF;已压缩的文件不保证更小 | pdf_base64 |
encrypt_pdf | AES-256 加密 PDF | pdf_base64、password、可选 owner_password |
decrypt_pdf | 使用正确密码解密 PDF | pdf_base64、password |
pdf_to_long_image | 最多 5 页 PDF 拼成长图 JPEG | pdf_base64、可选 pages |
place_image_on_pdf | 把透明签名或印章图贴入 PDF 指定页 | pdf_base64、image_base64、可选坐标 |
create_qr_code | 文字或链接生成 PNG 二维码 | text |
REST 地址为 POST /open/v1/documents/<工具名>,用 JSON 传 base64 字段;MCP 工具同名。PDF 单份最多 15 MB、100 页,图片单张最多 8 MB、2000 万像素,输出文件最多 20 MB。REST 整个 JSON 请求体上限 24 MB,MCP 上限 56 MB,合并大文件还须满足请求体上限。GET /open/v1/documents/capabilities 返回工具清单。
curl --fail-with-body https://chaoniudoc.com/open/v1/documents/read_pdf \
-H "Authorization: Bearer $CHAONIU_KEY" \
-H 'Content-Type: application/json' \
--data-binary @request.json
request.json 示例:{"pdf_base64":"JVBERi0...","pages":[1,2]}。图片扫描 PDF 可能没有可选文字,可用 render_pdf_page 转图片后交给视觉模型识别。
04 — 真实用法
三个 Agent 场景,每个都能直接跑
代码只依赖 requests 或 curl,把 CHAONIU_KEY 放进环境变量就能跑。每个场景都标了会扣多少点。
场景一 · 合同审查 agent
一张手机拍的合同照片,到一份带原文引用的风险清单
律师助理、甲方法务、投标团队手里的合同多半是别人用手机拍来发过来的:歪、有阴影、反光。直接丢给视觉模型,识别率掉得很厉害。先过一遍增强,再让模型读,同时把公章抠出来单独核 —— 这三步 Agent 自己串完。
import base64, os, requests
KEY, BASE = os.environ["CHAONIU_KEY"], "https://chaoniudoc.com/open/v1"
H = {"Authorization": f"Bearer {KEY}"}
def _check(r):
if r.status_code != 200:
e = r.json()["error"] # {"code","message","request_id",…}
raise RuntimeError(f'{e["code"]}: {e["message"]} (request_id={e["request_id"]})')
def enhance(path):
"""文档照片 → 找边、拉正、增强后的扫描件 JPEG(1 点 / 张)"""
r = requests.post(f"{BASE}/enhance", headers={**H, "Content-Type": "image/jpeg"},
data=open(path, "rb").read(), timeout=180)
_check(r)
print("增强扣点", r.headers["X-Charged"], "缓存", r.headers["X-Cache"])
return r.content
def cutout_seal(path):
"""照片里的印章 → 透明底 PNG(2 点 / 次);图里没有章返回 None,不扣点"""
r = requests.post(f"{BASE}/seal/cutout", params={"effect": "clear", "color": "orig"},
headers={**H, "Content-Type": "image/jpeg"},
data=open(path, "rb").read(), timeout=180)
if r.status_code == 422: # NO_SEAL_FOUND
return None
_check(r)
return r.content
page = enhance("合同_p1.jpg") # ① 歪的手机照 → 平整扫描件
stamp = cutout_seal("合同_p1.jpg") # ③ 同一张原图里把章抠出来
open("p1_scan.jpg", "wb").write(page)
if stamp:
open("p1_seal.png", "wb").write(stamp)
# ② 增强后的那张交给视觉模型读;换成你自己用的模型同理
from anthropic import Anthropic
msg = Anthropic().messages.create(
model="claude-sonnet-4-5", max_tokens=2000,
messages=[{"role": "user", "content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/jpeg",
"data": base64.b64encode(page).decode()}},
{"type": "text", "text": "这是一页合同扫描件。逐条列出对乙方不利的条款,"
"每条附原文引用;并说明落款处是否盖了章。"}]}])
print(msg.content[0].text)
print("本页是否检出印章:", bool(stamp))
同一张图 24 小时内重复调同一个能力不再扣点,所以上面这段重跑一遍是 0 点 —— 调试阶段不用心疼。
场景二 · 会议纪要 agent
一小时录音,自己变成带原话出处的纪要和待办
会议录音是模型最读不了的那种输入。超牛把它转成全文加每句起止时间,模型写出来的每条待办都能回指到录音的第几分钟 —— 这是「只给一段纯文本」做不到的。一小时录音 12 点,大约 ¥1.4。
import os, requests
KEY = os.environ["CHAONIU_KEY"]
ASR = "https://chaoniudoc.com/open/v1/audio/transcriptions"
H = {"Authorization": f"Bearer {KEY}"}
# ① 提交:直传音频二进制(≤ 40 MB)。更大的发 {"audio_url": "https://…"}(≤ 200 MB)
# request_id 是你自己的幂等号:同号重复提交返回同一个任务,不会重复扣点
r = requests.post(ASR, params={"profile": "accurate", "request_id": "meeting-20261107-01"},
headers={**H, "Content-Type": "audio/mpeg"},
data=open("meeting.mp3", "rb").read(), timeout=180)
r.raise_for_status() # 202 = 已排队,200 = 已完成(复用或 wait 期间完成)
t = r.json()
print(f'任务 {t["task_id"]} {t["minutes"]} 分钟 预占 {t["points_reserved"]} 点')
# ② 长轮询:一次最多等 60 秒,没到终态就再发一次。别空转快轮询,会撞 429
while t["status"] in ("queued", "processing"):
t = requests.get(f'{ASR}/{t["task_id"]}', params={"wait": 60}, headers=H, timeout=90).json()
if t["status"] == "failed":
raise RuntimeError(t["error"]["code"]) # 失败:预占的点数已全额退回,一点不扣
print("实扣", t["charged"], "点") # 成功才真扣
text = t["result"]["text"] # 全文,按句换行
segs = t["result"]["segments"] # [{"start_ms","end_ms","text"}, …]
# ③ 把带时间轴的稿子交给模型:要求每条待办注明出自第几分几秒
timeline = "\n".join(f'[{s["start_ms"]//60000:02d}:{s["start_ms"]//1000 % 60:02d}] {s["text"]}'
for s in segs)
print(timeline[:400])
# ask_your_model(f"下面是会议逐句稿,写纪要并列出待办,每条注明时间戳:\n{timeline}")
文字稿在服务端保留 24 小时(过期取结果返回 410 EXPIRED),音频转写完就删。转写速度约为音频时长的 1/15 ~ 1/10,
10 分钟录音通常 40 ~ 60 秒出结果 —— 请当成分钟级的后台任务做,不要卡在一个同步请求里等。
场景三 · 资质核验 agent
一批对方发来的执照、授权书,自动判断「盖没盖章」
招投标、渠道加盟、供应商入库,每天收一堆营业执照和盖章授权书的照片,人工第一件事就是看有没有章、章清不清楚。这一步完全可以交给 Agent:增强之后抠章,抠出来就是有章、抠不出来就转人工。抠出的透明底 PNG 还能直接比对公司名,或者贴进你自己要出的归档文件。
#!/usr/bin/env bash
# 用法:CHAONIU_KEY=cn_live_… ./verify.sh 来件/
set -euo pipefail
B=https://chaoniudoc.com/open/v1
A="Authorization: Bearer $CHAONIU_KEY"
mkdir -p 处理后
for f in "$1"/*.jpg; do
n=$(basename "$f" .jpg)
# ① 拉正 + 去阴影,拿到能读字的扫描件(1 点)
# 用状态码判定:curl 的 --fail-with-body 会把错误 JSON 写进 -o 的文件,所以一律自己查
code=$(curl -sS -X POST "$B/enhance" \
-H "$A" -H "Content-Type: image/jpeg" --data-binary @"$f" \
-o "处理后/$n-scan.jpg" -w '%{http_code}')
if [ "$code" != 200 ]; then
echo "$n 增强失败 $code:$(cat "处理后/$n-scan.jpg")"; rm -f "处理后/$n-scan.jpg"; continue
fi
# ② 试抠印章(2 点)。同样按状态码判定
code=$(curl -sS -X POST "$B/seal/cutout?effect=clear&color=orig" \
-H "$A" -H "Content-Type: image/jpeg" --data-binary @"$f" \
-o "处理后/$n-seal.png" -w '%{http_code}')
case "$code" in
200) echo "$n 有章 → 处理后/$n-seal.png" ;;
422) rm -f "处理后/$n-seal.png"; echo "$n 未检出印章(NO_SEAL_FOUND,不扣点)→ 转人工" ;;
402) rm -f "处理后/$n-seal.png"; echo "$n 点数不足,先去充点数"; exit 1 ;;
*) echo "$n 失败 $code:$(cat "处理后/$n-seal.png")"; rm -f "处理后/$n-seal.png" ;;
esac
done
批量跑的时候注意两道闸:每把 Key 2 次 / 秒、每天 2000 次。并发多路建议一路一把 Key(每个账号最多 5 把),谁超了只影响自己那一路,排查也容易。
还能这么串
报销单据归档 agent
收到一堆发票照片 → enhance 成扫描件 → 视觉模型抽金额、开票方、日期 → 写进台账,原图和扫描件一并归档。
播客 / 访谈内容再利用 agent
audio_url 直接给音频地址 → 转成带时间轴的文字稿 → 模型切片成社媒文案、章节目录、金句卡,每段都带原音时间点。
存量纸质档案数字化 agent
翻拍的历史档案批量 enhance → 模型抽关键字段 → 落库成可检索档案;盖章页另抠一张章的 PNG 当凭证。
客服工单补证 agent
用户在工单里甩来一张糊照 → enhance 让字能看清 → 模型判断材料是否齐全 → 不齐的自动回话要缺的那一项。
05 — 接口文档
完整参数与返回
所有接口都在 chaoniudoc.com 上。早期接入时用的旧基址仍然可用、不会停,已经接好的程序不用改;新接入一律用这里写的地址。
鉴权
每个请求带一个头:
Authorization: Bearer <你的 Key>
Key 缺失或格式不对返回 401 INVALID_KEY。开放 API 不返回 CORS 头,不能从浏览器前端直接调用。
以 cn_beta_ 开头的是我们手动签发的内测 Key:只能抠章、不扣点,与会员和点数无关。
/open/v1/seal/cutout2 点 / 次把一张带印章的照片发过来,返回透明底的印章 PNG。整页照片也可以,先裁到印章附近效果更好。
| 参数 | 取值 | 默认 | 说明 |
|---|---|---|---|
effect | restore / clear / solid | clear | restore 还原浓淡;clear 细字最清楚;solid 笔画填实 |
color | orig / red / blue / black | orig | orig 原色;red 公章红;blue 蓝;black 黑 |
crop | auto / none | auto | auto 裁到印章边缘;none 保持原图尺寸 |
response | binary / json | binary | binary 正文直接是 PNG;json 返回 base64 |
参数写在 query、JSON 字段或 multipart 字段里都行。图片要求:JPEG / PNG / WebP,不超过 8 MB,不超过 4000 万像素,短边不小于 16 像素。
三种传图方式:
- 二进制正文(推荐):
Content-Type: image/jpeg(或 image/png、image/webp),参数放 query。 - JSON:
Content-Type: application/json,正文{"image_base64": "…", "effect": "clear", "color": "red"},base64 可带data:image/…;base64,前缀。 - multipart/form-data:图片字段名
file(或image),参数作为普通字段。
curl --fail-with-body -X POST "https://chaoniudoc.com/open/v1/seal/cutout?effect=clear&color=red" \
-H "Authorization: Bearer $CHAONIU_KEY" \
-H "Content-Type: image/jpeg" \
--data-binary @./photo.jpg \
-o seal.png
--fail-with-body:HTTP 状态码 ≥ 400 时 curl 以非零码退出(401 是 22),并且会把错误 JSON 写进 -o 指定的文件 —— 所以一定要判断退出码,别把错误当图片用。
想让失败时干脆不落文件,把它换成 -f(代价是看不到错误正文);要同时拿到状态码和正文,用「资质核验 agent」里 -w '%{http_code}' 的写法。
成功响应 HTTP 200,正文为 PNG;响应头 X-Request-Id(请求号)、X-Cache(HIT = 24 小时内同图结果,MISS = 新处理)、X-Charged(本次扣点数)。response=json 时:
{
"request_id": "req_3f9c…",
"width": 685, "height": 682,
"effect": "clear", "color": "red", "crop": "auto",
"cached": false, "charged": 2, "format": "png",
"image_base64": "iVBORw0KGgo…"
}
/open/v1/enhance1 点 / 张对单张文档照片自动找边、拉正并增强,返回 JPEG。传图方式、response 参数、响应头与抠章相同(没有 effect / color / crop)。
curl --fail-with-body -X POST "https://chaoniudoc.com/open/v1/enhance" \
-H "Authorization: Bearer $CHAONIU_KEY" \
-H "Content-Type: image/jpeg" \
--data-binary @./page.jpg \
-o enhanced.jpg
response=json 时字段同抠章,format 为 jpeg。
/open/v1/audio/transcriptions1 点 / 5 分钟 · 异步/open/v1/audio/transcriptions/<task_id>把一段音频(或带音轨的视频)转成文字稿,带每句的起止时间。转写是异步的:提交拿到任务号,再查结果;短音频可以在提交时带 wait 等结果直接返回。
- 支持 mp3 / m4a / aac / wav / ogg / flac / amr 等,以及带音轨的 mp4 等视频;单文件时长 1 秒 ~ 180 分钟。
- 文字稿保留 24 小时(过期取结果返回 410
EXPIRED);音频转写完就删,服务端不留。 - 文字稿只回给调用方本人,不经人工或机器审核。请确保音频来源合法、已取得相关方授权,并对文字稿的使用与传播负责。
提交
三种传法:直接发音频二进制(≤ 40 MB,参数放 query)、multipart/form-data(音频字段名 file)、或 JSON(audio_base64 与 audio_url 二选一):
{"audio_base64": "…", "profile": "accurate", "request_id": "job-20261107-1", "wait": 30}
{"audio_url": "https://example.com/podcast.mp3", "profile": "fast"}
| 参数 | 取值 | 默认 | 说明 |
|---|---|---|---|
profile | accurate / fast | accurate | accurate 长录音优先准确;fast 短音频优先快 |
request_id | 字母数字与 _.:-,≤ 64 位 | 无 | 你自己的幂等号:同一账号下同号重复提交返回同一任务,不重复扣点 |
wait | 0 ~ 60(秒) | 0 | 提交后最多等这么久,期间转写完成就直接返回 done 和文字稿 |
audio_url | 公网可直接下载的地址(≤ 200 MB) | 无 | 与音频体 / audio_base64 二选一,由服务端拉取 |
返回 202(排队 / 处理中)或 200(复用已完成的任务,或 wait 期间完成):
{
"task_id": "tr_9f2c…",
"status": "queued",
"duration_ms": 61000,
"minutes": 2,
"profile": "accurate",
"points_reserved": 1,
"charged": 0,
"created_at": 1762400000,
"queue_position": 1,
"eta_seconds": 14
}
取结果
wait(0 ~ 60 秒)可选,长轮询:到终态立刻返回。只能查自己账号提交的任务。
{
"task_id": "tr_9f2c…",
"status": "done",
"duration_ms": 61000, "minutes": 2,
"points_reserved": 0, "charged": 1,
"expires_at": 1762486400,
"result": {
"text": "大家好,今天我们讨论一下下个月的产品价格。\n价格定在九十九元。",
"segments": [
{"start_ms": 0, "end_ms": 20000, "text": "大家好,今天我们讨论一下下个月的产品价格。"},
{"start_ms": 20000, "end_ms": 40000, "text": "价格定在九十九元。"}
],
"duration_ms": 61000
}
}
status | 含义 |
|---|---|
queued | 排队中,带 queue_position(前面还有几个)和 eta_seconds(粗估,仅供参考) |
processing | 正在转写 |
done | 完成;result.text 为全文(按句换行),result.segments 为分句时间轴,charged 为实扣点数 |
failed | 失败,error.code 说明原因,预占的点数已全部退回 |
轮询建议:先用 wait=60 长轮询,没到终态就再发一次;不要空转快轮询(会撞 429)。
/open/v1/me不计费带 Key 调用,返回这把 Key 对应账号的状态,不扣点、不计入日限。程序里的单价一律从这里取,不要硬编码。
{
"key": "cn_live_abcd…", "beta": false,
"today_calls": 12, "daily_limit": 2000,
"member_active": true, "member_type": "year", "member_expired_at": 1799999999,
"api_points": 37, "quota_member": 1180, "points_unusable": 20,
"price_points": {"cutout_seal": 2, "enhance_image": 1},
"asr_price": {"unit_min": 5, "points_per_unit": 1,
"note": "音频转文字:时长向上取整到整分钟,每 5 分钟 1 点(不足 5 分钟按 5 分钟)"}
}
member_expired_at:会员到期时刻(Unix 秒)。会员有效时是将来的时间;已过期是过去的时间;从未开通为 0。api_points:API 可用点数。quota_member:会员次数,points_unusable:苹果内购 / 赠送等点数 —— 这两项 API 都不能用,只是提醒你账号里还有这些额度。price_points:按次计费的能力当前单价(点 / 次)。asr_price:音频转文字的单价(每unit_min分钟points_per_unit点)。新能力开放时会先出现在这里。- 内测 Key(
cn_beta_)只返回key、beta、today_calls、daily_limit和note,没有会员与点数字段。
错误码
出错时 HTTP 状态码非 2xx,正文为 JSON。message 是可直接展示给用户的中文说明,已写明原因和下一步;部分错误带附加字段。
{"error": {"code": "INSUFFICIENT_POINTS",
"message": "API 可用点数不足:本次需 2 点,当前可用 0 点;账号里的会员次数 100 次不能用于 API。…",
"request_id": "req_…", "need": 2, "api_points": 0, "quota_member": 100, "points_unusable": 0}}
| HTTP | code | 含义与处理 | 附加字段 |
|---|---|---|---|
| 400 | BAD_REQUEST | 参数缺失或取值不对,按 field / allowed 修正 | field、allowed |
| 400 | UNSUPPORTED_IMAGE | 不是图片、格式不支持或已损坏,请换 JPEG / PNG / WebP | |
| 400 | UNSUPPORTED_AUDIO | 音频格式不支持、没有音轨或已损坏(不扣点) | |
| 400 | AUDIO_URL_UNAVAILABLE | audio_url 拉不下来(必须公网可直接下载) | |
| 401 | INVALID_KEY | Key 缺失或无效 | |
| 401 | KEY_REVOKED | Key 已被吊销,请在 App 里重新生成 | |
| 402 | INSUFFICIENT_POINTS | API 可用点数不足。去 App(安卓)或微信小程序「我的 → 超牛点数」购买;会员次数、苹果内购和赠送点数不能用 | need、api_points、quota_member、points_unusable |
| 403 | MEMBER_REQUIRED | 不是有效会员。reason=none 从未开通,去 App「我的 → 超牛会员」开通;reason=expired 已到期,续费后原 Key 自动恢复 | reason、member_expired_at |
| 403 | SCOPE_DENIED | 这把 Key 没有开通该能力(如内测 Key 调增强 / 转文字) | |
| 403 | FEATURE_UNAVAILABLE | 该能力对这把 Key 暂未开放 | |
| 404 | NOT_FOUND | 路径不存在,或任务号不是这个账号的 | |
| 405 | METHOD_NOT_ALLOWED | 请求方法不对(能力接口只接受 POST) | |
| 409 | CONFLICT | 这次调用的账需要核对,不会重复扣点,稍后重试或联系客服 | |
| 409 | KEY_LIMIT | 有效 Key 已达 5 把,先吊销不用的 | max_keys |
| 410 | EXPIRED | 文字稿已过期(只保留 24 小时) | |
| 413 | TOO_LARGE | 图片超过 8 MB / 4000 万像素,或音频超过 40 MB,压缩后重试 | |
| 413 | AUDIO_TOO_LONG | 音频时长超过 180 分钟 | max_minutes、minutes |
| 422 | NO_SEAL_FOUND | 图里没有找到印章,换更清楚、印章更大的图(不扣点) | |
| 429 | RATE_LIMITED | 请求太快,按 Retry-After 秒数等待后重试 | retry_after |
| 429 | DAILY_LIMIT | 今日调用次数已达上限 | |
| 429 | SAME_IMAGE_LIMIT | 同一张图 1 小时内调用超过 20 次,10 分钟后再试 | retry_after |
| 429 | TOO_MANY_TASKS | 未完成的转文字任务已达 3 个,等完成再提交 | |
| 429 | ASR_DAILY_MINUTES | 今日提交的音频分钟数已达上限 | daily_minutes、used_minutes |
| 502 | PROCESSING_FAILED | 这一张图 / 这段音频处理失败,稍后重试,不扣点 | |
| 503 | BUSY | 服务繁忙或排队超时,按 Retry-After 退避重试;转文字排队超时也回这个,点数已退回 | retry_after |
| 500 | INTERNAL_ERROR | 服务暂时不可用,稍后重试 |
遇到 429 / 503 请按 Retry-After 退避重试;遇到 409 CONFLICT 稍后重试即可,不会重复扣点。
反馈问题请提供 X-Request-Id(或 JSON 里的 request_id)、调用时间和 HTTP 状态码。
数据说明
- 图片我们只为本次处理而使用。抠章与增强的结果加密缓存 24 小时后自动删除(用于同图不重复扣点)。超牛增强会由我们委托的境内图像处理服务方(夸克)完成,你提交的图片会发给它处理;抠章在我们自己的服务器上完成。
- PDF 文档工具在我们自己的服务器上处理,不写入 App 文件库、不长期保存 PDF、转换图片或提取出的文字;大请求在入口层可能短暂使用临时缓冲,请求结束后清理。
- 音频只用于本次转文字:加密上传到我们在中国境内(广州)的服务器,由我们自己在中国境内(深圳)的服务器完成语音识别,不交给任何第三方语音识别厂商;任务结束后删除音频,只保留文字结果 24 小时,且只回给提交它的那个账号。
- 用量记录只包含调用时间、接口与参数摘要、请求来源 IP、内容指纹(哈希)、图片尺寸、音频时长、耗时、结果和扣点,不保存图片或音频内容、不保存转写出来的文字。扣过点的记录长期保留用于对账,其余 180 天后删除。
- 你注销超牛账号时,Key、调用缓存和暂存文件一并删除。
- 上述内容我们自己一律不用于任何训练:不归集成数据集、不做人工标注、不用于训练或优化任何模型。上面点到的第三方服务方(夸克)收到数据后如何处理、是否用于它自己的模型训练,取决于它自身的条款,我们不代表它作出承诺。 音频转文字由我们自己在境内的服务器完成,不交给第三方。完整的服务方清单见《隐私政策》「六、信息的委托处理、共享与公开」第 1 项。
开发者接入条款(调用即视为同意)
本节是《用户协议》《隐私政策》针对开放 API 的补充,与之不一致的以本节为准。
- 你是调用方、也是数据处理者。你通过 API 提交的图片、音频和其他内容,由你决定提交什么、怎么使用返回结果。你应当确保:对这些内容享有必要权利或已获授权;已依法向你的终端用户作出告知并取得必要同意(包括把内容提交给我们处理、以及我们在中国境内处理和存储);不提交法律法规禁止的内容。
- 内容与用途由你负责。我们只按请求执行处理,不对提交内容和调用结果的合法性、准确性、完整性作审核或担保。你不得把 API 用于违法违规、侵害他人权益(含著作权、肖像权、隐私权、个人信息)或绕过本服务计费规则的用途。语音转文字、抠章等结果由算法生成,可能有错,用于对外场合前请自行核对。
- Key 由你保管。Key 等同于你的身份凭证,不得转借、转售、共享或写进客户端代码、前端页面、公开仓库。Key 泄露造成的调用和扣点由你承担;发现泄露请立即在 App 内作废并重新生成。
- 额度与计费。按实际调用扣点,规则见「能力与价格」一节;失败不扣、重试幂等。我们调整单价时只对调整后新发生的调用生效,不影响你已经购买的点数数量。
- 限流与可用性。我们按「限流与配额」一表限流,并保留为保障整体服务稳定而临时降速、排队或暂停某个 Key 的权利;我们不对 API 的不中断、无延迟作承诺。计划内维护会提前在本页说明。
- 我们可以停用的情形。发现违法违规内容、明显滥用(刷量、绕计费、压测生产)、Key 泄露或被他人使用、你的会员到期时,我们可以限制或停用相应 Key 并说明原因;因违法违规被停用的,已扣点数不退。
- 变更与终止。接口和本条款变更会在本页更新并标注日期;不兼容变更会提前至少 30 天在本页公告。你可以随时停止调用并作废 Key。
- 本条款更新日期:2026 年 11 月 6 日。运营主体:莱客(深圳)网络科技有限公司。问题请在 App 内「联系客服」。
06 — 常见问题
踩过的坑都在这儿
- 我是会员,为什么返回 402 点数不足?
- 如果调用的是抠章、超牛增强或开放音频转文字,这些接口只扣 API 可用点数,不使用会员次数。生图和视频工具则按 App 余额与试用规则执行;先查
GET /open/v1/app/capabilities。 - 我买过点数,为什么
api_points是 0? - 在 iPhone 上买的点数属于苹果内购,赠送 / 邀请 / 兑换码得到的点数也不行,这些都算在
points_unusable里。请在微信小程序或安卓 App 里用微信 / 支付宝 / 抖音支付购买。 - 有没有免费试用额度?
- 原开放点数接口没有额外试用;视频解析的首条试用沿用 App 规则。先查
GET /open/v1/app/capabilities获取当前试用状态与报价。 - 昨天还能用,今天全是 403?
- 多半是会员到期了(响应里
reason=expired,member_expired_at是到期时刻)。续费后原 Key 立即恢复,不用改代码。 - 同一张图改了颜色再调一次,扣点吗?
- 不扣。24 小时内同一张图不论换什么参数都只扣一次。
- 可以在网页前端直接调吗?
- 不可以。Key 等同于你的账号余额,只能放服务器端;接口也不返回 CORS 头。
- 转文字能同步等结果吗?
- 短音频可以:提交时带
wait(≤ 60 秒),转完就直接返回文字稿。长录音不行,必须按任务号轮询 —— 10 分钟音频通常 40 ~ 60 秒,三小时的就得几分钟到十几分钟,高峰还要排队。 - 几个 agent 共用一把 Key 可以吗?
- 可以,额度是按账号算的。但每把 Key 每秒 2 次、每天 2000 次,多路并发建议一路一把(每个账号最多 5 把),谁超了只影响自己那一路,排查也容易。
- MCP 和 REST 该用哪个?
- 让模型自己决定什么时候调用、用在对话或 Agent 循环里 → MCP,配一次就行。要在自己的后端流程里稳定地批量跑、做重试和落库 → REST。两边额度和计费是同一套,可以同时用。