适用场景
身份证识别是实名认证流程中不可或缺的一环。典型场景包括:
- 用户信息录入:通过上传身份证照片自动填充姓名、身份证号、地址等字段,减少手动输入错误。
- KYC(Know Your Customer)辅助:在金融、租赁、社交平台等场景中,快速提取证件信息用于合规审查。
- 身份核验对账:将 OCR 结果与用户提交的身份证号、姓名进行比对,提升人工审核效率。
本 API 支持正面与反面自动判断,一次请求即可获取全部 10 个结构化字段,适合作为流水线中的一个原子服务。
接口能力与限制
| 指标 | 说明 |
|---|---|
| 端点 | https://v1.apizero.cn/api/ocr-idcard |
| 方法 | POST |
| QPS 上限 | 2 次/秒——超过会被限流,返回 429 |
| 输入格式 | 图片 URL(jpg/png)或 base64 编码字符串(≤10 MB) |
| 输出字段 | 姓名、身份证号、性别、民族、出生日期、地址、签发机关、有效期起止、正反面标识 (共 10 个) |
| 调用前提 | 需在平台登录后获取 API Key,并作为 Bearer Token 传入 |
注意:该接口目前只返回结构化字段,不提供证件照片切割或高清化能力。图片过小(<200px)或模糊时,识别准确率会明显下降。
鉴权与请求头
每次请求必须携带两个Header:
| 参数 | 值格式 | 说明 |
|---|---|---|
Authorization | Bearer <你的 API Key> | 在平台申请 API Key 后填入。注意和空格,Bearer 后有一个半角空格 |
Content-Type | application/json | 请求体采用 JSON 格式 |
部分老版 SDK 可能使用X-API-Key头传递,建议以官方最新文档为准。本文示例统一使用Authorization: Bearer。
请求参数详解
请求体为 JSON 对象,包含两个必填字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
input_type | string | 是 | 取值"url"或"base64",表示图片的传递方式 |
input_data | string | 是 | 当input_type="url"时传入图片的完整 URL;为"base64"时传入图片的 base64 编码字符串(不含 data:image/... 前缀) |
参数设计意图:
- 分离 type 和 data 可以降低服务端解析维护复杂度:若固定为 url,则无需检测字符串格式。
- base64 方式适用于图片已在前端或本地缓存中,不需要外网可访问的场景。但注意 base64 编码后体积膨胀约 1/3,且 10 MB 的原始图片对应的 base64 字符串可能超过 13 MB,实际传输时需考虑请求体大小限制(多数网关限制 10–20 MB)。
最佳实践:
- 如果图片存储在对象存储(如 OSS、S3)或可生成临时外链,优先使用
input_type="url",减少请求体体积,同时可以利用 CDN 加速。 - 如果图片来自本地文件或摄像头拍照后直接处理,可使用 base64 编码;编码前建议压缩原始图片至 1 MB 以内,既能保留文字清晰度,又能减少传输时间。
额外注意:URL 必须为公网可访问的链接;内网地址或带鉴权参数的私有地址可能被拒绝。
请求示例
curl 示例(推荐用于快速测试)
curl -sS -X POST \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"input_type":"url","input_data":"https://example.com/idcard-front.jpg"}' \ "https://v1.apizero.cn/api/ocr-idcard"将YOUR_API_KEY替换为实际密钥,input_data替换为可用的身份证正面图片 URL。成功响应时终端会输出 JSON 字符串。
Python 示例(使用 requests 库)
import requests import json url = "https://v1.apizero.cn/api/ocr-idcard" headers = { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json" } payload = { "input_type": "url", "input_data": "https://example.com/idcard-front.jpg" } response = requests.post(url, headers=headers, data=json.dumps(payload)) print(response.status_code) print(response.json())若希望处理 base64 编码,注意不要添加data:image/png;base64,前缀,仅传入纯 base64 字符串。
响应字段说明
成功的 HTTP 状态码为 200,响应体示例:
{ "code": 0, "msg": "成功", "request_id": "req_abc123", "data": { "address": "上海市浦东新区某某路123号", "birth": "1990-01-01", "gender": "男", "identity_code": "310101199001011234", "identity_name": "张三", "issued_by": null, "race": "汉", "side": 1, "valid_date_end": null, "valid_date_start": null } }顶层字段
| 字段 | 类型 | 说明 |
|---|---|---|
code | int | 业务状态码:0 表示成功,非 0 表示失败(见“常见错误”) |
msg | string | 中文描述信息 |
request_id | string | 请求唯一标识,可用于排查日志 |
data | object | 识别结果,若失败则为null |
data 内字段详解
| 字段 | 类型 | 说明 |
|---|---|---|
identity_name | string/null | 姓名(正面),反面时为null |
identity_code | string/null | 身份证号(正面) |
gender | string/null | 性别,"男" 或 "女"(正面) |
race | string/null | 民族,如 "汉"(正面) |
birth | string/null | 出生日期,格式YYYY-MM-DD(正面) |
address | string/null | 住址(正面) |
issued_by | string/null | 签发机关(反面) |
valid_date_start | string/null | 有效期起始日期(反面) |
valid_date_end | string/null | 有效期截止日期,若为长期有效则可能返回"长期"或null(以实际为准) |
side | int | 1 表示正面(人像面),0 表示反面(国徽面) |
关键注意:
- 正面只返回人像面信息(姓名、号码等),反面只返回签发机关和有效期。当传入图片为正面时,
issued_by等反向字段为null;反之亦然。 - 利用
side字段可以验证用户是否上传了正确的页面。 - 部分旧版身份证的地址可能省略“省/市/区”字样;字段值按图片中实际印刷内容输出。
常见错误码与排查
| HTTP 状态 | code值 | msg示例 | 可能原因与处理 |
|---|---|---|---|
| 200 | 0 | 成功 | 正常识别 |
| 200 | 1001 | 参数错误 | 缺少input_type或input_data,或 content_type 值非法 |
| 200 | 1002 | 图片下载失败 | URL 不可达、网络超时、图片内容非 jpg/png |
| 200 | 1003 | 图片解析失败 | base64 格式错误或图片损坏 |
| 200 | 1004 | 未检测到身份证 | 图片中无身份证,或图片过于模糊、倾斜角度过大 |
| 401 | - | Unauthorized | 未提供 Authorization 头或 API Key 无效 |
| 429 | - | Too Many Requests | QPS 超过 2/s,需加入本地重试或排队逻辑 |
| 5xx | - | 服务器错误 | 短暂故障,建议指数退避重试 1–3 次 |
排查步骤:
- 检查请求头中是否包含正确的 Bearer Token。
- 确认图片格式和大小合规。
- 若返回 1002,可用浏览器先访问图片 URL 检查可访问性。
- 若返回 1004,尝试调整图片方向(正放)或提高分辨率。
工程化注意事项
1. 并发与限流保护
QPS 只有 2/s,在生产中若需要批量处理大量身份证图片,建议使用消息队列(如 Redis List 或 RabbitMQ)控制消费速率,避免触发 429 并导致整体任务失败。
2. 图片预处理
- 图片尺寸建议在 500px–2000px 之间,太小的图片文字模糊度上升。
- 若传 base64,注意在客户端压缩(例如 Web 端使用 canvas 调整质量)。
- 对于翻拍或扫描件,可以先用图像增强库(如 OpenCV)做灰度化、去噪、纠偏,再传给 API。
3. 结果校验
OCR 输出的姓名、身份证号可能存在个别字符偏差(尤其 0/O、1/I 混淆)。建议在业务层增加校验:
- 身份证号:校验前 6 位地区码、出生日期合法性、第 18 位校验码。
- 姓名:与用户提交的姓名做模糊匹配或人工二次确认。
4. 重试与幂等
由于request_id每次请求都会新生成,不支持幂等去重。如果同一条图片因超时失败,直接重发请求即可,接收方不记录图片内容,无需担心重复写入。
5. 安全与隐私
身份证图片包含敏感信息,传输时应使用 HTTPS 加密通道;若使用 base64,避免在日志或错误堆栈中打印完整 payload。建议只记录request_id用于回溯。
参考文档
- 官方文档页:https://apizero.cn/aidocs/ocr-idcard
- 原始 Markdown 文档:https://apizero.cn/aidocs/ocr-idcard/raw.md
调用前请务必查阅文档以获取最新参数变更和错误码说明。