版本:v1.0 更新日期:2026-05-20 基础 URL:
http://{host}:{port}(部署后由标注平台提供具体地址)
app_id 和 app_secret/api/v1/open
所有接口返回如下 JSON 结构:
{
"code": 0,
"message": "success",
"data": { ... }
}
| 字段 | 类型 | 说明 |
|---|---|---|
code |
int | 业务状态码,0 表示成功,非 0 表示失败 |
message |
string | 提示信息 |
data |
object | 业务数据,失败时为 null |
接入标注平台后,会分配一对凭证:
| 字段 | 类型 | 说明 |
|---|---|---|
app_id |
string | 应用唯一标识 |
app_secret |
string | 应用密钥,仅在创建时展示一次,请妥善保存 |
每次请求获取 Token 时,需使用 HMAC-SHA256 对请求参数签名:
signature = HMAC-SHA256(
key = app_secret,
message = app_id + timestamp + nonce
)
参数说明:
| 参数 | 说明 |
|---|---|
timestamp |
当前 Unix 时间戳(秒),与服务器时间差不能超过 5 分钟 |
nonce |
16 位随机字符串,每次请求不同,用于防重放 |
signature |
十六进制编码的签名结果 |
| 序号 | 方法 | 路径 | 说明 | 认证方式 |
|---|---|---|---|---|
| 1 | POST | /api/v1/open/auth/token |
获取 Access Token | API Key 签名 |
| 2 | POST | /api/v1/open/auth/refresh |
刷新 Access Token | Bearer Token |
| 3 | GET | /api/v1/open/projects |
查询项目列表 | Bearer Token |
| 4 | GET | /api/v1/open/projects/{project_id} |
查询项目详情 | Bearer Token |
| 5 | POST | /api/v1/open/projects/{project_id}/datasets/download |
数据集下载 | Bearer Token |
| 6 | GET | /api/v1/open/datasets/downloads/{download_token} |
获取下载文件 | Bearer Token |
请求
POST /api/v1/open/auth/token
请求头
| Header | 类型 | 必录 | 说明 |
|---|---|---|---|
X-Api-Key |
string | 是 | 申请的 app_id |
X-Signature |
string | 是 | HMAC-SHA256 签名(十六进制) |
X-Timestamp |
string | 是 | Unix 时间戳(秒) |
X-Nonce |
string | 是 | 16 位随机字符串 |
请求体:无
响应示例
{
"code": 0,
"message": "success",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 7200
}
}
错误码
| HTTP 状态码 | error_code | 说明 |
|---|---|---|
| 401 | INVALID_API_KEY | app_id 不存在 |
| 401 | APP_DISABLED | 应用已被禁用 |
| 401 | INVALID_SIGNATURE | 签名验证失败 |
| 401 | TIMESTAMP_EXPIRED | 时间戳过期(超过 5 分钟) |
| 401 | NONCE_USED | Nonce 已被使用 |
请求
POST /api/v1/open/auth/refresh
请求头
| Header | 类型 | 必录 | 说明 |
|---|---|---|---|
Authorization |
string | 是 | Bearer {access_token} |
请求体:无
响应示例
{
"code": 0,
"message": "success",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 7200
}
}
请求
GET /api/v1/open/projects
请求头
| Header | 类型 | 必录 | 说明 |
|---|---|---|---|
Authorization |
string | 是 | Bearer {access_token} |
查询参数
| 参数 | 类型 | 必录 | 说明 |
|---|---|---|---|
name |
string | 否 | 项目名称(模糊匹配) |
type |
string | 否 | 项目类型:image(图片)/ text(文本) |
status |
string | 否 | 项目状态筛选 |
page |
int | 否 | 页码,默认 1 |
page_size |
int | 否 | 每页数量,默认 20,最大 100 |
响应示例
{
"code": 0,
"message": "success",
"data": {
"items": [
{
"project_id": "proj_abc123def456",
"project_name": "商品图片分类标注",
"description": "对电商平台商品图片进行分类标注",
"project_type": "image",
"task_type": "image_classification",
"status": "in_progress",
"created_by": "admin",
"created_at": "2026-05-10T10:30:00",
"updated_at": "2026-05-15T14:20:00",
"task_count": 500,
"completed_task_count": 350
}
],
"total": 1,
"page": 1,
"page_size": 20,
"total_pages": 1,
"has_next": false,
"has_prev": false
}
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
project_id |
string | 项目唯一标识 |
project_name |
string | 项目名称 |
description |
string | 项目描述 |
project_type |
string | 项目类型:image(图片)/ text(文本) |
task_type |
string | 具体任务类型(见下方映射表) |
status |
string | 项目状态:draft / configuring / ready / in_progress / completed |
created_by |
string | 项目创建人用户名 |
created_at |
string | 创建时间(ISO 8601) |
updated_at |
string | 最后更新时间(ISO 8601) |
task_count |
int | 总任务数 |
completed_task_count |
int | 已完成任务数 |
任务类型映射表
task_type |
project_type |
说明 |
|---|---|---|
text_classification |
text |
文本分类 |
ner |
text |
命名实体识别 |
image_classification |
image |
图片分类 |
object_detection |
image |
目标检测 |
polygon |
image |
多边形标注 |
请求
GET /api/v1/open/projects/{project_id}
路径参数
| 参数 | 类型 | 必录 | 说明 |
|---|---|---|---|
project_id |
string | 是 | 项目 ID |
请求头
| Header | 类型 | 必录 | 说明 |
|---|---|---|---|
Authorization |
string | 是 | Bearer {access_token} |
响应示例
{
"code": 0,
"message": "success",
"data": {
"project_id": "proj_abc123def456",
"project_name": "商品图片分类标注",
"description": "对电商平台商品图片进行分类标注",
"project_type": "image",
"task_type": "image_classification",
"status": "in_progress",
"created_by": "admin",
"created_at": "2026-05-10T10:30:00",
"updated_at": "2026-05-15T14:20:00",
"task_count": 500,
"completed_task_count": 350,
"assigned_task_count": 500,
"completion_percentage": 70.0
}
}
错误码
| HTTP 状态码 | error_code | 说明 |
|---|---|---|
| 404 | PROJECT_NOT_FOUND | 项目不存在 |
请求
POST /api/v1/open/projects/{project_id}/datasets/download
路径参数
| 参数 | 类型 | 必录 | 说明 |
|---|---|---|---|
project_id |
string | 是 | 项目 ID |
请求头
| Header | 类型 | 必录 | 说明 |
|---|---|---|---|
Authorization |
string | 是 | Bearer {access_token} |
请求体
| 参数 | 类型 | 必录 | 说明 |
|---|---|---|---|
format |
string | 是 | 数据集格式(见下方格式说明) |
completed_only |
boolean | 否 | 是否只导出已完成的任务,默认 true |
支持的数据集格式
format 值 |
数据类型 | 格式说明 |
|---|---|---|
alpaca |
文本 | Alpaca 指令微调格式 |
sharegpt |
文本 | ShareGPT 对话格式 |
json |
图片 | 平台原生 JSON 格式 |
csv |
图片 | CSV 表格格式 |
coco |
图片 | COCO 目标检测格式 |
yolo |
图片 | YOLO 目标检测格式 |
pascal_voc |
图片 | PascalVOC XML 格式 |
请求示例
{
"format": "coco",
"completed_only": true
}
响应示例
{
"code": 0,
"message": "success",
"data": {
"project_id": "proj_abc123def456",
"format": "coco",
"total_exported": 350,
"file_url": "/api/v1/open/datasets/downloads/dl_abc123",
"file_name": "proj_abc123def456_coco_20260517_143000.json",
"file_size": 2048576,
"expires_at": "2026-05-17T16:30:00",
"status": "completed"
}
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
project_id |
string | 项目 ID |
format |
string | 导出格式 |
total_exported |
int | 导出的任务数量 |
file_url |
string | 文件下载链接(相对路径,需拼接基础 URL) |
file_name |
string | 文件名 |
file_size |
int | 文件大小(字节) |
expires_at |
string | 下载链接过期时间(ISO 8601),2 小时后过期 |
status |
string | 导出状态:completed / failed |
错误码
| HTTP 状态码 | error_code | 说明 |
|---|---|---|
| 400 | INVALID_FORMAT | 不支持的导出格式 |
| 400 | FORMAT_NOT_COMPATIBLE | 格式与项目类型不兼容 |
| 404 | PROJECT_NOT_FOUND | 项目不存在 |
| 404 | NO_DATA_AVAILABLE | 项目中没有可导出的数据 |
| 500 | EXPORT_FAILED | 导出失败 |
请求
GET /api/v1/open/datasets/downloads/{download_token}
拿到 4.5 接口返回的 file_url 后,调用此接口下载实际文件。
路径参数
| 参数 | 类型 | 必录 | 说明 |
|---|---|---|---|
download_token |
string | 是 | 下载令牌(从 4.5 接口返回的 file_url 中提取) |
请求头
| Header | 类型 | 必录 | 说明 |
|---|---|---|---|
Authorization |
string | 是 | Bearer {access_token} |
响应
Content-Type: application/octet-stream 或对应格式的 MIME typeContent-Disposition: attachment; filename="..."错误码
| HTTP 状态码 | error_code | 说明 |
|---|---|---|
| 410 | DOWNLOAD_EXPIRED | 下载链接已过期 |
| 404 | NOT_FOUND | 下载资源不存在 |
| code | error_code | HTTP 状态码 | 说明 |
|---|---|---|---|
| 0 | SUCCESS | 200 | 请求成功 |
| 1000 | INTERNAL_ERROR | 500 | 服务器内部错误 |
| 1001 | INVALID_REQUEST | 400 | 请求参数无效 |
| 1002 | UNAUTHORIZED | 401 | 未认证或认证过期 |
| code | error_code | HTTP 状态码 | 说明 |
|---|---|---|---|
| 2001 | INVALID_API_KEY | 401 | app_id 不存在 |
| 2002 | APP_DISABLED | 401 | 应用已被禁用 |
| 2003 | INVALID_SIGNATURE | 401 | 签名验证失败 |
| 2004 | TIMESTAMP_EXPIRED | 401 | 时间戳过期 |
| 2005 | NONCE_USED | 401 | Nonce 已被使用 |
| 2006 | TOKEN_EXPIRED | 401 | Access Token 已过期 |
| 2007 | TOKEN_INVALID | 401 | Access Token 无效 |
| code | error_code | HTTP 状态码 | 说明 |
|---|---|---|---|
| 3001 | PROJECT_NOT_FOUND | 404 | 项目不存在 |
| 3002 | INVALID_FORMAT | 400 | 不支持的导出格式 |
| 3003 | FORMAT_NOT_COMPATIBLE | 400 | 格式与项目类型不兼容 |
| 3004 | NO_DATA_AVAILABLE | 404 | 项目中没有可导出的数据 |
| 3005 | EXPORT_FAILED | 500 | 导出失败 |
| 3006 | DOWNLOAD_EXPIRED | 410 | 下载链接已过期 |
# 1. 获取 Token
curl -X POST http://localhost:8003/api/v1/open/auth/token \
-H "X-Api-Key: app_id_xxx" \
-H "X-Signature: abc123..." \
-H "X-Timestamp: 1716000000" \
-H "X-Nonce: a1b2c3d4e5f6g7h8"
# 2. 查询项目列表
curl -X GET "http://localhost:8003/api/v1/open/projects?page=1&page_size=20" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
# 3. 下载数据集
curl -X POST http://localhost:8003/api/v1/open/projects/proj_xxx/datasets/download \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"format": "coco", "completed_only": true}'
# 4. 下载文件
curl -X GET http://localhost:8003/api/v1/open/datasets/downloads/dl_abc123 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
file_url 2 小时后过期,请及时下载nonce 必须不同,重复使用会被拒绝alpaca / sharegpt 格式,图片项目只能使用 json / csv / coco / yolo / pascal_voc 格式