API 接入文档
从认证到文件交付:查询请求路径、参数、响应结构与错误处理。
申请与认证
发送邮件说明项目、已验证 iSomor 账号邮箱、文档场景和预计用量,我们会尽快回复审核结果。审核通过后,一次提供调用凭证、基础地址和免费额度,无需再次创建 Key。每次请求携带 Authorization: Bearer <API_KEY>。凭证只放服务端环境变量,不放 Cookie、URL、前端或 AI 提示词;撤销和轮换请联系支持邮箱,不发送完整 Key。
下方命令设置正式 ISOMOR_API_BASE_URL(含 /api/isomor/v1 前缀,无末尾斜杠)。通过服务端的秘密管理工具设置 ISOMOR_API_KEY,不将真实凭证写进命令历史或代码。下方 curl 示例读取这两个环境变量,未设置时会提示补充。JSON 请求使用 Content-Type: application/json;上传使用 multipart/form-data,由 HTTP 客户端生成 boundary。响应格式为 JSON,HTTP 状态码用于区分成功与错误。
export ISOMOR_API_BASE_URL="https://tryisomor.com/api/isomor/v1"调用顺序
查询能力 → 上传 PDF → 将返回的 id 用作 file_id → 创建任务并保存 job_id → 查询状态 → 获取下载链接。创建前可查询额度,但查询余额不等于预留额度。请求失败时按下方幂等和重试规则处理,避免重复创建任务。
下载与快速开始
可将 OpenAPI 文件导入支持该格式的开发工具,其中 baseUrl 已默认配置正式 API 地址。Python 示例适用于 Python 3.10 及以上,无需安装第三方依赖;运行前按上方说明配置两个环境变量。
以下命令只翻译第 1 页,最多使用 1 积分,获取译文和双语 PDF。--submit 会上传文件并提交翻译;不带 --submit 或 --resume 时不会发请求。若调整页段,请同时确认 --max-credits 上限;预计超出上限时只完成上传,不创建翻译。
python3 translate_pdf.py \
--file ./sample.pdf --target zh --pages 1 \
--max-credits 1 --output ./translation-001 --submit中断后继续同一任务
保留输出目录,使用同一项目的凭证恢复。示例保存原请求和幂等键,已知任务只查询、不重新创建;受理结果不明且超过安全重试窗口时停止。已保存且摘要一致的文件会跳过,过期下载链接会重新获取。默认每次最多等待 600 秒,可用 --timeout 调整至最多 3600 秒。
python3 translate_pdf.py --output ./translation-001 --resume输出目录包含私有 PDF 和 state.json 恢复信息,不要提交到 Git 或公开分享。凭证不会写入状态文件,也不会发送到文件下载地址。示例不会覆盖已有文件;没有成功返回文件 ID 的上传不自动重试。
/capabilities查询能力与限制
接入前读取支持的语言、输出格式及该凭证的限制。具体限制以接口返回值为准。
所需权限: capabilities:read
请求参数
无路径、查询或请求体参数;仍需 Bearer 认证。
请求示例
: "${ISOMOR_API_BASE_URL:?Set ISOMOR_API_BASE_URL}" &&
: "${ISOMOR_API_KEY:?Set ISOMOR_API_KEY}" &&
curl --request GET "${ISOMOR_API_BASE_URL}/capabilities" \
--header "Authorization: Bearer ${ISOMOR_API_KEY}"响应字段
source_languages / target_languagesstring[]- 可用语言代码;auto 仅用于源语言。
input_mime_types / output_formatsstring[]- 首期仅文字 PDF;输出 translated 或 bilingual。
credits_per_pageinteger- 每页文字 PDF 消耗的积分数。
limitsobject- max_file_bytes、max_pages、max_concurrent_jobs、requests_per_minute 均为正整数;max_storage_bytes 为源文件与选页副本合计的输入存储额度。以实际响应为准。
200 · 响应示例
{
"source_languages": [
"auto",
"en",
"zh"
],
"target_languages": [
"en",
"zh"
],
"input_mime_types": [
"application/pdf"
],
"credits_per_page": 1,
"output_formats": [
"translated",
"bilingual"
],
"limits": {
"max_file_bytes": 10485760,
"max_pages": 20,
"max_concurrent_jobs": 1,
"requests_per_minute": 30,
"max_storage_bytes": 104857600
}
}/files上传 PDF
上传单个 PDF,校验通过后返回文件 ID(响应字段 id),创建任务时传给 file_id。此操作不启动翻译;每次上传会创建独立文件记录。
所需权限: files:write · multipart/form-data
请求参数
filebinary · required- 本地 PDF 文件的二进制内容,不接受本地路径字符串或远程 URL;需可提取文字且未加密。
请求示例
: "${ISOMOR_API_BASE_URL:?Set ISOMOR_API_BASE_URL}" &&
: "${ISOMOR_API_KEY:?Set ISOMOR_API_KEY}" &&
curl --request POST "${ISOMOR_API_BASE_URL}/files" \
--header "Authorization: Bearer ${ISOMOR_API_KEY}" \
--form 'file=@./sample.pdf;type=application/pdf'响应字段
idstring- 不透明的文件 ID,归属于该接入身份;创建任务时传给 file_id。
filename / media_typestring- 规范化后的安全文件名及 application/pdf。
page_countinteger- 校验后的总页数,大于 0。
201 · 响应示例
{
"id": "file_example",
"filename": "sample.pdf",
"media_type": "application/pdf",
"page_count": 3
}/translations创建翻译任务
校验文件、语言、页段与额度后异步入队。202 只表示任务已接收,不表示翻译完成。必须携带 Idempotency-Key,重试沿用同一值。
所需权限: translations:write · application/json
请求参数
file_idstring · required- 本凭证所属接入身份上传的文件 ID。
target_languagestring · required- 目标语言代码,取自 /capabilities;不能使用 auto。
source_languagestring · optional- 源语言代码,默认 auto 自动识别。
pagesstring · optional- 省略表示全文;例如 1-3,5,页码从 1 开始、含端点、不能超出总页数,重复页只计一次;输出仅含选定页,按原文顺序排列。
output_formatsstring[] · optional- 非空、去重的格式列表:translated / bilingual;默认两种都输出。
请求示例
: "${ISOMOR_API_BASE_URL:?Set ISOMOR_API_BASE_URL}" &&
: "${ISOMOR_API_KEY:?Set ISOMOR_API_KEY}" &&
curl --request POST "${ISOMOR_API_BASE_URL}/translations" \
--header "Authorization: Bearer ${ISOMOR_API_KEY}" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example-request-001' \
--data '{
"file_id": "file_example",
"target_language": "zh",
"source_language": "en",
"pages": "1-3",
"output_formats": [
"translated",
"bilingual"
]
}'响应字段
id / file_idstring- 任务 ID 与来源文件 ID;保存任务 ID 用于后续查询。
statusstring- 首次接收为 queued;幂等重放可能返回任务当前状态。
202 · 响应示例
{
"id": "job_example",
"file_id": "file_example",
"status": "queued"
}/translations/{job_id}查询任务状态
按持久化任务 ID 查询,可重复读取。queued / running 时遵循 Retry-After 响应头的秒数轮询;succeeded 后取结果,failed 时停止轮询并读取 error。
所需权限: translations:read
请求参数
job_idpath · required- 创建接口返回的任务 ID;不是 file_id。
请求示例
: "${ISOMOR_API_BASE_URL:?Set ISOMOR_API_BASE_URL}" &&
: "${ISOMOR_API_KEY:?Set ISOMOR_API_KEY}" &&
curl --request GET "${ISOMOR_API_BASE_URL}/translations/job_example" \
--header "Authorization: Bearer ${ISOMOR_API_KEY}"响应字段
id / file_idstring- 任务及来源文件 ID。
statusenum- queued → running → succeeded 或 failed。succeeded 表示结果已就绪;未提供取消端点。
errorobject | null- 非失败状态为 null;失败时包含 code 和 message,不返回内部堆栈或用户内容。
200 · 响应示例
{
"id": "job_example",
"file_id": "file_example",
"status": "succeeded",
"error": null
}/translations/{job_id}/results获取结果文件
仅任务 succeeded 后获取。未就绪返回 409 result_not_ready;失败任务返回 409 job_failed。链接过期后重新请求本接口,不要重新创建翻译。
所需权限: translations:read
请求参数
job_idpath · required- 本人接入身份的已完成任务 ID。
请求示例
: "${ISOMOR_API_BASE_URL:?Set ISOMOR_API_BASE_URL}" &&
: "${ISOMOR_API_KEY:?Set ISOMOR_API_KEY}" &&
curl --request GET "${ISOMOR_API_BASE_URL}/translations/job_example/results" \
--header "Authorization: Bearer ${ISOMOR_API_KEY}"响应字段
job_idstring- 该结果所属的任务。
files[].formatenum- translated 或 bilingual,与创建时请求的格式一致。
files[].urlstring · URI- 受控的临时 HTTPS 下载链接;属于敏感访问材料,不写入日志。
files[].expires_atstring · date-time- 链接失效时间,RFC 3339 UTC;失效前下载并妥善保存。
200 · 响应示例
{
"job_id": "job_example",
"files": [
{
"format": "translated",
"url": "https://example.com/results/translated.pdf",
"expires_at": "2026-09-10T12:00:00Z"
},
{
"format": "bilingual",
"url": "https://example.com/results/bilingual.pdf",
"expires_at": "2026-09-10T12:00:00Z"
}
]
}/quota查询 API 额度
查询该 API 接入的额度快照;创建任务时再检查并预留额度。API 额度与 MCP 使用的个人账号额度分别计算。
所需权限: quota:read
请求参数
无路径、查询或请求体参数;仍需 Bearer 认证。
请求示例
: "${ISOMOR_API_BASE_URL:?Set ISOMOR_API_BASE_URL}" &&
: "${ISOMOR_API_KEY:?Set ISOMOR_API_KEY}" &&
curl --request GET "${ISOMOR_API_BASE_URL}/quota" \
--header "Authorization: Bearer ${ISOMOR_API_KEY}"响应字段
unit"credits"- 额度单位;文字 PDF 每页消耗 1 积分,查询与上传不消耗翻译积分。
limit / used / reserved / remaininginteger ≥ 0- 总授予 / 已结算 / 任务预留 / 可用;remaining = limit − used − reserved,均是当前额度周期的快照。
expires_atdate-time | null- 额度失效时间;null 表示未设置失效时间,不代表无限额度。
200 · 响应示例
{
"unit": "credits",
"limit": 100,
"used": 20,
"reserved": 10,
"remaining": 70,
"expires_at": null
}错误与重试
错误响应包含 error.code、error.message 与 request_id;排查时提供 request_id,不发送完整 Key、下载链接或文档内容。
{
"error": {
"code": "quota_exceeded",
"message": "The API allowance is insufficient."
},
"request_id": "req_example"
}- 400
invalid_request - 修正缺少的字段、JSON 或幂等键。
- 401
invalid_api_key - 检查凭证是否有效、过期或撤销;不自动重试。
- 403
insufficient_scope - 联系支持开通需要的权限。
- 404
not_found - 核对 ID 及所属接入;其他用户的资源也返回 404。
- 409
idempotency_conflict - 原请求重试保持同键同参数;不同任务使用新键。
- 409
result_not_ready / job_failed - 未就绪继续查询任务;失败读取 error,不循环取结果。
- 413 / 422
file_too_large / unsupported_pdf - 调整文件大小或 PDF 内容;语言和页段参数错误返回 400 invalid_request,不自动重试。
- 429
quota_exceeded - 停止新任务并邮件申请提额;等待几秒不能恢复额度。
- 403
quota_expired - 额度已过期,联系支持续期;已受理任务仍正常处理。
- 429
concurrency_limit / storage_limit - 并发已满时等待任务完成;输入存储额度用满时联系支持。
- 429
rate_limited - 遵循 Retry-After 秒数并退避;创建任务重用幂等键。
- 503
service_unavailable - 指数退避;创建任务必须保留原键,避免重复执行。
幂等窗口为 24 小时:同一接入身份、端点及 Idempotency-Key 对应唯一任务;同键同参数返回原任务,同键不同参数返回 409。创建请求超时或收到 5xx 时,在窗口内仅用原键和原参数重试;超出窗口且不知道任务 ID 时先联系支持,不盲目重建。上传重试可能生成另一文件,但不会发起翻译。
额度与文件边界
API 接入获批后获得初始免费额度,数量和有效期以邮件确认为准。文字 PDF 每页消耗 1 积分。用完后可邮件申请提额,不自动收费。任务创建时预留额度,成功后结算,确认失败后释放预留;查询 /quota 查看可用余额。额度不足时不能创建新任务。
支持文字 PDF、异步单文件翻译和译文/双语 PDF 交付,不包括扫描件、OCR、Office、Webhook、批量提交或取消端点。大小、页数、并发、速率和输入存储额度以 /capabilities 返回值为准;存储额度用满可联系支持。下载链接有有效期,过期后可重新获取;链接失效不等于文件删除。文档文字会发送至 Google Gemini,使用前阅读隐私说明并核验结果。
邮件申请更高额度 ↗