斑斑低代码提供REST API,可用于读取、搜索、新增、修改和删除表单数据,也可以上传文件。
调用API前,需要先在应用中开启API服务。部分读取接口可以设置为公开访问,其他请求需要通过Key-Secret完成鉴权。
打开应用,点击右上角“应用设置”,然后进入“API 设置”。


API设置页面包含以下配置:
| 配置项 | 说明 |
|---|---|
| 开启API服务 | 开启后,当前应用才可以通过REST API访问 |
| 应用ID | 系统为应用生成的唯一ID |
| 应用别名 | 可代替应用ID使用,仅支持字母、数字、下划线和减号 |
| 应用API地址 | 当前应用的API基础地址,可以直接复制 |
| 表单ID | 系统为表单生成的唯一ID |
| 表单别名 | 可代替表单ID使用,同一应用内不能重复 |
| 公开读数据 | 开启后,该表单的GET请求不需要Key-Secret鉴权 |
应用API地址格式如下:
https://你的工作台地址/api/v1/:appId其中,:appId 可以使用应用ID,也可以使用应用别名。
修改API设置后,需要点击“保存”使配置生效。
除公开读取接口外,开放API使用Key-Secret进行请求鉴权。
以下请求必须进行Key-Secret校验:
| 请求类型 | 是否需要鉴权 |
|---|---|
| 获取应用内的所有表单 | 不需要 |
| 已开启“公开读数据”的GET请求 | 不需要 |
| 未开启“公开读数据”的GET请求 | 需要 |
| POST请求 | 需要 |
| PUT请求 | 需要 |
| DELETE请求 | 需要 |
Key和Secret由工作台管理员在工作台管理后台中查看。
仅工作台管理员可以查看或重置Key-Secret。重置后,原有Key和Secret会立即失效。
鉴权参数仅通过 URL 查询参数传递,不需要额外携带“Authorization”、“X-API-Key”等鉴权Header。请求体Header按接口要求设置:文件上传使用 “Content-Type: multipart/form-data”,JSON写入接口使用“Content-Type: application/json”。
需要鉴权的请求必须在URL查询参数中携带以下字段:
| 参数 | 类型 | 说明 |
|---|---|---|
key | String | 工作台管理后台中获取的Key |
timestamp | Number | 当前时间的 10 位秒级或 13 位毫秒级时间戳 |
sign | String | 根据Key、timestamp和Secret生成的MD5签名 |
服务端会校验时间戳。客户端时间与服务端时间相差超过60秒时,请求会被拒绝。
签名计算方式:
md5(key + timestamp + secret)例如:
key = demoKey123
secret = demoSecret456
timestamp = 1784253600
sign = 743a42bbe310a73837141ee4f2da2b9e完整鉴权参数:
--url-query "key=demoKey123"
--url-query "timestamp=1784253600"
--url-query "sign=743a42bbe310a73837141ee4f2da2b9e"示例时间戳仅用于说明。实际请求必须使用当前时间戳,并重新计算sign。
Secret不应写入浏览器前端代码或公开仓库,建议在服务端生成签名。
以下示例统一使用这些数据:
| 名称 | 示例值 |
|---|---|
| 工作台地址 | https://workspace.example.com |
| 应用ID | 4j815fmhht0j |
| 表单别名 | articles |
| 数据ID | stykuonikdfl |
| 示例字段别名 | title、description |
接口总览:
| Method | URL | 描述 |
|---|---|---|
| GET | /api/v1/:appId | 获取应用内的所有表单 |
| GET | /api/v1/:appId/:formId | 获取数据列表 |
| GET | /api/v1/:appId/:formId/:docId | 获取单条数据 |
| GET | /api/v1/:appId/:formId/toc | 获取目录树数据 |
| GET | /api/v1/:appId/:formId/search | 全文搜索表单数据 |
| POST | /api/v1/:appId/file | 上传文件 |
| POST | /api/v1/:appId/:formId | 创建数据 |
| PUT | /api/v1/:appId/:formId/:docId | 按数据ID修改数据 |
| PUT | /api/v1/:appId/:formId | 按筛选条件修改首条匹配数据 |
| DELETE | /api/v1/:appId/:formId/:docId | 删除数据 |
除id、createTime等系统字段外,其余字段名称取决于表单的字段别名。
开放API中常见的系统字段包括:
| 字段 | 说明 |
|---|---|
id | 数据ID |
createTime | 创建时间 |
updateTime | 最后更新时间 |
creator | 创建人 |
dataOwner | 数据归属人 |
status | 流程状态 |
| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j |
| Method | GET |
| 描述 | 获取应用内所有可通过开放API访问的表单 |
| 鉴权 | 不需要 |
无
无
curl "https://workspace.example.com/api/v1/4j815fmhht0j"| 字段 | 类型 | 说明 |
|---|---|---|
data | Array | 表单列表 |
data[].id | String | 表单ID |
data[].name | String | 表单别名 |
{
"data": [
{
"id": "frm_articles_01",
"name": "articles"
},
{
"id": "frm_categories_01",
"name": "categories"
}
]
}应用不存在或未开启API服务时返回HTTP 400:
{
"error": {
"code": 400,
"message": "API未启用"
}
}| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/articles |
| Method | GET |
| 描述 | 分页获取指定表单的数据列表 |
| 鉴权 | 取决于表单是否开启“公开读数据” |
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
filters | Object | 否 | 数据过滤条件 |
fields | String/Array | 否 | 指定返回字段 |
populate | String/Array | 否 | 展开关系、子表或用户字段 |
sort | String/Array | 否 | 排序字段,例如 createTime:desc |
pagination[page] | Number | 否 | 页码,默认 1 |
pagination[pageSize] | Number | 否 | 每页条数,默认 25 |
pagination[start] | Number | 否 | 起始下标 |
pagination[limit] | Number | 否 | 查询条数 |
key | String | 条件必填 | 未开启公开读数据时必填 |
timestamp | Number | 条件必填 | 未开启公开读数据时必填 |
sign | String | 条件必填 | 未开启公开读数据时必填 |
分页同时传入两种格式时,优先使用start/limit。
过滤支持以下操作符:
$eq、$ne、$gt、$gte、$lt、$lte、$in、$nin、
$all、$size、$like、$exists、$and、$or、$not无
curl --get "https://workspace.example.com/api/v1/4j815fmhht0j/articles"
--url-query "pagination[page]=1"
--url-query "pagination[pageSize]=2"
--url-query "sort=createTime:desc"未开启公开读数据时:
curl --get "https://workspace.example.com/api/v1/4j815fmhht0j/articles"
--url-query "pagination[page]=1"
--url-query "pagination[pageSize]=2"
--url-query "key=demoKey123"
--url-query "timestamp=1784253600"
--url-query "sign=743a42bbe310a73837141ee4f2da2b9e"| 字段 | 类型 | 说明 |
|---|---|---|
data | Array | 数据列表 |
data[].id | String | 数据ID |
data[].createTime | String/Number | 创建时间 |
data[].updateTime | String/Number | 更新时间 |
data[].title | Any | 示例表单字段 |
data[].description | Any | 示例表单字段 |
meta.pagination.page | Number | 当前页码 |
meta.pagination.pageSize | Number | 每页条数 |
meta.pagination.pageCount | Number | 总页数 |
meta.pagination.total | Number | 数据总数 |
除系统字段外,实际返回字段由表单字段别名以及fields、populate参数决定。
{
"data": [
{
"id": "u2i3s0pi1no7",
"title": "BMK Paris Bamako",
"description": "位于巴黎的餐厅",
"updateTime": "2026-07-17 10:05:00",
"createTime": "2026-07-17 10:05:00"
},
{
"id": "stykuonikdfl",
"title": "Biscotte Restaurant",
"description": "提供法式简餐",
"updateTime": "2026-07-17 10:00:00",
"createTime": "2026-07-17 10:00:00"
}
],
"meta": {
"pagination": {
"page": 1,
"pageSize": 2,
"pageCount": 1,
"total": 2
}
}
}未开启公开读数据且鉴权失败时返回HTTP 400:
{
"error": {
"code": 400,
"message": "key-secret校验未通过"
}
}| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/articles/stykuonikdfl |
| Method | GET |
| 描述 | 根据数据ID获取一条表单数据 |
| 鉴权 | 取决于表单是否开启“公开读数据” |
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
fields | String/Array | 否 | 指定返回字段 |
populate | String/Array | 否 | 展开关系、子表或用户字段 |
key | String | 条件必填 | 未开启公开读数据时必填 |
timestamp | Number | 条件必填 | 未开启公开读数据时必填 |
sign | String | 条件必填 | 未开启公开读数据时必填 |
无
curl --get "https://workspace.example.com/api/v1/4j815fmhht0j/articles/stykuonikdfl"
--url-query "fields[0]=id"
--url-query "fields[1]=title"
--url-query "fields[2]=description"| 字段 | 类型 | 说明 |
|---|---|---|
data | Object | 查询到的数据 |
meta | Object | 元数据,当前通常为空对象 |
{
"data": {
"id": "stykuonikdfl",
"title": "Biscotte Restaurant",
"description": "提供法式简餐"
},
"meta": {}
}应用或表单不存在时返回 HTTP 400:
{
"error": {
"code": 400,
"message": "表单不存在"
}
}数据ID不存在时,当前接口可能返回HTTP 200,但没有data:
{
"meta": {}
}调用方应检查响应中是否存在data。
| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/articles/toc |
| Method | GET |
| 描述 | 以目录树结构返回文档数据 |
| 鉴权 | 取决于表单是否开启“公开读数据” |
该接口仅适用于已配置文档目录视图的表单。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
filters | Object | 否 | 过滤文档数据 |
key | String | 条件必填 | 未开启公开读数据时必填 |
timestamp | Number | 条件必填 | 未开启公开读数据时必填 |
sign | String | 条件必填 | 未开启公开读数据时必填 |
无。
curl "https://workspace.example.com/api/v1/4j815fmhht0j/articles/toc"| 字段 | 类型 | 说明 |
|---|---|---|
data | Array | 目录树 |
data[].id | String | 目录或文档ID |
data[].title | String | 目录或文档标题 |
data[].type | String | catalog或document |
data[].children | Array | 子目录或文档 |
data[].createTime | String/Number | 创建时间 |
data[].updateTime | String/Number | 更新时间 |
meta | Object | 元数据 |
{
"data": [
{
"id": "cat_food",
"title": "餐饮",
"type": "catalog",
"createTime": "2026-07-17 09:00:00",
"updateTime": "2026-07-17 09:00:00",
"children": [
{
"id": "stykuonikdfl",
"title": "Biscotte Restaurant",
"type": "document",
"createTime": "2026-07-17 10:00:00",
"updateTime": "2026-07-17 10:00:00"
}
]
}
],
"meta": {}
}表单未配置文档目录视图时可能返回HTTP 400:
{
"error": {
"code": -1,
"message": "无法读取目录视图配置"
}
}| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/articles/search |
| Method | GET |
| 描述 | 根据关键词全文搜索指定表单 |
| 鉴权 | 取决于表单是否开启“公开读数据” |
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
query | String | 是 | 搜索关键词 |
pagination[page] | Number | 否 | 页码 |
pagination[pageSize] | Number | 否 | 每页条数 |
pagination[start] | Number | 否 | 起始下标 |
pagination[limit] | Number | 否 | 查询条数 |
key | String | 条件必填 | 未开启公开读数据时必填 |
timestamp | Number | 条件必填 | 未开启公开读数据时必填 |
sign | String | 条件必填 | 未开启公开读数据时必填 |
无
curl --get "https://workspace.example.com/api/v1/4j815fmhht0j/articles/search"
--url-query "query=Biscotte"
--url-query "pagination[page]=1"
--url-query "pagination[pageSize]=10"| 字段 | 类型 | 说明 |
|---|---|---|
data | Array | 搜索结果 |
meta.tokens | Array | 搜索关键词的分词结果 |
meta.pagination | Object | 当前分页参数 |
搜索接口当前不保证返回有效的total和pageCount。
{
"data": [
{
"id": "stykuonikdfl",
"title": "Biscotte Restaurant",
"description": "提供法式简餐",
"updateTime": "2026-07-17 10:00:00",
"createTime": "2026-07-17 10:00:00"
}
],
"meta": {
"tokens": [
"Biscotte"
],
"pagination": {
"page": 1,
"pageSize": 10
}
}
}表单不存在时返回 HTTP400:
{
"error": {
"code": 400,
"message": "表单不存在"
}
}| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/file |
| Method | POST |
| 描述 | 上传文件并返回文件信息 |
| Content-Type | multipart/form-data |
| 鉴权 | 需要 |
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
key | String | 是 | 工作台Key |
timestamp | Number | 是 | 当前时间戳 |
sign | String | 是 | MD5签名 |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
file | File | 是 | 需要上传的文件 |
文件字段名必须为file。
curl --request POST
--url "https://workspace.example.com/api/v1/4j815fmhht0j/file"
--url-query "key=demoKey123"
--url-query "timestamp=1784253600"
--url-query "sign=743a42bbe310a73837141ee4f2da2b9e"
--form "file=@./menu.pdf"| 字段 | 类型 | 说明 |
|---|---|---|
name | String | 原始文件名 |
uid | Number | 文件标识 |
status | String | 上传状态 |
size | Number | 文件大小,单位为字节 |
url | String | 相对于工作台域名的文件路径 |
md5 | String | 文件MD5 |
{
"name": "menu.pdf",
"uid": 1784253600123,
"status": "success",
"size": 125604,
"url": "uploads/4j815fmhht0j/0cc175b9c0f1b6a831c399e269772661.pdf",
"md5": "0cc175b9c0f1b6a831c399e269772661"
}鉴权失败时返回HTTP 400:
{
"error": {
"code": 400,
"message": "key-secret校验未通过"
}
}文件处理失败时,当前接口可能返回:
{
"url": null
}| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/articles |
| Method | POST |
| 描述 | 在指定表单中创建一条数据 |
| Content-Type | application/json |
| 鉴权 | 需要 |
未传入id时创建数据。传入已存在的id时,当前接口会更新对应数据;传入不存在的 id时会按该ID创建数据。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
key | String | 是 | 工作台Key |
timestamp | Number | 是 | 当前时间戳 |
sign | String | 是 | MD5签名 |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | Object | 是 | 需要创建的数据 |
data.title | Any | 否 | 示例字段,实际名称取决于字段别名 |
data.description | Any | 否 | 示例字段,实际名称取决于字段别名 |
curl --request POST \
--url "https://workspace.example.com/api/v1/4j815fmhht0j/articles"
--url-query "key=demoKey123"
--url-query "timestamp=1784253600"
--url-query "sign=743a42bbe310a73837141ee4f2da2b9e"
--header "Content-Type: application/json"
--data '{
"data": {
"title": "Biscotte Restaurant",
"description": "提供法式简餐"
}
}'| 字段 | 类型 | 说明 |
|---|---|---|
tableName | String | 表名 |
data | Array | 写入结果 |
success | Boolean | 是否成功 |
写接口返回的data按当前实现可能使用内部字段ID,与读取接口中的字段别名不同。
{
"tableName": "articles",
"data": [
{
"f_title_01": "Biscotte Restaurant",
"f_description_01": "提供法式简餐",
"_uuid": "stykuonikdfl",
"_create_time": "2026-07-17 10:00:00",
"_update_time": "2026-07-17 10:00:00",
"_data_stage": "normal"
}
],
"success": true
}f_title_01、f_description_01仅为内部字段ID示例,实际值由表单决定。
字段校验、权限或数据写入失败时返回HTTP 400:
{
"error": {
"code": -1,
"message": "数据校验失败"
}
}| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/articles/stykuonikdfl |
| Method | PUT |
| 描述 | 根据数据ID修改一条数据 |
| Content-Type | application/json |
| 鉴权 | 需要 |
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
key | String | 是 | 工作台Key |
timestamp | Number | 是 | 当前时间戳 |
sign | String | 是 | MD5签名 |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | Object | 是 | 需要修改的字段 |
data.title | Any | 否 | 示例字段 |
data.description | Any | 否 | 示例字段 |
curl --request PUT
--url "https://workspace.example.com/api/v1/4j815fmhht0j/articles/stykuonikdfl"
--url-query "key=demoKey123"
--url-query "timestamp=1784253600"
--url-query "sign=743a42bbe310a73837141ee4f2da2b9e"
--header "Content-Type: application/json"
--data '{
"data": {
"title": "Biscotte Restaurant(更新)",
"description": "更新后的餐厅介绍"
}
}'| 字段 | 类型 | 说明 |
|---|---|---|
tableName | String | 表名 |
data | Array | 修改后的数据 |
success | Boolean | 是否成功 |
{
"tableName": "articles",
"data": [
{
"f_title_01": "Biscotte Restaurant(更新)",
"f_description_01": "更新后的餐厅介绍",
"_uuid": "stykuonikdfl",
"_create_time": "2026-07-17 10:00:00",
"_update_time": "2026-07-17 10:30:00",
"_data_stage": "normal"
}
],
"success": true
}数据不存在或修改失败时返回HTTP 400:
{
"error": {
"code": -1,
"message": "更新数据失败"
}
}| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/articles |
| Method | PUT |
| 描述 | 根据过滤条件修改第一条匹配数据 |
| Content-Type | application/json |
| 鉴权 | 需要 |
当前接口不是批量修改接口。请使用能够唯一定位数据的过滤条件。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
filters | Object | 是 | 数据过滤条件 |
key | String | 是 | 工作台Key |
timestamp | Number | 是 | 当前时间戳 |
sign | String | 是 | MD5签名 |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | Object | 是 | 需要修改的字段 |
curl --request PUT \
--url "https://workspace.example.com/api/v1/4j815fmhht0j/articles"
--url-query 'filters[id][$eq]=stykuonikdfl'
--url-query "key=demoKey123"
--url-query "timestamp=1784253600"
--url-query "sign=743a42bbe310a73837141ee4f2da2b9e"
--header "Content-Type: application/json"
--data '{
"data": {
"description": "按筛选条件更新的餐厅介绍"
}
}'| 字段 | 类型 | 说明 |
|---|---|---|
tableName | String | 表单别名 |
data | Array | 修改后的数据 |
success | Boolean | 是否成功 |
{
"tableName": "articles",
"data": [
{
"id": "stykuonikdfl",
"title": "Biscotte Restaurant(更新)",
"description": "按筛选条件更新的餐厅介绍",
"updateTime": "2026-07-17 10:35:00",
"createTime": "2026-07-17 10:00:00"
}
],
"success": true
}没有数据符合过滤条件时,当前接口返回HTTP 200:
{
"tableName": "articles",
"data": [],
"success": true
}鉴权失败时返回HTTP 400:
{
"error": {
"code": 400,
"message": "key-secret校验未通过"
}
}| 项目 | 内容 |
|---|---|
| URL | https://workspace.example.com/api/v1/4j815fmhht0j/articles/stykuonikdfl |
| Method | DELETE |
| 描述 | 根据数据ID删除一条数据 |
| 鉴权 | 需要 |
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
key | String | 是 | 工作台 Key |
timestamp | Number | 是 | 当前时间戳 |
sign | String | 是 | MD5 签名 |
无
curl --request DELETE
--url "https://workspace.example.com/api/v1/4j815fmhht0j/articles/stykuonikdfl"
--url-query "key=demoKey123"
--url-query "timestamp=1784253600"
--url-query "sign=743a42bbe310a73837141ee4f2da2b9e"删除接口返回JSON,不是204空响应。
| 字段 | 类型 | 说明 |
|---|---|---|
tableName | String | 表名 |
success | Boolean | 删除请求是否成功 |
data | Array | 成功处理的数据 |
mutationApplied | Boolean | 是否已执行数据变更 |
partialSuccess | Boolean | 是否部分成功 |
successCount | Number | 成功数量 |
failedCount | Number | 失败数量 |
permissionDeniedCount | Number | 因权限不足失败的数量 |
successRows | Array | 成功数据 |
failedRows | Array | 失败数据 |
permissionDeniedRows | Array | 权限不足的数据 |
delegatedToTodo | Boolean | 是否进入审批任务 |
{
"tableName": "articles",
"success": true,
"data": [
{
"_uuid": "stykuonikdfl",
"f_title_01": "Biscotte Restaurant(更新)",
"f_description_01": "按筛选条件更新的餐厅介绍",
"_data_stage": "deleting"
}
],
"mutationApplied": true,
"partialSuccess": false,
"successCount": 1,
"failedCount": 0,
"permissionDeniedCount": 0,
"successRows": [
{
"_uuid": "stykuonikdfl",
"f_title_01": "Biscotte Restaurant(更新)",
"f_description_01": "按筛选条件更新的餐厅介绍",
"_data_stage": "deleting"
}
],
"failedRows": [],
"permissionDeniedRows": [],
"delegatedToTodo": false,
"delegatedRows": [],
"mutationAppliedRows": [
{
"_uuid": "stykuonikdfl",
"f_title_01": "Biscotte Restaurant(更新)",
"f_description_01": "按筛选条件更新的餐厅介绍",
"_data_stage": "deleting"
}
]
}如果删除操作需要进入审批流程,delegatedToTodo可能为true。
没有删除权限时,接口可能返回HTTP 200的业务失败结果:
{
"tableName": "articles",
"success": false,
"data": [],
"mutationApplied": false,
"partialSuccess": false,
"successCount": 0,
"failedCount": 1,
"permissionDeniedCount": 1,
"successRows": [],
"failedRows": [
{
"_uuid": "stykuonikdfl"
}
],
"permissionDeniedRows": [
{
"_uuid": "stykuonikdfl"
}
]
}鉴权失败时返回HTTP 400:
{
"error": {
"code": 400,
"message": "key-secret校验未通过"
}
}