机动车行驶证识别 API(vehicle.license)

上传一张机动车行驶证(主页或副页)照片,接口一次返回 20+ 个结构化字段:号牌号码、号牌颜色、车辆类型、所有人、住址、使用性质、 品牌型号、车辆识别代号 VIN、发动机号码、注册日期、发证日期、档案编号、核定载人数、 总质量、整备质量、核定载质量、外廓尺寸、准牵引总质量、检验有效期至、检验记录、备注, 并附带整体置信度与图片质量提示。 核心字段识别准确率 97%~99%,对轻微模糊、倾斜、反光、褶皱的证照同样具备适应能力。 接口编码 vehicle.license,仅需请求头 X-API-Key。

0.1000 元/次 POST 图片上传 / base64 / URL 免签名 20+ 字段结构化 调用即计费

当前收费方式:PER_CALL(按次计费,0.1000 元/次)(后台「接口管理」可随时调整)

最后更新: · 接口版本 v1

接口概述

一句话说明

vehicle.license 把「看证录入」拆成一次 HTTP 请求。 相比传统固定模板 OCR 只能认标准摆拍、遇到倾斜反光就全崩, 本接口不依赖固定模板与定位框,能理解证照版式与上下文语义, 对轻微模糊、倾斜、反光、褶皱、非标准拍摄角度的证照同样有效, 核心字段(号牌号码、VIN、品牌型号、所有人、车辆类型等)识别准确率 97%~99%; 拿不准的字段返回空字符串而不是猜测值,并给出置信度与质量提示,方便业务侧决定「直接采信 / 转人工复核」。

接口规格
请求地址https://api.xujian.tech/openapi/vehicle/license
请求方式 POST;支持 multipart/form-data(file 字段)、 application/json(image base64)、远程图片地址(imageUrl)三种传法
鉴权方式请求头 X-API-Key(不做签名与加密)
接口编码vehicle.license
收费类型PER_CALL(按次计费,0.1000 元/次)
计费特殊规则 调用即计费:图片通过校验进入识别流程后,无论识别成功还是失败 (模糊无法识别 / 不是行驶证 / 上游超时)都计一次费用; 只有未传图片、超 10MB、格式不支持这类参数级错误返回失败且不扣费
响应格式JSON,Content-Type: application/json;charset=UTF-8
是否需要授权 否(无需授权,API Key 有效且余额充足即可调用)
图片限制单张 ≤ 10MB,支持 JPG / PNG / WEBP / BMP / GIF
识别准确率核心字段 97%~99%(清晰正拍场景)
典型耗时通常 2 ~ 10 秒(图片越大越慢)
典型用途 车险投保 / 理赔录单、二手车收车建档、车队与网约车司机资质审核、 汽车金融进件、物流车辆台账、租车实名登记

快速开始

cURL(multipart 上传文件)
curl -s -X POST "https://api.xujian.tech/openapi/vehicle/license" \
  -H "X-API-Key: 你的APIKey" \
  -F "file=@/path/to/vehicle-license.jpg"
cURL(JSON + base64)
curl -s -X POST "https://api.xujian.tech/openapi/vehicle/license" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: 你的APIKey" \
  -d '{"image": "图片的 base64 内容(可带 data:image/jpeg;base64, 前缀)"}'
cURL(远程图片地址)
curl -s -X POST "https://api.xujian.tech/openapi/vehicle/license" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: 你的APIKey" \
  -d '{"imageUrl": "https://example.com/vehicle-license.jpg"}'

拍得更准的三条建议

  • 正拍 + 铺满画面:证照占画面 70% 以上,四角完整入镜;
  • 避免反光与阴影:不要开闪光灯,避开玻璃桌面与强光源;
  • 主页副页分开拍:只上传一页时,另一页字段会返回空字符串; 两页同框时 side 返回 both。

请求参数

请求头(Header)
参数名是否必填说明
X-API-Key是开发者 API Key
Content-Type视传法而定 文件用 multipart/form-data;base64 / URL 用 application/json

业务参数(三选一,优先级:file > image > imageUrl)

字段类型是否必填说明
fileFile三选一 multipart/form-data 上传的图片文件,≤ 10MB
imageString三选一 图片 base64 内容,可带 data:image/jpeg;base64, 前缀; JSON 请求体或表单字段均可
imageUrlString三选一 图片远程地址(http / https),由服务端下载,≤ 10MB、下载超时 15 秒

响应参数

data 字段
字段类型示例说明
sideStringmain 版面:main 主页 / sub 副页 / both 主页与副页同框 / unknown 无法判断
sideTextString主页版面中文名
plateNoString渝A12345号牌号码(字母大写)
plateColorString蓝 号牌颜色:蓝 / 黄 / 绿 / 渐变绿 / 白 / 黑;看不出时为空字符串
vehicleTypeString小型普通客车车辆类型
ownerString张三所有人(车主姓名 / 单位名称)
addressString重庆市铜梁区白龙大道 88 号住址
useNatureString非营运使用性质
brandModelString大众汽车牌 SVW71810HJ品牌型号
vinStringLSVAL41Z2N2123456车辆识别代号(17 位)
engineNoString1234567发动机号码
registerDateString2022-03-15注册日期(YYYY-MM-DD)
issueDateString2022-03-15发证日期(YYYY-MM-DD)
fileNoString500123456789档案编号(副页)
passengerCapacityString5核定载人数,单位:人(副页)
totalMassString1800总质量,单位:kg(副页)
curbWeightString1320整备质量,单位:kg(副页)
approvedLoadString480核定载质量,单位:kg(副页)
dimensionsString4520×1780×1460 外廓尺寸,单位:mm,格式「长×宽×高」(副页)
tractionMassString 准牵引总质量,单位:kg(副页;无牵引能力时为空字符串)
inspectionValidToString2026-08-01 检验有效期至(YYYY-MM-DD,副页)
inspectionRecordString检验有效期至2026年08月 检验记录原文(副页)
remarkString备注(副页)
confidenceNumber98.50 整体识别置信度,0 ~ 100,保留 2 位小数; 未能评估时为 null,接入方请先判空
qualityNoteString图片清晰 图片质量提示(如「副页反光,建议重新拍摄」)
apiCodeStringvehicle.license接口编码
apiNameString机动车行驶证识别接口名称
chargeTypeStringPER_CALL计费类型
balanceBigDecimal 调用完成后(已扣费)的账户余额(元)
costMsLong3600本次调用耗时(毫秒)

字段口径约定

  • 识别不到一律返回空字符串 ""(不是 null),可直接落库; 唯一例外是 confidence,评估不出时为 null;
  • 数值类字段只保留数字,不带单位:质量 kg、尺寸 mm、人数 人;
  • 日期统一 YYYY-MM-DD;
  • 号牌号码 / VIN / 发动机号统一大写并去掉中间空格;
  • 只上传一页时,另一页专属字段返回空字符串(例如只传主页, passengerCapacity、totalMass 为空)。

响应示例

成功(code = 0)

JSON
{
  "code": 0,
  "msg": "success",
  "data": {
    "side": "main",
    "sideText": "主页",
    "plateNo": "渝A12345",
    "plateColor": "蓝",
    "vehicleType": "小型普通客车",
    "owner": "张三",
    "address": "重庆市铜梁区白龙大道88号",
    "useNature": "非营运",
    "brandModel": "大众汽车牌 SVW71810HJ",
    "vin": "LSVAL41Z2N2123456",
    "engineNo": "1234567",
    "registerDate": "2022-03-15",
    "issueDate": "2022-03-15",
    "fileNo": "500123456789",
    "passengerCapacity": "5",
    "totalMass": "1800",
    "curbWeight": "1320",
    "approvedLoad": "480",
    "dimensions": "4520×1780×1460",
    "tractionMass": "",
    "inspectionValidTo": "2026-08-01",
    "inspectionRecord": "检验有效期至2026年08月",
    "remark": "",
    "confidence": 98.50,
    "qualityNote": "图片清晰",
    "apiCode": "vehicle.license",
    "apiName": "机动车行驶证识别",
    "chargeType": "PER_CALL",
    "balance": 99.9000,
    "costMs": 3600
  }
}

失败(不是行驶证 / 过于模糊)—— 已扣费

JSON
{
  "code": 500,
  "msg": "未能识别出行驶证信息,请上传清晰的行驶证主页或副页照片(本次调用已计费)",
  "data": null
}

失败(参数级错误)—— 不收费

JSON
{
  "code": 500,
  "msg": "图片大小不能超过 10MB",
  "data": null
}

错误码与常见失败原因

codemsg(示例)是否扣费处理建议
0success扣费识别成功
500缺少请求头 X-API-Key否补充 X-API-Key
500API Key 无效 / API Key 已停用否检查 Key 或重新启用
500客户不存在或已停用否联系平台(可联系微信xujian_cq)
500接口不存在或已停用否接口下线维护中,稍后再试
500 余额不足,请先充值。可联系微信xujian_cq 否充值后重试
500 请上传图片:multipart 的 file 字段、JSON 的 image(base64)、imageUrl(图片地址)三选一 否补传图片
500图片大小不能超过 10MB否压缩后再传(建议长边 2000px 以内)
500不支持的图片格式,仅支持 JPG / PNG / WEBP / BMP / GIF否转换格式后重试
500image 不是合法的 base64 内容否检查 base64 编码(不要传 URL 编码后的内容)
500图片地址下载失败或超时否换用可公网直连的地址,或改传文件 / base64
500未能识别出行驶证信息……(本次调用已计费)是 确认上传的是行驶证而非驾驶证 / 身份证 / 登记证书;重新正拍后重试
500未能识别出行驶证上的有效字段……(本次调用已计费)是 图片过于模糊 / 反光 / 遮挡,重新拍摄后重试
500行驶证识别失败(请求视觉模型超时或网络异常)(本次调用已计费)是 上游抖动,稍后重试;连续失败请联系平台
500行驶证识别服务未启用或未配置,本次调用不计费否平台侧配置问题,联系平台处理

多语言代码示例

Java(Hutool)

Java
// 方式一:multipart 上传文件
String body = HttpRequest.post("https://api.xujian.tech/openapi/vehicle/license")
        .header("X-API-Key", apiKey)
        .form("file", new File("/path/to/vehicle-license.jpg"))
        .timeout(60000)
        .execute()
        .body();

// 方式二:JSON + base64
JSONObject req = JSONUtil.createObj().set("image", Base64.encode(new File("/path/to/vehicle-license.jpg")));
String body2 = HttpRequest.post("https://api.xujian.tech/openapi/vehicle/license")
        .header("Content-Type", "application/json")
        .header("X-API-Key", apiKey)
        .timeout(60000)
        .body(req.toString())
        .execute()
        .body();

JSONObject json = JSONUtil.parseObj(body);
if (json.getInt("code") != 0) {
    // 注意:识别失败同样已扣费,不要无脑重试
    System.out.println("识别失败:" + json.getStr("msg"));
    return;
}
JSONObject data = json.getJSONObject("data");
System.out.printf("%s %s|%s|置信度 %s%n",
        data.getStr("plateNo"), data.getStr("vehicleType"),
        data.getStr("owner"), data.getBigDecimal("confidence"));

Python

Python
import base64
import requests


def recognize(api_key: str, path: str):
    """识别行驶证;识别失败也会扣费,不要直接重试用同一张图"""
    with open(path, "rb") as f:
        b64 = base64.b64encode(f.read()).decode()

    resp = requests.post(
        "https://api.xujian.tech/openapi/vehicle/license",
        json={"image": b64},
        headers={"Content-Type": "application/json", "X-API-Key": api_key},
        timeout=60,
    )
    result = resp.json()
    if result.get("code") != 0:
        print("识别失败(已扣费):", result.get("msg"))
        return None
    return result["data"]


if __name__ == "__main__":
    data = recognize("你的APIKey", "vehicle-license.jpg")
    if data:
        print(data["plateNo"], data["vehicleType"], data["owner"], data["confidence"])

JavaScript(浏览器 / Node 18+)

JavaScript
// 浏览器端:直接用 FormData 上传用户选择的图片
const form = new FormData();
form.append("file", fileInput.files[0]);

const resp = await fetch("https://api.xujian.tech/openapi/vehicle/license", {
  method: "POST",
  headers: { "X-API-Key": API_KEY },   // 不要手动设置 Content-Type,浏览器会自动带上 boundary
  body: form,
});

const { code, msg, data } = await resp.json();
if (code === 0) {
  console.log(`${data.sideText}|${data.plateNo}|${data.owner}|置信度 ${data.confidence}`);
} else {
  console.warn("识别失败(可能已扣费):", msg);
}

常见问题(FAQ)

vehicle.license 接口怎么收费?识别失败扣费吗?

vehicle.license 的收费类型为 PER_CALL(按次计费),当前单价 0.1000 元/次,调用前校验余额,余额不足返回「余额不足,请先充值。可联系微信xujian_cq」且不扣费;充值可可联系微信xujian_cq。扣费金额、交易前后余额均记录于交易流水中。

本接口为调用即计费:图片通过校验进入识别流程后, 无论最终识别成功还是失败(模糊、不是行驶证、上游超时)都计一次费用, 因为识别算力已经发生。只有未传图片、超 10MB、格式不支持、base64 非法、 远程地址下载失败这类参数级错误才不扣费。

识别准确率有多高?模糊的证照能认吗?

清晰正拍场景下,核心字段(号牌号码、车辆类型、所有人、品牌型号、 VIN、发动机号、注册 / 发证日期等)识别准确率 97%~99%。 接口不依赖固定模板与定位框,对轻微模糊、倾斜、反光、褶皱、 非标准拍摄角度的证照同样有较强适应能力; 确实拿不准的字段会返回空字符串并降低 confidence, 不会返回猜测值,便于业务侧转人工复核。

为什么有的字段返回空字符串?

三种情况:① 该字段属于另一页(只传主页时副页字段为空); ② 证照上本来就没有这一项(如小型客车没有准牵引总质量); ③ 图片上该区域模糊 / 反光 / 被遮挡,识别不出来。 接口不做猜测补全,请结合 qualityNote 决定是否重新拍摄。

图片怎么传最方便?

三种方式任选:multipart/form-data 的 file 字段(最省事,浏览器 / App 直传)、 JSON 的 image(base64,可带 data URI 前缀)、 imageUrl(服务端去下载,适合图片已在对象存储上的场景)。 三者同时传时优先级为 file > image > imageUrl。

支持驾驶证、身份证、车辆登记证书吗?

本接口仅识别机动车行驶证(主页 / 副页)。 上传驾驶证、身份证、机动车登记证书(大绿本)等其他证件时, 接口会返回「未能识别出行驶证信息」并按计费规则扣费, 请务必在上传前做证件类型校验或给用户明确提示。

图片会不会被保存?

不会。平台不落库图片与识别结果: 图片仅在本次请求的内存中参与识别,请求结束后即被丢弃, 响应中只返回结构化字段,接入方无需为此做额外的合规申报。

识别结果可以直接用于车险 / 金融进件吗?

建议按 confidence 与 qualityNote 分流: 高置信度且关键字段齐全时可自动采信, 置信度偏低或存在空字段时转人工复核。 涉及投保、放款、资质审核等强决策场景,请保留人工兜底。

调用需要签名或加密吗?

不需要。XAPI 的接口仅校验请求头 X-API-Key,不做签名、时间戳或加密。

扫码添加微信
联系作者 · 微信二维码

微信号:xujian_cq

接口对接、充值 / 授权、定制需求都可以直接聊