超牛文档

开放 API · 远程 MCP

超牛的能力,AI Agent 直接调

让 Agent 处理真实文件:扫描增强、抠章、音频转文字、视频文案分析、旗舰生图,以及 PDF 读取、转换和编辑。REST 与远程 MCP 都能调用。

在 Claude Code 里接上,一条命令

claude mcp add --transport http chaoniu \
  https://chaoniudoc.com/mcp \
  --header "Authorization: Bearer $CHAONIU_KEY"
REST 基址
https://chaoniudoc.com/open/v1
远程 MCP
https://chaoniudoc.com/mcp
鉴权
Bearer cn_live_…
计费
按次 / 按时长扣点

01 — 差异

同一件事,两条完全不同的路

所有扫描类 App,能力都只长在手机界面上,每一步都要一个人在场。超牛把同样的能力做成了可调用的接口,调用方是程序。

手机 App 的做法

每一步都要人

  1. 打开 App人要在手机旁边
  2. 对准、拍照 / 选图一张一张来
  3. 点「增强」,等看着进度条
  4. 点「保存」/「导出」存到相册或文件
  5. 再手动传给下一个环节复制、发微信、上传系统

一份合同、一次会议,人要点十几次。量一上来就只能加人。

超牛的做法

Agent 自己跑完

  1. Agent 拿到原始文件邮箱附件 / 对象存储 / 对方发来的照片
  2. 调 enhance,照片变成扫描件找边、拉正、去阴影,视觉模型才读得准
  3. 调 seal/cutout,把公章抠出来验证有没有章、章是谁的
  4. 调 audio/transcriptions,录音变成带时间轴的文字长录音按任务号异步取
  5. 把结果喂给模型,继续往下走提风险条款、写纪要、入库、发通知

一次接入,之后一千份和一份一样,没有人点屏幕。

调用方

你的 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 原有可选文字,按页返回;扫描图片页不做 OCRpdf_base64、可选 pages
render_pdf_page把 PDF 指定页变为 JPEG 图片,交给视觉模型读取pdf_base64、可选 page
images_to_pdf将 1~10 张图片按顺序组成 PDFimages_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用正确密码解密 PDFpdf_base64、password
pdf_to_long_image / place_image_on_pdf / create_qr_codePDF 转长图、将签名或印章贴入 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_audio
get_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_imagegenerate_image、get_image_job、get_image_resultApp 同源任务,成功出图扣费以 App 实时报价为准
视频解析与文案拆解视频音频、口播文字、亮点与原创脚本骨架POST /open/v1/app/<工具名>extract_video_copy、get_video_job、analyze_video_copyApp 首条试用、重复复用及失败退款规则以 App 实时报价为准
音频文案分析与撰写POST /open/v1/app/<工具名>analyze_audio_copy、write_audio_scriptApp 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

超牛会员价格时长每期附带超牛次数
月卡¥1230 天100 次
季卡¥3290 天300 次
年卡¥115365 天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
同时持有的有效 Key5 把409 KEY_LIMIT,先吊销不用的
单图大小 / 像素8 MB / 4000 万像素413 TOO_LARGE(短边不小于 16 像素)
音频直传 / audio_url40 MB / 200 MB413 TOO_LARGE
单个音频时长1 秒 ~ 180 分钟413 AUDIO_TOO_LONG
一次同步调用的总期限160 秒客户端超时请设到 180 秒,不要更短
转写排队等待最长 30 分钟超过按失败退回(BUSY),点数全退

怎么拿 Key

  1. 先成为超牛会员。在超牛文档 App「我的 → 超牛会员」开通或续费。不是会员不能生成 Key;会员到期后已生成的 Key 立即停用(403 MEMBER_REQUIRED,Key 不会被删除),续费后原 Key 自动恢复,不用改代码。
  2. 买点数。在 App(安卓)或微信小程序「我的 → 超牛点数」用微信 / 支付宝 / 抖音支付购买。iPhone 请走微信小程序。
  3. 生成 Key。超牛文档安卓版「我的 → 开放 API」→ 新建 Key。同一页能看已有的 Key、吊销、看用量。需要安卓 2.3.40 及以上(App 内「我的 → 检查更新」可升)。
    iOS 的同一个页面已经做好,但 iOS 还在 TestFlight 测试、没上 App Store,所以暂时只有安卓能自助生成;微信小程序没有这个页面。手上只有 iPhone 的,先用安卓机或安卓模拟器生成一次 —— Key 跟账号绑定,在哪调用都一样。
  4. 把 Key 放服务器端。Key 形如 cn_live_xxxxxxxx…,明文只在生成时显示一次;丢了就吊销、再生成一把。每个账号最多同时持有 5 把有效 Key,每天最多新建 20 把。吊销立即生效,用这把 Key 的程序会收到 401 KEY_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_base64get_image_job 查状态;成功后 get_image_result 取 JPEG
视频解析与口播文字extract_video_copy:url、request_idget_video_job 取音频信息与完整文字稿
视频文案拆解analyze_video_copy:已有 job_id、request_idget_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_pdf1~10 张图片组成 PDFimages_base64
merge_pdfs2~3 份 PDF 合并pdfs_base64
extract_pdf_pages提取或调序最多 20 页pdf_base64、pages
compress_pdf无损重写 PDF;已压缩的文件不保证更小pdf_base64
encrypt_pdfAES-256 加密 PDFpdf_base64、password、可选 owner_password
decrypt_pdf使用正确密码解密 PDFpdf_base64、password
pdf_to_long_image最多 5 页 PDF 拼成长图 JPEGpdf_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 自己串完。

00 · 输入收到合同照片邮箱附件 / 对象存储
01 · 超牛拉正、去阴影,变成扫描件POST /enhance · 1 点
02 · 模型读正文、找不利条款视觉模型
03 · 超牛把公章抠出来核对POST /seal/cutout · 2 点
04 · 输出风险清单 + 章的证据图一页合计 3 点 ≈ ¥0.33
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。

00 · 输入会议录音落盘mp3 / m4a / 带音轨的 mp4
01 · 超牛提交转写,拿任务号POST /audio/transcriptions
02 · 超牛长轮询到终态GET …/<task_id>?wait=60
03 · 模型写纪要、提待办带 start_ms 回指原话
04 · 输出纪要 + 可追溯待办60 分钟 = 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 还能直接比对公司名,或者贴进你自己要出的归档文件。

00 · 输入一批来件照片执照 / 授权书 / 盖章页
01 · 超牛批量增强成扫描件POST /enhance · 每张 1 点
02 · 超牛试抠印章POST /seal/cutout · 每次 2 点
03 · 判定200 有章 / 422 无章422 不扣点
04 · 输出合规的入库,缺章的转人工每份 1 ~ 3 点
#!/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:只能抠章、不扣点,与会员和点数无关。

POST/open/v1/seal/cutout2 点 / 次

把一张带印章的照片发过来,返回透明底的印章 PNG。整页照片也可以,先裁到印章附近效果更好。

参数取值默认说明
effectrestore / clear / solidclearrestore 还原浓淡;clear 细字最清楚;solid 笔画填实
colororig / red / blue / blackorigorig 原色;red 公章红;blue 蓝;black 黑
cropauto / noneautoauto 裁到印章边缘;none 保持原图尺寸
responsebinary / jsonbinarybinary 正文直接是 PNG;json 返回 base64

参数写在 query、JSON 字段或 multipart 字段里都行。图片要求:JPEG / PNG / WebP,不超过 8 MB,不超过 4000 万像素,短边不小于 16 像素。

三种传图方式:

  1. 二进制正文(推荐):Content-Type: image/jpeg(或 image/png、image/webp),参数放 query。
  2. JSON:Content-Type: application/json,正文 {"image_base64": "…", "effect": "clear", "color": "red"},base64 可带 data:image/…;base64, 前缀。
  3. 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…"
}
POST/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。

POST/open/v1/audio/transcriptions1 点 / 5 分钟 · 异步
GET/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"}
参数取值默认说明
profileaccurate / fastaccurateaccurate 长录音优先准确;fast 短音频优先快
request_id字母数字与 _.:-,≤ 64 位无你自己的幂等号:同一账号下同号重复提交返回同一任务,不重复扣点
wait0 ~ 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)。

GET/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}}
HTTPcode含义与处理附加字段
400BAD_REQUEST参数缺失或取值不对,按 field / allowed 修正field、allowed
400UNSUPPORTED_IMAGE不是图片、格式不支持或已损坏,请换 JPEG / PNG / WebP
400UNSUPPORTED_AUDIO音频格式不支持、没有音轨或已损坏(不扣点)
400AUDIO_URL_UNAVAILABLEaudio_url 拉不下来(必须公网可直接下载)
401INVALID_KEYKey 缺失或无效
401KEY_REVOKEDKey 已被吊销,请在 App 里重新生成
402INSUFFICIENT_POINTSAPI 可用点数不足。去 App(安卓)或微信小程序「我的 → 超牛点数」购买;会员次数、苹果内购和赠送点数不能用need、api_points、quota_member、points_unusable
403MEMBER_REQUIRED不是有效会员。reason=none 从未开通,去 App「我的 → 超牛会员」开通;reason=expired 已到期,续费后原 Key 自动恢复reason、member_expired_at
403SCOPE_DENIED这把 Key 没有开通该能力(如内测 Key 调增强 / 转文字)
403FEATURE_UNAVAILABLE该能力对这把 Key 暂未开放
404NOT_FOUND路径不存在,或任务号不是这个账号的
405METHOD_NOT_ALLOWED请求方法不对(能力接口只接受 POST)
409CONFLICT这次调用的账需要核对,不会重复扣点,稍后重试或联系客服
409KEY_LIMIT有效 Key 已达 5 把,先吊销不用的max_keys
410EXPIRED文字稿已过期(只保留 24 小时)
413TOO_LARGE图片超过 8 MB / 4000 万像素,或音频超过 40 MB,压缩后重试
413AUDIO_TOO_LONG音频时长超过 180 分钟max_minutes、minutes
422NO_SEAL_FOUND图里没有找到印章,换更清楚、印章更大的图(不扣点)
429RATE_LIMITED请求太快,按 Retry-After 秒数等待后重试retry_after
429DAILY_LIMIT今日调用次数已达上限
429SAME_IMAGE_LIMIT同一张图 1 小时内调用超过 20 次,10 分钟后再试retry_after
429TOO_MANY_TASKS未完成的转文字任务已达 3 个,等完成再提交
429ASR_DAILY_MINUTES今日提交的音频分钟数已达上限daily_minutes、used_minutes
502PROCESSING_FAILED这一张图 / 这段音频处理失败,稍后重试,不扣点
503BUSY服务繁忙或排队超时,按 Retry-After 退避重试;转文字排队超时也回这个,点数已退回retry_after
500INTERNAL_ERROR服务暂时不可用,稍后重试

遇到 429 / 503 请按 Retry-After 退避重试;遇到 409 CONFLICT 稍后重试即可,不会重复扣点。 反馈问题请提供 X-Request-Id(或 JSON 里的 request_id)、调用时间和 HTTP 状态码。

数据说明

  • 图片我们只为本次处理而使用。抠章与增强的结果加密缓存 24 小时后自动删除(用于同图不重复扣点)。超牛增强会由我们委托的境内图像处理服务方(夸克)完成,你提交的图片会发给它处理;抠章在我们自己的服务器上完成。
  • PDF 文档工具在我们自己的服务器上处理,不写入 App 文件库、不长期保存 PDF、转换图片或提取出的文字;大请求在入口层可能短暂使用临时缓冲,请求结束后清理。
  • 音频只用于本次转文字:加密上传到我们在中国境内(广州)的服务器,由我们自己在中国境内(深圳)的服务器完成语音识别,不交给任何第三方语音识别厂商;任务结束后删除音频,只保留文字结果 24 小时,且只回给提交它的那个账号。
  • 用量记录只包含调用时间、接口与参数摘要、请求来源 IP、内容指纹(哈希)、图片尺寸、音频时长、耗时、结果和扣点,不保存图片或音频内容、不保存转写出来的文字。扣过点的记录长期保留用于对账,其余 180 天后删除。
  • 你注销超牛账号时,Key、调用缓存和暂存文件一并删除。
  • 上述内容我们自己一律不用于任何训练:不归集成数据集、不做人工标注、不用于训练或优化任何模型。上面点到的第三方服务方(夸克)收到数据后如何处理、是否用于它自己的模型训练,取决于它自身的条款,我们不代表它作出承诺。 音频转文字由我们自己在境内的服务器完成,不交给第三方。完整的服务方清单见《隐私政策》「六、信息的委托处理、共享与公开」第 1 项。

开发者接入条款(调用即视为同意)

本节是《用户协议》《隐私政策》针对开放 API 的补充,与之不一致的以本节为准。

  1. 你是调用方、也是数据处理者。你通过 API 提交的图片、音频和其他内容,由你决定提交什么、怎么使用返回结果。你应当确保:对这些内容享有必要权利或已获授权;已依法向你的终端用户作出告知并取得必要同意(包括把内容提交给我们处理、以及我们在中国境内处理和存储);不提交法律法规禁止的内容。
  2. 内容与用途由你负责。我们只按请求执行处理,不对提交内容和调用结果的合法性、准确性、完整性作审核或担保。你不得把 API 用于违法违规、侵害他人权益(含著作权、肖像权、隐私权、个人信息)或绕过本服务计费规则的用途。语音转文字、抠章等结果由算法生成,可能有错,用于对外场合前请自行核对。
  3. Key 由你保管。Key 等同于你的身份凭证,不得转借、转售、共享或写进客户端代码、前端页面、公开仓库。Key 泄露造成的调用和扣点由你承担;发现泄露请立即在 App 内作废并重新生成。
  4. 额度与计费。按实际调用扣点,规则见「能力与价格」一节;失败不扣、重试幂等。我们调整单价时只对调整后新发生的调用生效,不影响你已经购买的点数数量。
  5. 限流与可用性。我们按「限流与配额」一表限流,并保留为保障整体服务稳定而临时降速、排队或暂停某个 Key 的权利;我们不对 API 的不中断、无延迟作承诺。计划内维护会提前在本页说明。
  6. 我们可以停用的情形。发现违法违规内容、明显滥用(刷量、绕计费、压测生产)、Key 泄露或被他人使用、你的会员到期时,我们可以限制或停用相应 Key 并说明原因;因违法违规被停用的,已扣点数不退。
  7. 变更与终止。接口和本条款变更会在本页更新并标注日期;不兼容变更会提前至少 30 天在本页公告。你可以随时停止调用并作废 Key。
  8. 本条款更新日期: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。两边额度和计费是同一套,可以同时用。

超牛文档 · 开放 API | REST https://chaoniudoc.com/open/v1 | MCP https://chaoniudoc.com/mcp

运营主体:莱客(深圳)网络科技有限公司 | 问题反馈请在 App 内「联系客服」,并提供 X-Request-Id、调用时间与 HTTP 状态码。

超牛文档首页 | 价格与服务说明 | 本页更新 2026-11-10