Open API 文档
本服务提供 RESTful OCR 接口,支持通用文字识别与多种证件结构化识别。
所有 /open/v1/ocr/* 接口均通过 API Key 鉴权。
快速开始
鉴权方式:在请求头中携带 Authorization: Bearer <api_key>。
每个 Key 有独立的 QPS 限流与调用配额,可在「密钥管理」页配置。
最简单的调用示例——上传一张图片进行通用文字识别:
curl -X POST {origin}/open/v1/ocr/general \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@/path/to/image.png"
结构化识别示例——识别车牌:
curl -X POST {origin}/open/v1/ocr/plate \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@/path/to/plate.jpg"
自定义证件识别(JSON body + config):
curl -X POST {origin}/open/v1/ocr/custom \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image": "'$(base64 -w0 /path/to/image.png)'",
"config": {
"keywords": ["车牌", "车架号", "联系电话"],
"fields": [
{"name": "plate", "labels": ["车牌"]},
{"name": "vin", "labels": ["车架号"]},
{"name": "mobile", "labels": ["联系电话"]}
]
}
}'
无鉴权的错误示例(返回 401):
$ curl -s {origin}/open/v1/ocr/general \
-F "file=@/path/to/image.png"
{"code":4011,"message":"missing bearer api key","request_id":"..."}
端点一览
| 中文名 | 路径 | 说明 |
|---|---|---|
| 健康检查 | GET /healthz | 返回 {"status":"ok"},无需鉴权 |
| 银行卡 | POST /open/v1/ocr/bankcard |
结构化识别,返回解析后的结构化字段 |
| 营业执照 | POST /open/v1/ocr/bizlicense |
结构化识别,返回解析后的结构化字段 |
| 驾驶证 | POST /open/v1/ocr/driver_license |
结构化识别,返回解析后的结构化字段 |
| 身份证(人像面) | POST /open/v1/ocr/idcard |
结构化识别,返回解析后的结构化字段 |
| 身份证(国徽面) | POST /open/v1/ocr/idcard_back |
结构化识别,返回解析后的结构化字段 |
| 发票 | POST /open/v1/ocr/invoice |
结构化识别,返回解析后的结构化字段 |
| 手机号 | POST /open/v1/ocr/phone |
结构化识别,返回解析后的结构化字段 |
| 车牌 | POST /open/v1/ocr/plate |
结构化识别,返回解析后的结构化字段 |
| 行驶证 | POST /open/v1/ocr/vehicle_license |
结构化识别,返回解析后的结构化字段 |
| 车架号(VIN) | POST /open/v1/ocr/vin |
结构化识别,返回解析后的结构化字段 |
| 通用文字识别 | POST /open/v1/ocr/general |
通用 OCR,返回识别文字行(不进行结构化解析) |
| 自定义证件识别 | POST /open/v1/ocr/custom |
调用方配置关键词与抽取字段,返回自定义结构 |
请求格式
所有接口均支持以下两种上传方式(二选一):
- multipart/form-data:字段名
file,直接上传图片文件(PNG / JPEG / GIF / BMP / WebP); - JSON body:
{"image": "<base64_string>"}(支持 data-URI 前缀,如data:image/png;base64,...)。
图片大小超过服务端限制(默认 10 MB,可在 config 中通过 max_image_mb 调整)会被拒绝。
custom 端点需额外提供 config 字段(multipart 作为表单字段,JSON 作为顶层字段)。
响应格式
每个响应同时在 HTTP 头中返回 X-Request-Id。
成功(code = 0):
HTTP 200
{
"code": 0,
"data": { ... },
"request_id": "a1b2c3...",
"elapsed_ms": 123
}
- general:
data = {"lines":[{"text","score","box"}], "text":"..."} - docType:
data = {"fields":{...}, "lines":[...], "retried":true}(retried仅在系统对首次识别结果进行重试增强时出现) - custom:
data = {"fields":{...}, "missing":[...], "lines":[...]}
失败:
HTTP 4xx/5xx
{
"code": 4001,
"message": "error description",
"request_id": "a1b2c3..."
}
各类型字段说明
general — 通用文字识别
不返回结构化字段,仅返回原始识别结果:
lines:文字行数组,每行含text、score(置信度)、box(四角坐标)text:所有行拼接的完整文本
idcard — 身份证(人像面)
| 字段 | 说明 |
|---|---|
name | 姓名 |
gender | 性别(男/女) |
ethnicity | 民族(如"汉族") |
birth | 出生日期(YYYY-MM-DD) |
address | 住址 |
id_number | 公民身份号码(18 位,含校验位) |
idcard_back — 身份证(国徽面)
| 字段 | 说明 |
|---|---|
authority | 签发机关 |
valid_from | 有效期起始日期 |
valid_to | 有效期截止日期(或"长期") |
valid_period | 有效期(格式:起始~截止) |
bankcard — 银行卡
| 字段 | 说明 |
|---|---|
bank | 发卡银行名称 |
card_number | 银行卡号(16–19 位,Luhn 校验) |
plate — 车牌
| 字段 | 说明 |
|---|---|
plate_no | 车牌号码 |
plate_type | 车牌类型,取值见下表 |
plate_type 取值(8 种):
| plate_type | 说明 |
|---|---|
| 正常燃油车 | 普通蓝牌/绿牌燃油车 |
| 新能源小型车 | 新能源小型车(D/F 在第 3 位) |
| 新能源大型车 | 新能源大型车(D/F 在末位) |
| 特种车牌 | 学/挂/领/试/超/练/警 字尾 |
| 武警车牌 | WJ 开头的武警车牌 |
| 军车牌 | 军区/军种前缀的军用车牌 |
| 港澳牌 | 末位为"港"或"澳"的跨境车牌 |
| 民航牌 | "民航"前缀的民航车牌 |
车牌识别支持单行牌与上下两行叠放牌(如部分军牌、摩托车牌), 系统会自动合并相邻检测框并尝试匹配。
vin — 车架号(VIN)
| 字段 | 说明 |
|---|---|
vin | 17 位车辆识别代号(不含 I/O/Q,ISO 3779) |
phone — 手机号
| 字段 | 说明 |
|---|---|
phones | 手机号数组(中国大陆 11 位号码,1[3-9]开头) |
bizlicense — 营业执照
| 字段 | 说明 |
|---|---|
title | 证照标题("营业执照") |
credit_code | 统一社会信用代码(18 位) |
name | 名称(企业/个体名称) |
type | 类型(如"有限责任公司") |
person | 法定代表人/负责人/经营者 |
address | 住所/营业场所 |
capital | 注册资本/出资额 |
establish_date | 成立日期(YYYY-MM-DD) |
valid_period | 营业期限/有效期 |
business_scope | 经营范围 |
authority | 登记机关 |
reg_number | 注册号(旧版执照) |
invoice — 发票
| 字段 | 说明 |
|---|---|
invoice_number | 发票号码 |
invoice_code | 发票代码 |
invoice_date | 开票日期(YYYY-MM-DD) |
buyer_name | 购买方名称 |
buyer_credit_code | 购买方统一社会信用代码 |
seller_name | 销售方名称 |
seller_credit_code | 销售方统一社会信用代码 |
total_amount | 合计金额 |
total_tax | 合计税额 |
total_with_tax | 价税合计(小写) |
total_with_tax_cn | 价税合计(大写) |
payee | 收款人 |
reviewer | 复核 |
drawer | 开票人 |
vehicle_license — 行驶证
| 字段 | 说明 |
|---|---|
plate_no | 号牌号码 |
vin | 车辆识别代号 |
vehicle_type | 车辆类型 |
owner | 所有人 |
address | 住址 |
use_character | 使用性质 |
model | 品牌型号 |
engine_no | 发动机号码 |
register_date | 注册日期(YYYY-MM-DD) |
issue_date | 发证日期(YYYY-MM-DD) |
driver_license — 驾驶证
| 字段 | 说明 |
|---|---|
id_number | 证号(18 位,与公民身份号码相同) |
name | 姓名 |
gender | 性别(男/女) |
nationality | 国籍 |
address | 住址 |
birth | 出生日期(YYYY-MM-DD) |
first_issue | 初次领证日期(YYYY-MM-DD) |
class | 准驾车型(如 C1D) |
valid_from | 有效期限起始日期 |
valid_to | 有效期限截止日期 |
valid_period | 有效期限(格式:起始 至 截止) |
custom — 自定义证件识别
请求时需提供 config(JSON 字段):
keywords:文档类型校验关键词数组(默认至少命中 2 个,可用min_keyword_hits覆盖)fields:要抽取的字段数组(最多 15 个),每个字段的labels为「或」关系的标签候选
响应 data 包含:
fields:已抽取到的字段键值对missing:未抽取到的字段名列表lines:原始识别文字行
错误码
| code | HTTP 状态码 | 含义 |
|---|---|---|
4001 | 400 | 图片无效、无法解码或超出大小限制 |
4002 | 400 | 未知的 docType(不在已注册的类型列表中) |
4011 | 401 | 缺少 Authorization 头或 API Key 无效/已停用 |
4013 | 401 | Key 调用配额已用尽 |
4029 | 429 | 超出该 Key 的 QPS 限流 |
5000 | 500 | 识别引擎内部错误 |
Web 控制台页面
| 路径 | 说明 |
|---|---|
/ | 在线试用控制台,支持选择文档类型,上传图片并查看识别结果与结构化字段 |
/docs | API 文档(当前页面) |
/scan | 手机扫码识别页面,支持车牌和车架号(VIN)实时摄像头扫描, 也可导入图片识别。需要 HTTPS 或 localhost 以使用摄像头;需提供 API Key |
/keys?token=<admin_token> |
密钥管理页面,支持创建、启停、删除 API Key 与管理控制台账号 |
部署配置要点
完整配置项请参阅 config.example.toml,以下为集成方常用配置:
| 配置项 | 说明 | 默认值 |
|---|---|---|
listen | HTTP 监听地址(如 ":8080") | ":8080" |
admin_token | 控制台管理员令牌(Bearer Token) | "change-me" |
db_path | SQLite 数据库路径(账号、API Key) | runtime/data/ocr.db |
plate_max_side | 车牌重试时的最大边长(像素),0 表示不启用 | 250 |
max_image_mb | 单次上传图片大小上限(MB) | 10 |
default_qps | Key 默认 QPS 限流 | 5 |
max_concurrent | 全局最大并发推理数 | 2 |