文档

从你的智能体出发,想问谁就问谁。

你的智能体描述它需要什么(一份表单、一份调查,或者一个“是”或“否”),然后拿到一个链接:可以给一个人、给群组里的每个人,或给你分享到的任何人。大家在手机上打开,不用注册,回复会以经过校验的 JSON 返回给你。

  1. 创建请求。调用 createRequest,表单传入 JSON Schema,审批则传入理由。
  2. 发送链接。传入 sendEmail: true,我们会把链接用邮件发给每位指定收件人;你也可以通过现成的渠道发送(邮件、聊天或短信),或者在任何地方发布一个公开链接。
  3. 拿到回复。在 Builder 和 Pro 套餐上,每条回复一到,就会推送给你的 MCP 客户端。回复也会发到你的 Webhook,用 notifyEmail 发邮件通知,或者用 getStatus 读取。

同样的工具有两种用法:给会说 MCP 的智能体用的 MCP 服务器,以及适用于其他一切场景的 REST API。智能体可以在 llms.txt 里读到这份指南。

快速开始

从 API 密钥到对方的回复,只要四步。

1获取 API 密钥

用你的邮箱登录,在控制台里复制密钥。它以 sk_live_ 开头,请放在你的服务器上保管。用的是 Claude Code、Codex 或其他 MCP 客户端?跳过这一步:通过地址添加服务器,并在客户端里登录即可。

2创建请求

这个请求向 Jordan 询问收货地址和送货日期。schema 就是普通的 JSON Schema,支持哪些内容请看表单 schema。

3发送链接

响应的 links[] 里每人一个链接(公开链接则是单个 url)。设置 "sendEmail": true 后,我们会以你账号的名义,把各自的链接用邮件发给每位有邮箱的指定收件人。每个链接的 email 会说明发生了什么:"sent"、"failed"(请求仍然存在,之后可以调用 remind)、"limit"(已达到套餐的邮件上限)、"no address" 或 "off"。其余的人你想怎么发都行:邮件、聊天或短信。

4拿到回复

Jordan 提交后,你的 webhookUrl 会收到一个带有数据的 response.created 事件,数据已经按你的 schema 校验过。没有 Webhook?用 requestId 调用 getStatus,或者设置 notifyEmail,完成时我们给你发邮件;在 Builder 和 Pro 套餐上还可以通过 MCP 订阅,Jordan 一回复你的智能体就会收到通知。详见收到回复。

身份验证

每次 MCP 和 REST 调用都要把 API 密钥作为 bearer token 发送,同一个密钥两边通用。缺少或已吊销的密钥会返回 401。获取密钥有两种方式。

从你的 MCP 客户端登录

不带密钥添加 https://runitby.app/mcp,客户端会通过 OAuth 让你登录:浏览器会打开,你输入邮箱,登录链接会把你带回一个页面,请你允许该应用。第一次用?同一个链接会为你创建账号。之后应用会持有一个以它命名的专属密钥,你可以在密钥页面吊销。

  • Claude Code:运行右侧的命令,然后在 Claude Code 里输入 /mcp 并选择进行身份验证。
  • Codex:运行 codex mcp add,然后运行 codex mcp login。
  • Claude(网页版和桌面版):设置、连接器、添加自定义连接器,然后粘贴地址。
  • 其他支持 MCP 授权的客户端:添加地址,不带任何请求头。

在控制台里创建密钥

对于 REST API、脚本,以及只接受请求头的客户端:在控制台里创建和吊销密钥,并把密钥放在 Authorization 请求头里发送。

套餐会把这两种方式分开计数。Free 包含一个密钥和一个已连接的应用,Builder 各五个,Pro 按你需要的数量。

使用密钥的单文件示例:Vercel AI SDK、Mastra、LangChain.js 和 Claude Agent SDK。

工具与端点

每个 MCP 工具都有一个输入输出相同的 REST 端点。API 参考列出了每个字段。

MCP 工具 REST 作用
createRequest POST /requests 创建表单或审批并拿到链接;如果你要求,我们会替你发邮件。
previewRequest POST /requests/preview 对方将看到的内容的截图和检查提示。不会创建任何东西。
getStatus GET /requests/{id} 状态、审批结果和目前所有的回复。
listRequests GET /requests 你的请求,最新的在前。可按模式或状态筛选,用 cursor 翻页。
updateRequest PATCH /requests/{id} 修改内容、添加收件人或设置新的过期时间。
remind POST /requests/{id}/remind 把链接用邮件发给还没回复的人。
closeRequest DELETE /requests/{id} 停止接收回复。

表单与审批

每个请求都有一个 mode:

"form"
收集数据。你发送一个 schema,对方会得到据此生成的表单,你会拿回一个与之匹配的对象。
"approval"
拿到决定。你发送 approval.reason,每个人会看到一张带有“批准”和“拒绝”(或你自定义的标签)以及可选评论的卡片。你会拿到每个人的决定和一个总的 verdict。

两者都接受 title(最多 120 个字符)、一个可选的 requester 行(说明是谁在问)、用于页面及其邮件的 locale("en"、"es"、"pt"、"fr"、"de"、"it"、"ja" 或 "zh",也可以带地区,如 "es-AR",用于日期格式),以及会在每次 Webhook 和状态查询中原样返回的 metadata。标题和问题请用同一种语言来写。

谁来回复

audience 决定谁会拿到链接。

kind 你会得到 适用于
"named" links[],recipients 里每人一个(1 到 50 人,每人 { name, email?, phone? }) 需要确定是谁回复的场景。审批必须指定收件人。有了邮箱就能使用 sendEmail、提醒和邮件验证码。
"open" 任何人都能打开的一个 url 报名和调查。maxSubmissions 限制回复数量(默认 1)。

适用场景

一个模式加一个受众,就能覆盖你原本要用表单工具、投票、排期应用或邮件往来来做的大部分事情。

你想要 请求
一个人的详细信息:收货地址、客户信息收集、预约时段 "form",指定收件人,一位收件人
面向任何人的调查、投票、反馈或报名 "form",公开链接并设置 maxSubmissions。把这一个 url 发布到任何地方;getStatus 会返回所有回复,供你的智能体汇总。
已知人群的报名、空闲时间、排班代班或签到 "form",指定收件人(最多 50 人),这样每条回复都能对应到人,remind 还能去催其余的人
审批、确认和表决 带 policy 的 "approval";涉及金钱、访问或删除时,加上 verify: "email"

状态与过期

status 含义
pending 还没有人回复。
partial 部分指定收件人已回复,其他人还没有。
complete 所有人都已回复、已达到 maxSubmissions,或者审批已有审批结果。
expired 链接已超时。
closed 你调用了 closeRequest。

过期。expiresIn 可以是 "30m"、"48h"、"7d" 或秒数。默认 7 天,最长 90 天。

修改请求。在第一条回复到来之前,updateRequest 可以修改标题、schema、分组、理由或主题。添加收件人、设置新的过期时间(从现在起算)和修改 notifyEmail,在请求完成、过期或关闭之前都可以做。新添加的收件人不会收到邮件;请自己发送他们的链接,或者带上他们的 recipientIds 调用 remind。

提醒。remind 会把链接用邮件发给还没回复且有邮箱的指定收件人,每人每 24 小时最多一次。sendEmail 发的那封邮件算第一次。

收到回复。可以选其一,也可以组合使用:

webhookUrl
你的服务器会实时收到每条回复。详见 Webhook。
notifyEmail
我们会给你的账号发一封摘要邮件,附带控制台里该请求的链接:"each" 表示每条回复都发(直到达到套餐的邮件上限,之后只在结束时发),"complete" 表示只在完成或过期时发一次。审批邮件包含决定和评论;表单的回复则保留在控制台里。默认关闭,可以用 updateRequest 修改。
带 wait 的 getStatus
让调用最多挂起 25 秒(REST:?wait=25),有人回复或状态变化时立即返回。再调用一次就能继续等待。
MCP 推送(Builder 和 Pro)
每个请求都是 MCP 资源 runitby://requests/{requestId},createRequest 会返回指向它的链接;读取它得到的内容与 getStatus 相同。在 Builder 和 Pro 套餐上,采用 2026-07-28 协议的客户端可以用 subscriptions/listen 订阅,每条回复或状态变化都会收到 notifications/resources/updated,Builder 同一时间可打开一个订阅,Pro 最多可打开三个。在 Free 套餐上,subscriptions/listen 会返回一个错误,其中列出其他获知回复的方式。

表单 schema

就是普通的 JSON Schema,顶层为 type: "object",最多 40 个字段。required[] 会被强制执行,title 和 description 会成为标签和帮助文字。

类型 关键字
string format(email、date、time、date-time、tel、uri、duration)、minLength、maxLength、pattern
number, integer minimum, maximum
boolean const: true 会生成一个必须勾选的同意框
enum 固定的选项列表
array 元素为基本类型或 enum;可用 minItems、maxItems

提示。把每个字段的选项放在 "x-runitby" 里:widget、placeholder、help、columns(1 或 2)、step 和 currency。

分组。在 schema 旁边用 sections: [{ title, fields: [...] }] 把字段分组。

嵌套对象(位置字段除外)、oneOf、anyOf、allOf 和 $ref 会被拒绝,并附上说明该怎么改的消息。询问密码、PIN、银行卡号、CVV、安全码、社保号或一次性验证码的字段会被拒绝。

字段类型

为人们觉得不好输入的内容准备的现成字段。每一种都是普通的 JSON Schema 加一个 widget,所以回复和其他字段一样会被校验。

字段 Schema 回复
日期 string,format 为 date "2026-11-12"
时间 string,format 为 time;step 为分钟数(1–60) "14:30"
日期和时间 string,format 为 date-time "2026-11-12T14:30:00-08:00"
时长 string,format 为 duration "PT1H30M"
时间段 date-time 的 enum 数组,widget 为 slots 选中的时间
日期范围 含 2 个日期的数组,widget 为 daterange ["2026-11-12", "2026-11-15"]
位置 object,widget 为 location { latitude, longitude, accuracy }
金额 number,currency 为 "USD" 1200
滑块、评分 number 或 integer;滑块需要 minimum 和 maximum 7
标签、单选、下拉选择 enum(标签还接受 enum 数组) "M"
排序 enum 数组,widget 为 rank 所有选项,按对方排的顺序
是或否 boolean,widget 为 yesno true
颜色 string,widget 为 color "#C2410C"
国家 string,widget 为 country "US"(ISO 3166-1)
语言 string,widget 为 language "es-AR"(BCP 47)
时区 string,widget 为 timezone "America/New_York"

在国家或语言字段上加一个 enum,就能限定可选项。

预览

previewRequest 接受与 createRequest 相同的表单或审批字段(不含受众、过期时间、Webhook 和 metadata),返回 390 px 和 1280 px 宽度的截图,以及列出所有读起来不顺的地方的 lint[]。不会创建任何东西。

传入 sampleData 可以看到填好的表单,传入 viewports 则只获取一种尺寸。同一份表单要发很多次时,先预览。

主题

theme 能让页面看起来像你的产品。不设置的话,页面是暖白底色上的墨色文字,字体为 Figtree,标题用 Fraunces,圆角。

键 取值
accent, background, surface, text 十六进制颜色
font, headingFont system、Figtree、Geist、Inter、DM Sans、Manrope、Work Sans、Space Grotesk、IBM Plex Sans、Fraunces、Lora、Source Serif 4
radius sharp、soft、round
density compact、comfortable
layout stacked(所有字段在同一页)或 single(一次一个问题)
logoUrl 你的 logo
heroText, thankYou 表单上方的欢迎语和提交之后的消息

审批选项

审批需要指定收件人:每个人都有自己的链接,所以每个决定都能对应到本人。审批结果是 "approved"、"declined",或者在没人及时决定时为 "expired";绝不会是默默的同意。

审批字段 默认值 说明
reason必填 你要请对方批准的事项,最多 300 个字符。
detail 理由下方的补充说明,最多 1,000 个字符。
policy "all" "any"、"all"、"majority" 或 { n }:需要多少人批准。
options 批准、拒绝 两到四个标签;第一个算作批准。决定会以 snake_case 返回:“Approve with changes” → "approve_with_changes"。
allowComment true 允许对方在决定时附上评论。
showOthers false "names" 或 "counts" 会让每个人看到其他人的进度。
verify false "email":每个人要先确认发到自己邮箱的 6 位验证码,按钮才能用,所以转发出去的链接没法替他做决定。每位收件人都需要有邮箱。涉及金钱、访问或删除时使用。

Webhook

在请求上设置 webhookUrl(https),我们就会针对两种事件向它 POST JSON:

response.created
每次提交或决定,回复内容在 response 里。
request.completed
每位指定收件人都已回复、已达到 maxSubmissions、审批已有审批结果,或者请求已过期。

验证签名。X-Runitby-Signature 是用你账号的签名密钥(在控制台里)对原始请求体计算的十六进制 HMAC-SHA256。X-Runitby-Timestamp 是以 Unix 秒表示的发送时间。

重试。10 秒内返回任意 2xx 即视为送达。否则会重试 4 次,分别在每次失败后的 1 分钟、5 分钟、30 分钟和 2 小时。之后,回复仍然可以通过 getStatus 查到。

错误

错误以 JSON 返回,带有可读的 message;对于无效输入,还有 problems[],指向每个需要修改的字段。智能体通常只看消息就能修正请求。

状态 何时出现
400 输入或 schema 无效。
401 缺少 API 密钥,或密钥已被吊销。
404 你的账号下没有该 id 的请求。
409 不再允许这项修改,例如在第一条回复之后编辑,或提醒已关闭的请求。
429 每分钟创建超过 60 个,或者套餐的每月请求数已用完。

套餐与限额

Free Builder Pro
每月请求数 250 2,000 10,000
每个公开链接的回复数 25 10,000 不限
API 密钥 1 5 不限
已连接的应用(OAuth) 1 5 不限
送达后保留回复的时间 30 天 90 天 一直保留
每月邮件数 500 4,000 20,000
每个请求的邮件数 10 10 10
MCP 推送(打开的订阅数) — 1 3
月费 $0 $9 $29

超过每月上限后,createRequest 会返回 429,直到周期重置或你升级套餐(Pro 套餐是合理使用上限,需要更多请联系我们);已发出的链接仍然可用。没有 Webhook 时,回复会从提交时起算保留。详见定价。

我们代你发送的邮件(链接、提醒和 notifyEmail 通知)同时计入两项邮件上限。超过其中任一项后,链接会以 "limit" 返回,由你自己发送,"each" 通知也会停止。告知请求已结束的邮件始终会发送,审批验证码不计入。

所有套餐通用:每个 API 密钥每分钟最多创建 60 个请求,title 最多 120 个字符,approval.reason 最多 300 个,approval.detail 最多 1,000 个,metadata 不超过 4 KB。

对于你所收集的数据,你是数据控制者。只询问任务需要的内容。