Tally.so API:程序化表单创建 - Openclaw Skills
作者:互联网
2026-04-07
什么是 Tally Forms API 集成?
此技能为与 Tally.so REST API 交互提供技术接口,允许开发者自动创建和修改在线表单。通过利用 Openclaw Skills,用户可以绕过手动构建器,直接通过代码生成复杂的数据收集工具。
该集成专注于模块化的区块架构。每个表单组件——从标题和文本输入到复选框和下拉菜单——都被视为一个独立的区块。这些区块使用唯一的组标识符关联,确保标签和输入字段在程序化更新期间保持逻辑连接。
下载入口:https://github.com/openclaw/skills/tree/main/skills/yujesyoga/tally
安装与下载
1. ClawHub CLI
从源直接安装技能的最快方式。
npx clawhub@latest install tally
2. 手动安装
将技能文件夹复制到以下位置之一
全局模式~/.openclaw/skills/
工作区
/skills/
优先级:工作区 > 本地 > 内置
3. 提示词安装
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 tally。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
Tally Forms API 集成 应用场景
- 在购买事件后自动生成客户满意度调查。
- 根据产品发布,通过程序化更新带有新问题的反馈表单。
- 构建根据外部数据源自适应结构的动态问卷。
- 为 Tally 表单配置创建自动备份和版本控制系统。
- 获取并处理表单提交数据,用于实时分析仪表板。
- 使用从本地配置文件检索的 API 密钥安全地验证请求。
- 使用 GET 请求获取现有表单结构,以评估当前的区块布局。
- 使用标准化的区块架构定义新的表单元素,确保应用正确的 groupUuid 和 groupType。
- 向 Tally API 发送 PATCH 请求,使用新的 JSON 负载更新表单结构。
- 通过检查区块数量或检索表单元数据来验证更新,确保成功部署。
Tally Forms API 集成 配置指南
要开始使用此技能,请配置您的 API 凭据并使用以下命令结构:
# 存储您的 API 密钥
mkdir -p ~/.config/tally
echo "YOUR_API_KEY" > ~/.config/tally/api_key
# 设置环境变量
TALLY_KEY=$(cat ~/.config/tally/api_key)
# 备份和更新模式
curl -s "https://api.tally.so/forms/{FORM_ID}" -H "Authorization: Bearer $TALLY_KEY" > backup.json
curl -s "https://api.tally.so/forms/{FORM_ID}" -X PATCH -H "Authorization: Bearer $TALLY_KEY" -H "Content-Type: application/json" -d @form_update.json
Tally Forms API 集成 数据架构与分类体系
Tally API 将数据组织为扁平的区块数组。在 Openclaw Skills 实现中请遵循以下架构指南:
| 属性 | 描述 |
|---|---|
uuid |
每个区块的唯一字符串(例如 q1-input)。 |
type |
功能区块类型(HEADING_1, INPUT_TEXT 等)。 |
groupUuid |
将多个区块链接到单个逻辑问题。 |
payload |
包含内容,例如用于文本的 safeHTMLSchema 或必填标志。 |
index |
确定选择区块中选项的显示顺序。 |
name: tally
version: 1.0.0
description: Create and edit Tally forms via API. Use when building surveys, feedback forms, or questionnaires programmatically. Supports all question types including text inputs, multiple choice, checkboxes, ratings (via workaround), and more.
Tally Forms API
Create and edit Tally.so forms programmatically via their REST API.
Authentication
TALLY_KEY=$(cat ~/.config/tally/api_key)
Endpoints
| Action | Method | Endpoint |
|---|---|---|
| List forms | GET | https://api.tally.so/forms |
| Get form | GET | https://api.tally.so/forms/{id} |
| Update form | PATCH | https://api.tally.so/forms/{id} |
| Get submissions | GET | https://api.tally.so/forms/{id}/submissions |
Block Structure
Tally forms are composed of blocks. Questions require multiple blocks grouped by groupUuid:
{
"uuid": "q1-title",
"type": "TITLE",
"groupUuid": "group-q1",
"groupType": "QUESTION",
"payload": {
"safeHTMLSchema": [["Question text here", [["tag", "span"]]]]
}
},
{
"uuid": "q1-input",
"type": "INPUT_TEXT",
"groupUuid": "group-q1",
"groupType": "QUESTION",
"payload": {"isRequired": true}
}
Key: TITLE block + input block must share the same groupUuid.
Block Types
Structure
FORM_TITLE- Form title and submit buttonTEXT- Paragraph textHEADING_1,HEADING_2,HEADING_3- Section headersTITLE- Question label (inside QUESTION group)DIVIDER- Separator line
Inputs
INPUT_TEXT- Short textINPUT_NUMBER- NumberINPUT_EMAIL- EmailINPUT_DATE- Date pickerINPUT_PHONE_NUMBER- PhoneTEXTAREA- Long text
Selection
MULTIPLE_CHOICE_OPTION- Single select (groupType: MULTIPLE_CHOICE)CHECKBOX- Multi select (groupType: CHECKBOXES)DROPDOWN_OPTION- Dropdown option
?? Types that don't render well via API
RATING- Stars don't displayLINEAR_SCALE- Scale doesn't display
Workaround: Use MULTIPLE_CHOICE_OPTION with star emojis.
Examples
Form title
{
"uuid": "title-001",
"type": "FORM_TITLE",
"groupUuid": "group-title",
"groupType": "FORM_TITLE",
"payload": {
"title": "My Survey",
"button": {"label": "Submit"}
}
}
Section header
{
"uuid": "sec1-head",
"type": "HEADING_2",
"groupUuid": "group-sec1",
"groupType": "TEXT",
"payload": {
"safeHTMLSchema": [["?? Section Title", [["tag", "span"]]]]
}
}
Text input question
{
"uuid": "q1-title",
"type": "TITLE",
"groupUuid": "group-q1",
"groupType": "QUESTION",
"payload": {
"safeHTMLSchema": [["What is your name?", [["tag", "span"]]]]
}
},
{
"uuid": "q1-input",
"type": "INPUT_TEXT",
"groupUuid": "group-q1",
"groupType": "QUESTION",
"payload": {"isRequired": true}
}
Multiple choice (single answer)
{
"uuid": "q2-title",
"type": "TITLE",
"groupUuid": "group-q2",
"groupType": "QUESTION",
"payload": {
"safeHTMLSchema": [["How did you hear about us?", [["tag", "span"]]]]
}
},
{
"uuid": "q2-opt1",
"type": "MULTIPLE_CHOICE_OPTION",
"groupUuid": "group-q2",
"groupType": "MULTIPLE_CHOICE",
"payload": {"isRequired": true, "index": 0, "isFirst": true, "isLast": false, "text": "Social media"}
},
{
"uuid": "q2-opt2",
"type": "MULTIPLE_CHOICE_OPTION",
"groupUuid": "group-q2",
"groupType": "MULTIPLE_CHOICE",
"payload": {"isRequired": true, "index": 1, "isFirst": false, "isLast": true, "text": "Friend referral"}
}
Checkboxes (multiple answers)
{
"uuid": "q3-title",
"type": "TITLE",
"groupUuid": "group-q3",
"groupType": "QUESTION",
"payload": {
"safeHTMLSchema": [["What features interest you?", [["tag", "span"]]]]
}
},
{
"uuid": "q3-cb1",
"type": "CHECKBOX",
"groupUuid": "group-q3",
"groupType": "CHECKBOXES",
"payload": {"index": 0, "isFirst": true, "isLast": false, "text": "Feature A"}
},
{
"uuid": "q3-cb2",
"type": "CHECKBOX",
"groupUuid": "group-q3",
"groupType": "CHECKBOXES",
"payload": {"index": 1, "isFirst": false, "isLast": true, "text": "Feature B"}
}
Rating scale (workaround with stars)
{
"uuid": "q4-title",
"type": "TITLE",
"groupUuid": "group-q4",
"groupType": "QUESTION",
"payload": {
"safeHTMLSchema": [["How would you rate our service?", [["tag", "span"]]]]
}
},
{
"uuid": "q4-opt1",
"type": "MULTIPLE_CHOICE_OPTION",
"groupUuid": "group-q4",
"groupType": "MULTIPLE_CHOICE",
"payload": {"isRequired": true, "index": 0, "isFirst": true, "isLast": false, "text": "? Poor"}
},
{
"uuid": "q4-opt2",
"type": "MULTIPLE_CHOICE_OPTION",
"groupUuid": "group-q4",
"groupType": "MULTIPLE_CHOICE",
"payload": {"isRequired": true, "index": 1, "isFirst": false, "isLast": false, "text": "?? Fair"}
},
{
"uuid": "q4-opt3",
"type": "MULTIPLE_CHOICE_OPTION",
"groupUuid": "group-q4",
"groupType": "MULTIPLE_CHOICE",
"payload": {"isRequired": true, "index": 2, "isFirst": false, "isLast": false, "text": "??? Good"}
},
{
"uuid": "q4-opt4",
"type": "MULTIPLE_CHOICE_OPTION",
"groupUuid": "group-q4",
"groupType": "MULTIPLE_CHOICE",
"payload": {"isRequired": true, "index": 3, "isFirst": false, "isLast": false, "text": "???? Very good"}
},
{
"uuid": "q4-opt5",
"type": "MULTIPLE_CHOICE_OPTION",
"groupUuid": "group-q4",
"groupType": "MULTIPLE_CHOICE",
"payload": {"isRequired": true, "index": 4, "isFirst": false, "isLast": true, "text": "????? Excellent"}
}
Update Command
TALLY_KEY=$(cat ~/.config/tally/api_key)
# Backup first
curl -s "https://api.tally.so/forms/{ID}" r
-H "Authorization: Bearer $TALLY_KEY" > /tmp/backup.json
# Update
curl -s "https://api.tally.so/forms/{ID}" r
-X PATCH r
-H "Authorization: Bearer $TALLY_KEY" r
-H "Content-Type: application/json" r
-d @/tmp/form.json
# Verify
curl -s "https://api.tally.so/forms/{ID}" r
-H "Authorization: Bearer $TALLY_KEY" | jq '.blocks | length'
Best Practices
- Always backup before modifying a form
- Use descriptive UUIDs (q1-title, q1-input, sec1-head)
- Section titles: Use lowercase with emoji prefix (?? General feedback)
- For ratings: Use MULTIPLE_CHOICE with ? emojis instead of RATING type
- Verify after update: Check block count matches expected
相关推荐
专题
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
最新数据
相关文章
Windsurf Cascade:高级 AI 编程智能体与 IDE 工作流 - Openclaw Skills
tg-history:高效的 Telegram 聊天记录提取 - Openclaw Skills
ResearchVault:高速代理研究引擎 - Openclaw Skills
Vault:本地研究编排与状态管理 - Openclaw Skills
ResearchVault:自主研究编排 - Openclaw Skills
WordCount:高精度文本与文件指标 - Openclaw Skills
Korail Manager:KTX 和 SRT 订票自动化 - Openclaw Skills
MailCaduceus:企业级邮件生命周期管理 - Openclaw Skills
风格润色器:AI 驱动的消息改写与语气调整 - Openclaw Skills
EVE Online 物品搜索:通过 Openclaw Skills 查询游戏资产
AI精选
