云启智联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 是调用接口的唯一凭证,请妥善保管,不要将其暴露在客户端代码或公共仓库中。如怀疑泄露,请立即在管理面板中禁用并重新创建。

回调机制

所有识别类接口均为异步执行模式。您可以通过以下两种方式获取任务结果:

  1. 主动查询:提交任务后获取 task_id,通过 async_result 接口主动轮询查询结果。
  2. 被动回调:提交任务时在 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 开票日期