API 接口
使用开发者 API 和 Webhook 实现自定义集成。
API 接口
Mobyform 提供 RESTful API,让开发者通过编程方式管理表单、读取数据和实现自定义集成。
需要 Pro 及以上套餐
认证
API 密钥
- 进入 「设置」 → 「开发者」
- 点击 「生成 API 密钥」
- 复制并妥善保管密钥
使用方式
在请求头中携带 API 密钥:
Authorization: Bearer YOUR_API_KEY密钥管理
- 创建多个 API 密钥
- 为密钥设置权限范围
- 随时撤销密钥
- 查看密钥使用情况
主要 API
表单管理
| 接口 | 方法 | 说明 |
|---|---|---|
/api/forms | GET | 获取表单列表 |
/api/forms/:key | GET | 获取表单详情 |
/api/forms | POST | 创建表单 |
/api/forms/:key | PUT | 更新表单 |
/api/forms/:key | DELETE | 删除表单 |
表单数据
| 接口 | 方法 | 说明 |
|---|---|---|
/api/forms/:key/data | GET | 获取提交数据列表 |
/api/forms/:key/data/:id | GET | 获取单条数据详情 |
/api/forms/:key/data | POST | 新增提交数据 |
/api/forms/:key/data/:id | PUT | 更新提交数据 |
/api/forms/:key/data/:id | DELETE | 删除提交数据 |
数据查询参数
| 参数 | 类型 | 说明 |
|---|---|---|
page | number | 页码 |
size | number | 每页数量 |
sort | string | 排序字段 |
order | string | 排序方向(asc/desc) |
filter | object | 筛选条件 |
Webhook
配置 Webhook
通过 API 或管理面板配置 Webhook:
{
"url": "https://your-server.com/webhook",
"events": ["form_data_add", "form_data_update", "form_data_delete"],
"headers": {
"X-Custom-Header": "value"
}
}Webhook 事件
| 事件 | 触发时机 |
|---|---|
form_data_add | 新数据提交 |
form_data_update | 数据被修改 |
form_data_delete | 数据被删除 |
Webhook 请求体
{
"event": "form_data_add",
"formKey": "abc123",
"data": {
"id": "data_001",
"fields": {
"name": "张三",
"email": "zhangsan@example.com"
},
"createdAt": "2024-01-15T10:30:00Z"
}
}验证 Webhook
验证 Webhook 请求的合法性,确保来自 Mobyform:
- 检查请求来源 IP
- 验证签名头(如果配置)
速率限制
API 请求受速率限制保护:
| 套餐 | 限制 |
|---|---|
| Pro | 1,000 次/月 |
| Business | 10,000 次/月 |
| Enterprise | 自定义 |
超过限制后会返回 429 Too Many Requests。
错误处理
HTTP 状态码
| 状态码 | 说明 |
|---|---|
200 | 请求成功 |
201 | 创建成功 |
400 | 请求参数错误 |
401 | 未授权(API 密钥无效) |
403 | 权限不足 |
404 | 资源不存在 |
429 | 请求过于频繁 |
500 | 服务器内部错误 |
错误响应格式
{
"error": {
"code": "INVALID_REQUEST",
"message": "描述错误原因"
}
}代码示例
cURL — 获取表单列表
# 分页获取所有表单
curl -X GET "https://api.mobyform.com/api/forms?page=1&size=10" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"JavaScript/Node.js — 获取表单数据
// 获取指定表单的提交数据
const response = await fetch(
'https://api.mobyform.com/api/forms/abc123/data?page=1&size=20',
{
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
}
);
const result = await response.json();
console.log(`提交总数: ${result.total}`);
console.log('数据:', result.data);Python — 创建表单提交
import requests
# 向表单提交数据
url = "https://api.mobyform.com/api/forms/abc123/data"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
}
payload = {
"fields": {
"name": "李四",
"email": "lisi@example.com",
"feedback": "产品体验很棒!"
}
}
response = requests.post(url, json=payload, headers=headers)
print(f"状态码: {response.status_code}")
print(f"创建结果: {response.json()}")分页
所有列表接口均支持通过 page 和 size 查询参数进行分页。
page— 要获取的页码(从 1 开始)size— 每页返回的条目数(默认:20,最大:100)
请求示例:
GET /api/forms?page=2&size=10响应示例:
{
"data": [...],
"total": 56,
"page": 2,
"size": 10,
"totalPages": 6
}如果未提供分页参数,API 默认使用 page=1、size=20。
错误码
API 在响应体中使用结构化错误码,帮助你以编程方式处理错误:
| 错误码 | 名称 | 说明 |
|---|---|---|
INVALID_REQUEST | 无效请求 | 请求体或参数格式不正确 |
AUTHENTICATION_FAILED | 认证失败 | API 密钥缺失、无效或已过期 |
PERMISSION_DENIED | 权限不足 | API 密钥没有所需的权限范围 |
RESOURCE_NOT_FOUND | 资源不存在 | 请求的表单、提交或资源不存在 |
RATE_LIMITED | 请求频率超限 | 已超过允许的请求次数 |
VALIDATION_ERROR | 校验错误 | 提交的数据未通过字段校验规则 |
INTERNAL_ERROR | 内部错误 | 服务器发生意外错误,请稍后重试 |
Webhook 签名验证
配置 Webhook 密钥后,Mobyform 会使用 HMAC-SHA256 对每次 Webhook 请求的内容进行签名。签名会通过 X-Webhook-Signature 请求头发送。你应当验证此签名以确认请求的真实性。
Node.js 验证
const crypto = require('crypto');
function verifyWebhookSignature(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload, 'utf8')
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}
// 在 Express 处理器中使用
app.post('/webhook', (req, res) => {
const signature = req.headers['x-webhook-signature'];
const rawBody = JSON.stringify(req.body);
if (!verifyWebhookSignature(rawBody, signature, 'YOUR_WEBHOOK_SECRET')) {
return res.status(401).send('签名无效');
}
// 处理 Webhook 事件
console.log('已验证事件:', req.body.event);
res.status(200).send('OK');
});Python 验证
import hmac
import hashlib
def verify_webhook_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode('utf-8'),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
# 在 Flask 处理器中使用
@app.route('/webhook', methods=['POST'])
def handle_webhook():
signature = request.headers.get('X-Webhook-Signature', '')
if not verify_webhook_signature(request.data, signature, 'YOUR_WEBHOOK_SECRET'):
return '签名无效', 401
event = request.json
print(f"已验证事件: {event['event']}")
return 'OK', 200最佳实践
- 妥善保管密钥 — 不要将 API 密钥暴露在前端代码中
- 处理错误 — 实现完善的错误处理和重试逻辑
- 遵守速率限制 — 合理控制请求频率
- 使用 Webhook — 优先使用 Webhook 获取实时通知,而非轮询 API