云启智联AI服务 API 文档
欢迎使用云启智联AI服务。本文档提供了完整的 API 接口说明,帮助您快速集成银行回单识别、对账单识别、发票识别等智能解析能力。
文档概述
云启智联AI服务提供以下核心能力:
| 能力 | 接口路径 | 说明 |
|---|---|---|
| 银行回单解析 | /AIService/bank_receipt_parsing |
识别银行回单图片/PDF,提取交易信息 |
| 银行对账单解析 | /AIService/bank_statement_parsing |
识别银行对账单,提取交易明细 |
| 发票解析 | /AIService/invoice_parsing |
识别发票图片/PDF,提取发票信息 |
| 通用文件解析 | /AIService/file_parsing |
通用文件识别解析 |
| 异步结果查询 | /AIService/async_result |
查询已提交任务的执行结果 |
计费说明
所有识别类接口均采用按文件页数计费模式,调用失败的任务不产生费用。具体定价如下:
| 接口名称 | 接口路径 | 计费模式 | 单价 |
|---|---|---|---|
| 银行回单解析 | /AIService/bank_receipt_parsing |
按文件页数 | 0.01 元 / 页 |
| 银行对账单解析 | /AIService/bank_statement_parsing |
按文件页数 | 0.01 元 / 页 |
| 发票解析 | /AIService/invoice_parsing |
按文件页数 | 0.01 元 / 页 |
| 通用文件解析 | /AIService/file_parsing |
按文件页数 | 0.01 元 / 页 |
计费规则
页数按实际解析的文件页数计算(单张图片算 1 页,PDF 按实际页数计算)。任务执行失败(code 非 1000)时不扣费。费用按天汇总,次日从账户余额中统一结算扣除。
认证鉴权
所有业务接口均需要在请求头中携带 Authorization 进行身份认证。
获取 API Key
登录云启智联AI服务管理面板,在「API Key管理」页面创建并获取您的 API Key。API Key 格式示例:
text
as-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456
请求头格式
http
Authorization: as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
安全提示
API Key 是调用接口的唯一凭证,请妥善保管,不要将其暴露在客户端代码或公共仓库中。如怀疑泄露,请立即在管理面板中禁用并重新创建。
回调机制
所有识别类接口均为异步执行模式。您可以通过以下两种方式获取任务结果:
- 主动查询:提交任务后获取
task_id,通过async_result接口主动轮询查询结果。 - 被动回调:提交任务时在
callback_url参数中指定回调地址,任务完成后系统自动以 POST 方式推送结果。
回调请求格式
http
POST {您提供的callback_url}
Content-Type: application/json
{
"code": 1000,
"msg": "success",
"data": [
{
"page_index": 1,
"page_data": [...]
}
]
}
回调说明
回调请求体中的数据结构,与通过 async_result 接口主动查询返回的数据结构完全一致。建议在回调接口中实现幂等处理,避免重复处理同一任务结果。
银行回单解析
识别银行回单图片或 PDF 文件,自动提取交易日期、交易金额、收付款方信息、摘要等关键字段。
POST
/AIService/bank_receipt_parsing
请求头参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| Authorization | string | 必填 | API Key,用于身份认证 |
| Content-Type | string | 选填 | 上传文件时设置为 multipart/form-data |
请求体参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| file | file | 选填 | 上传的回单文件,支持格式:pdf、png、jpeg、jpg、bmp、gif;与 file_url 二选一 |
| file_url | string | 选填 | 文件 URL 地址,与 file 参数二选一 |
| callback_url | string | 选填 | 回调地址,任务完成后以 POST 方式推送结果 |
请求示例
curl
curl -X POST "https://your-domain.com/AIService/bank_receipt_parsing" \
-H "Authorization: as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-F "file=@receipt.pdf" \
-F "callback_url=https://your-app.com/callback"
python
import requests
url = "https://your-domain.com/AIService/bank_receipt_parsing"
headers = {"Authorization": "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
files = {"file": open("receipt.pdf", "rb")}
data = {"callback_url": "https://your-app.com/callback"}
response = requests.post(url, headers=headers, files=files, data=data)
print(response.json())
java
import java.io.File;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
HttpClient client = HttpClient.newHttpClient();
String boundary = "----FormBoundary" + System.currentTimeMillis();
File file = new File("receipt.pdf");
String body = "--" + boundary + "\r\n"
+ "Content-Disposition: form-data; name=\"callback_url\"\r\n\r\n"
+ "https://your-app.com/callback\r\n"
+ "--" + boundary + "\r\n"
+ "Content-Disposition: form-data; name=\"file\"; filename=\"receipt.pdf\"\r\n"
+ "Content-Type: application/pdf\r\n\r\n";
byte[] fileBytes = Files.readAllBytes(file.toPath());
byte[] bodyEnd = ("\r\n--" + boundary + "--\r\n").getBytes();
byte[] bodyBytes = new byte[body.getBytes().length + fileBytes.length + bodyEnd.length];
System.arraycopy(body.getBytes(), 0, bodyBytes, 0, body.getBytes().length);
System.arraycopy(fileBytes, 0, bodyBytes, body.getBytes().length, fileBytes.length);
System.arraycopy(bodyEnd, 0, bodyBytes, body.getBytes().length + fileBytes.length, bodyEnd.length);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://your-domain.com/AIService/bank_receipt_parsing"))
.header("Authorization", "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(HttpRequest.BodyPublishers.ofByteArray(bodyBytes))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
csharp
using var client = new HttpClient();
using var form = new MultipartFormDataContent();
form.Add(new ByteArrayContent(File.ReadAllBytes("receipt.pdf")), "file", "receipt.pdf");
form.Add(new StringContent("https://your-app.com/callback"), "callback_url");
client.DefaultRequestHeaders.Add("Authorization", "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
var response = await client.PostAsync("https://your-domain.com/AIService/bank_receipt_parsing", form);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
javascript
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const form = new FormData();
form.append('file', fs.createReadStream('receipt.pdf'));
form.append('callback_url', 'https://your-app.com/callback');
const response = await axios.post(
'https://your-domain.com/AIService/bank_receipt_parsing',
form,
{
headers: {
...form.getHeaders(),
'Authorization': 'as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}
}
);
console.log(response.data);
响应示例
提交成功
json
{
"code": 1000,
"msg": "success",
"data": "任务已经提交,请稍候通过 async_result 接口查询任务结果...",
"task_id": "d339b5e4-0c72-46bd-a17b-f23c5a3500cd"
}
查询结果成功
json
{
"code": 1000,
"msg": "success",
"data": [
{
"page_index": 1,
"page_data": [
{
"bankName": "杭州银行",
"createDate": "2025-04-25",
"expendCustomer": "杭州气米科技有限公司",
"expendAccount": "3301040160002492166",
"incomeCustomer": "浙江顺丰速运有限公司",
"incomeAccount": "1202022329900002018",
"amount": 178.0,
"abstract": "汇兑",
"remark": "快递费",
"transNo": "20250425U0547466",
"curName": "人民币",
"image_url": "https://example.com/image.png"
}
]
}
]
}
银行对账单解析
识别银行对账单文件,自动提取账户信息、交易明细等字段,支持按页分组返回结构化数据。
POST
/AIService/bank_statement_parsing
请求头参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| Authorization | string | 必填 | API Key,用于身份认证 |
请求体参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| file | file | 选填 | 上传的对账单文件,支持格式:pdf、png、jpeg、jpg、bmp、gif;与 file_url 二选一 |
| file_url | string | 选填 | 文件 URL 地址,与 file 参数二选一 |
| callback_url | string | 选填 | 回调地址,任务完成后以 POST 方式推送结果 |
请求示例
curl
curl -X POST "https://your-domain.com/AIService/bank_statement_parsing" \
-H "Authorization: as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-F "file=@statement.pdf" \
-F "callback_url=https://your-app.com/callback"
python
import requests
url = "https://your-domain.com/AIService/bank_statement_parsing"
headers = {"Authorization": "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
files = {"file": open("statement.pdf", "rb")}
data = {"callback_url": "https://your-app.com/callback"}
response = requests.post(url, headers=headers, files=files, data=data)
print(response.json())
java
import java.io.File;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
HttpClient client = HttpClient.newHttpClient();
String boundary = "----FormBoundary" + System.currentTimeMillis();
File file = new File("statement.pdf");
String body = "--" + boundary + "\r\n"
+ "Content-Disposition: form-data; name=\"callback_url\"\r\n\r\n"
+ "https://your-app.com/callback\r\n"
+ "--" + boundary + "\r\n"
+ "Content-Disposition: form-data; name=\"file\"; filename=\"statement.pdf\"\r\n"
+ "Content-Type: application/pdf\r\n\r\n";
byte[] fileBytes = Files.readAllBytes(file.toPath());
byte[] bodyEnd = ("\r\n--" + boundary + "--\r\n").getBytes();
byte[] bodyBytes = new byte[body.getBytes().length + fileBytes.length + bodyEnd.length];
System.arraycopy(body.getBytes(), 0, bodyBytes, 0, body.getBytes().length);
System.arraycopy(fileBytes, 0, bodyBytes, body.getBytes().length, fileBytes.length);
System.arraycopy(bodyEnd, 0, bodyBytes, body.getBytes().length + fileBytes.length, bodyEnd.length);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://your-domain.com/AIService/bank_statement_parsing"))
.header("Authorization", "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(HttpRequest.BodyPublishers.ofByteArray(bodyBytes))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
csharp
using var client = new HttpClient();
using var form = new MultipartFormDataContent();
form.Add(new ByteArrayContent(File.ReadAllBytes("statement.pdf")), "file", "statement.pdf");
form.Add(new StringContent("https://your-app.com/callback"), "callback_url");
client.DefaultRequestHeaders.Add("Authorization", "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
var response = await client.PostAsync("https://your-domain.com/AIService/bank_statement_parsing", form);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
javascript
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const form = new FormData();
form.append('file', fs.createReadStream('statement.pdf'));
form.append('callback_url', 'https://your-app.com/callback');
const response = await axios.post(
'https://your-domain.com/AIService/bank_statement_parsing',
form,
{
headers: {
...form.getHeaders(),
'Authorization': 'as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}
}
);
console.log(response.data);
响应示例
json
{
"code": 1000,
"msg": "success",
"data": [
{
"page_index": 1,
"page_data": {
"global_fields": {
"accountName": "广州浩龙餐饮管理有限公司",
"bankName": "中国建设银行"
},
"detail_fields_list": [
{
"transAccount": "44050149110400002477",
"tradeDate": "2025-10-03",
"transNo": "578-440491104L0W06XW5IE",
"abstract": "电子转账",
"remark": "货款",
"counterpartyAccount": "01501271000000087",
"counterpartyName": "广州市白云区江高艳婷猪肉档",
"amountCredited": 0.0,
"amountDebited": 18900.0,
"balance": 6341.47,
"curName": "人民币元"
}
]
}
}
]
}
发票解析
识别增值税发票图片或 PDF 文件,自动提取发票代码、发票号码、开票日期等关键字段。
POST
/AIService/invoice_parsing
请求头参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| Authorization | string | 必填 | API Key,用于身份认证 |
请求体参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| file | file | 选填 | 上传的发票文件,支持格式:pdf、png、jpeg、jpg、bmp、gif;与 file_url 二选一 |
| file_url | string | 选填 | 文件 URL 地址,与 file 参数二选一 |
| callback_url | string | 选填 | 回调地址,任务完成后以 POST 方式推送结果 |
响应示例
json
{
"code": 1000,
"msg": "success",
"data": [
{
"page_index": 1,
"page_data": [
{
"fpdm": "",
"fphm": "25957000000004052544",
"kprq": "2025-11-06"
}
]
}
]
}
通用文件解析
提供通用文件识别解析能力,支持多种文档类型的内容提取。
POST
/AIService/file_parsing
请求头参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| Authorization | string | 必填 | API Key,用于身份认证 |
请求体参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| file | file | 选填 | 上传的文件,支持格式:pdf、png、jpeg、jpg、bmp、gif;与 file_url 二选一 |
| file_url | string | 选填 | 文件 URL 地址,与 file 参数二选一 |
| callback_url | string | 选填 | 回调地址,任务完成后以 POST 方式推送结果 |
异步结果查询
通过任务 ID 查询已提交识别任务的执行结果。建议在提交任务后间隔 5-10 秒开始轮询查询,直至获取结果或任务超时。
POST
/AIService/async_result
请求头参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| Authorization | string | 必填 | API Key,用于身份认证 |
请求体参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| task_id | string | 必填 | 提交任务时返回的任务唯一标识 |
请求示例
curl
curl -X POST "https://your-domain.com/AIService/async_result" \
-H "Authorization: as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-d "task_id=d339b5e4-0c72-46bd-a17b-f23c5a3500cd"
python
import requests
url = "https://your-domain.com/AIService/async_result"
headers = {"Authorization": "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
data = {"task_id": "d339b5e4-0c72-46bd-a17b-f23c5a3500cd"}
response = requests.post(url, headers=headers, data=data)
print(response.json())
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://your-domain.com/AIService/async_result"))
.header("Authorization", "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(HttpRequest.BodyPublishers.ofString("task_id=d339b5e4-0c72-46bd-a17b-f23c5a3500cd"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
csharp
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("task_id", "d339b5e4-0c72-46bd-a17b-f23c5a3500cd")
});
var response = await client.PostAsync("https://your-domain.com/AIService/async_result", content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
javascript
const axios = require('axios');
const response = await axios.post(
'https://your-domain.com/AIService/async_result',
{ task_id: 'd339b5e4-0c72-46bd-a17b-f23c5a3500cd' },
{
headers: {
'Authorization': 'as-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type': 'application/json'
}
}
);
console.log(response.data);
响应示例
json
{
"code": 1000,
"msg": "success",
"data": [
{
"page_index": 1,
"page_data": [...]
}
]
}
错误码列表
以下为云启智联AI服务返回的错误码及对应说明:
| 错误码 | 说明 | 处理建议 |
|---|---|---|
| 1000 | 处理成功 | 请求已成功处理 |
| 3000 | 未知的异常 | 请联系技术支持排查 |
| 3001 | 请求参数错误 | 请检查请求参数是否符合接口要求 |
| 3002 | 请求方式错误 | 请使用接口要求的 HTTP 方法 |
| 3003 | 请求异常 | 请检查网络连接或服务状态 |
| 3004 | 文件不存在 | 请确认 file 或 file_url 参数已正确传入 |
| 3005 | 不支持的文件格式 | 请上传支持的文件格式(pdf/png/jpeg/jpg/bmp/gif) |
| 3006 | 接口未找到 | 请检查接口路径是否正确 |
| 3007 | 任务尚未完成 | 任务正在处理中,请稍后重试查询 |
| 3008 | 任务执行异常 | 任务执行过程中发生异常,请重新提交 |
| 3009 | 不支持的单据类型 | 请确认上传的文件类型与调用接口匹配 |
| 3010 | 调用大模型接口时出现异常 | 模型服务暂不可用,请稍后重试 |
| 3011 | 自动切割时出现异常 | 文件切割失败,请检查文件质量后重试 |
| 3012 | 强制切换到自研模型 | 系统已自动切换识别模型 |
| 3013 | 自研模型超时 | 识别耗时过长,请稍后重试 |
| 3014 | 自研模型切割异常 | 文件处理异常,请检查文件格式后重试 |
| 3015 | URL 无效 | 请使用白名单内的 URL 地址 |
| 3016 | 请求频率太高 | 触发限流,请降低请求频率 |
| 3017 | 认证失败 | Authorization 无效或缺失,请检查 API Key |
| 3018 | 数据未找到 | 请求的数据不存在,请检查参数 |
| 3019 | 任务超时 | 任务超过最大处理时间,请重新提交 |
| 3020 | 回调失败 | 回调地址不可达,请检查回调服务状态 |
返回字段说明
回单识别字段
| 字段名 | 类型 | 是否可为空 | 描述 |
|---|---|---|---|
| bankName | string | 否 | 单据所属银行名称 |
| createDate | string | 否 | 交易或记账日期 |
| expendCustomer | string | 是 | 付款方名称 |
| expendAccount | string | 是 | 付款方账号 |
| incomeCustomer | string | 是 | 收款方名称 |
| incomeAccount | string | 是 | 收款方账号 |
| abstract | string | 是 | 摘要 |
| amount | float | 否 | 交易金额 |
| remark | string | 是 | 附言或备注 |
| transNo | string | 个别银行无 | 流水号、回单编号或校验码 |
| curName | string | 否 | 币种 |
| image_url | string | 否 | 回单图片地址 |
对账单全局字段
| 字段名 | 类型 | 是否可为空 | 描述 |
|---|---|---|---|
| accountName | string | 否 | 账户名称 |
| bankName | string | 否 | 对账单所属银行名称 |
| totalCreditAmount | float | 否 | 贷方总发生额 |
| totalDebitAmount | float | 否 | 借方总发生额 |
对账单明细字段
| 字段名 | 类型 | 是否可为空 | 描述 |
|---|---|---|---|
| transAccount | string | 是 | 交易账号 |
| tradeDate | string | 否 | 交易日期 |
| transNo | string | 是 | 交易流水号 |
| abstract | string | 是 | 摘要 |
| counterpartyAccount | string | 是 | 对方账号 |
| counterpartyName | string | 是 | 对方名称 |
| amountCredited | float | 是 | 贷方金额(转入金额) |
| amountDebited | float | 是 | 借方金额(转出金额) |
| balance | float | 是 | 余额 |
| remark | string | 是 | 备注 |
发票识别字段
| 字段名 | 类型 | 是否可为空 | 描述 |
|---|---|---|---|
| fpdm | string | 是 | 发票代码 |
| fphm | string | 是 | 发票号码 |
| kprq | string | 是 | 开票日期 |