ClawCall — Phone Calls for Your Agent
ClawCall gives your agent a real phone number connected to a telephony
service (Twilio). Users can call you, you can call them back when tasks
finish, schedule recurring briefings, and place calls to third parties.
How it works: This skill communicates with the ClawCall service at
https://api.clawcall.online. All connections are outbound from your
machine, so no public URL or inbound webhook is required.
Operating rules
- - Prefer the local HTTP bridge for real-time phone calls.
- Treat direct CLI mode as fallback or debugging only.
- Keep exactly one bridge and one listener running at a time.
- Verify the bridge before testing calls.
- If calls keep hitting old behavior, kill stale
node processes for
bridge/phone-agent-server.js and
listener/clawcall-listener.js,
then restart cleanly.
- - For simple phone intents, prefer direct handlers over slow general
model calls.
See references/setup.md for the full runtime and troubleshooting guide.
First-Time Setup
If CLAWCALL_API_KEY is not yet set, guide the user through registration:
- 1. Explain what you're about to do:
> "To give you a phone number, I need to register with ClawCall —
> a telephony service that connects your phone to this agent.
> ClawCall will store your phone number to route incoming calls to you.
> You can delete your account at any time."
- 2. Ask for their phone number:
> "What phone number should I register? This is the number you'll
> call me from. (E.164 format, e.g. +14155550100)"
- 3. Call the registration endpoint:
CODEBLOCK0
- 4. Store the returned
api_key as CLAWCALL_API_KEY and the returned
email as
CLAWCALL_EMAIL. Both are needed for account recovery.
- 5. Confirm setup with the user:
> "Done! Your ClawCall number is
{phone_number}.
> Call it from {their phone} to talk to me.
>
(Free tier: calls must come from your registered number.)"
- 6. Start the phone bridge and listener:
For production, prefer the lightweight HTTP bridge instead of the
full openclaw agent CLI path. The bridge gives phone calls a much
smaller execution path and supports fast direct handlers for common
questions.
Startup order matters:
1. Start the bridge.
2. Verify GET /health works.
3. Start the listener with CLAWCALL_AGENT_URL set.
4. Make one short test call.
Windows
CODEBLOCK1
Mac / Linux
CODEBLOCK2
Bridge defaults:
- CLAWCALL_AGENT_HOST=127.0.0.1
- CLAWCALL_AGENT_PORT=4747
- CLAWCALL_PHONE_MODEL_MODE=gateway
- CLAWCALL_PHONE_TIMEOUT_MS=25000
- CLAWCALL_PHONE_MODEL optional override
The bridge exposes:
- GET /health
- INLINECODE19
Current fast-path coverage in the bridge:
- name / identity questions
- greetings
- “how are you”
- cron-job questions
- task-status questions
Questions outside those direct handlers still use the bridge’s model
fallback. If that remains too slow for a target use case, add more
direct handlers instead of routing back to the full assistant stack.
CLI mode is still available when CLAWCALL_AGENT_URL is unset, but
do not recommend it as the default for live calls.
Starting and verifying runtime
The skill ships two runtime pieces:
- - INLINECODE21
- INLINECODE22
The listener must be running for calls to work. The bridge should be
running first whenever CLAWCALL_AGENT_URL is set.
Minimum verification steps after startup:
- 1. Bridge log says it is listening on
127.0.0.1:4747. - Listener log says
Agent mode: HTTP. - A test call like “what is your name?” gets a spoken answer.
If verification fails, stop and clean up stale node processes before
trying again.
Receiving Inbound Calls
When using the listener script (the normal setup), the listener polls
ClawCall for you and passes each caller's speech directly to this agent
via --message. Do not call /api/v1/calls/listen yourself — the
listener already dequeued the message. Just answer the user's question
naturally and exit. The listener captures your output and relays it back.
Advanced: receiving calls without the listener script
If you are integrating ClawCall without clawcall-listener.js, poll
for incoming messages manually:
CODEBLOCK3
Response when a call is waiting:
CODEBLOCK4
Response when no call is waiting (timeout):
CODEBLOCK5
After receiving a message, submit your response:
CODEBLOCK6
Set "end_call": true to hang up after speaking your response.
Set "end_call": false to keep the line open for follow-up.
Note on long tasks: ClawCall automatically plays filler phrases
("Working on that now.", "Just a sec.", etc.) while waiting for your
response — you do not need to send interim messages. Simply respond
when ready; the line stays active.
Message prefixes
| Prefix | Meaning |
|---|
| (plain text) | Normal inbound call from user |
| INLINECODE32 |
A scheduled call fired — deliver the briefing |
|
[THIRD PARTY CALL] | Opening turn of an autonomous third-party call |
|
[THIRD PARTY SAYS]: <text> | Third party's response — continue the conversation |
|
[THIRD PARTY COMPLETE] | Third-party call ended — JSON transcript follows |
Calling the User Back (Pro tier)
When a background task finishes and you need to notify the user by phone:
CODEBLOCK7
If allow_followup is true, the user can ask follow-up questions after
the message. Those replies arrive via /calls/listen as normal.
Requires Pro tier.
Scheduling a Recurring Call (Pro tier)
CODEBLOCK8
Common patterns: every weekday 8am "0 8 * * 1-5" · daily 9am "0 9 * * *".
To cancel: INLINECODE40
Requires Pro tier.
Calling a Third Party (Pro tier)
CODEBLOCK9
ClawCall dials the number and forwards the conversation turn-by-turn via
/calls/listen. Set "end_call": true when the objective is complete.
Requires Pro tier.
Account & Usage
CODEBLOCK10
Returns tier, minutes used, minutes remaining, and assigned phone number.
Changing Voice
CODEBLOCK11
Available voices: aria (default) · joanna · matthew · amy · brian · emma · olivia
Upgrading to Pro or Team
Payment is accepted in USDC on Solana mainnet.
Step 1 — Get payment address and amount:
CODEBLOCK12
Step 2 — Send USDC to the wallet address returned above.
Step 3 — Submit transaction signature to confirm:
CODEBLOCK13
Tier upgrades instantly on confirmation.
Recovering a Lost API Key
Re-register with the same email to rotate the key:
CODEBLOCK14
Returns a fresh api_key. Save it as CLAWCALL_API_KEY.
Tier Limits
| Tier | Minutes/month | Callbacks | Scheduled | 3rd Party | Agents |
|---|
| Free | 10 | No | No | No | 1 |
| Pro |
120 | Yes | Yes | Yes | 1 |
| Team | 500 (pooled) | Yes | Yes | Yes | 5 |
Overage: $0.05/min beyond included minutes (Pro/Team only).
ClawCall — 为你的智能体提供电话通话功能
ClawCall为你的智能体提供一个与电话服务(Twilio)相连的真实电话号码。用户可以给你打电话,你可以在任务完成时回拨给他们,安排定期简报,以及向第三方拨打电话。
工作原理: 该技能与位于 https://api.clawcall.online 的 ClawCall 服务通信。所有连接均从你的机器向外发起,因此无需公共URL或入站Webhook。
操作规则
- - 优先使用本地HTTP桥接进行实时电话通话。
- 将直接CLI模式视为备用或仅用于调试。
- 每次只保持一个桥接和一个监听器运行。
- 在测试通话前验证桥接是否正常。
- 如果通话持续出现旧行为,请终止 bridge/phone-agent-server.js 和 listener/clawcall-listener.js 的陈旧 node 进程,然后重新干净启动。
- 对于简单的电话意图,优先使用直接处理器而非缓慢的通用模型调用。
完整运行时和故障排除指南请参见 references/setup.md。
首次设置
如果尚未设置 CLAWCALLAPIKEY,请引导用户完成注册:
- 1. 解释你将要做什么:
> 为了给你一个电话号码,我需要向 ClawCall 注册——这是一个将你的电话与此智能体连接的电话服务。ClawCall 将存储你的电话号码,以便将来电路由给你。你可以随时删除你的账户。
- 2. 询问他们的电话号码:
> 我应该注册哪个电话号码?这是你将用来给我打电话的号码。(E.164格式,例如 +14155550100)
- 3. 调用注册端点:
POST https://api.clawcall.online/api/v1/register
Content-Type: application/json
{
phone_number: <用户的E.164格式电话号码>,
agent_name: <你的智能体名称>
}
- 4. 将返回的 apikey 存储为 CLAWCALLAPIKEY,将返回的 email 存储为 CLAWCALLEMAIL。两者都是账户恢复所必需的。
- 5. 向用户确认设置:
> 完成!你的 ClawCall 号码是
{phone_number}。
> 从 {他们的电话} 拨打该号码即可与我通话。
>
(免费套餐:通话必须来自你注册的号码。)
- 6. 启动电话桥接和监听器:
对于生产环境,优先使用轻量级HTTP桥接,而不是完整的 openclaw agent CLI路径。桥接为电话通话提供了更小的执行路径,并支持常见问题的快速直接处理器。
启动顺序很重要:
1. 启动桥接。
2. 验证 GET /health 是否正常工作。
3. 设置 CLAWCALLAGENTURL 后启动监听器。
4. 进行一次简短测试通话。
Windows
set CLAWCALLAGENTURL=http://127.0.0.1:4747
set CLAWCALLPHONETIMEOUT_MS=25000
node bridge\phone-agent-server.js
node listener\clawcall-listener.js
Mac / Linux
export CLAWCALLAGENTURL=http://127.0.0.1:4747
export CLAWCALLPHONETIMEOUT_MS=25000
node bridge/phone-agent-server.js
node listener/clawcall-listener.js
桥接默认值:
- CLAWCALLAGENTHOST=127.0.0.1
- CLAWCALLAGENTPORT=4747
- CLAWCALLPHONEMODEL_MODE=gateway
- CLAWCALLPHONETIMEOUT_MS=25000
- CLAWCALLPHONEMODEL 可选覆盖
桥接暴露的端点:
- GET /health
- POST /clawcall/message
桥接中当前的快速路径覆盖范围:
- 姓名/身份问题
- 问候语
- 你好吗
- 定时任务问题
- 任务状态问题
这些直接处理器之外的问题仍使用桥接的模型回退。如果对于目标用例来说仍然太慢,请添加更多直接处理器,而不是路由回完整的助手堆栈。
当 CLAWCALLAGENTURL 未设置时,CLI模式仍然可用,但不要将其推荐为实时通话的默认模式。
启动和验证运行时
该技能包含两个运行时组件:
- - bridge/phone-agent-server.js
- listener/clawcall-listener.js
监听器必须运行才能进行通话。每当设置了 CLAWCALLAGENTURL 时,桥接应首先运行。
启动后的最小验证步骤:
- 1. 桥接日志显示正在监听 127.0.0.1:4747。
- 监听器日志显示 Agent mode: HTTP。
- 测试通话如你叫什么名字?得到语音回答。
如果验证失败,在重试之前停止并清理陈旧的 node 进程。
接收入站通话
当使用监听器脚本时(正常设置),监听器为你轮询 ClawCall,并通过 --message 将每个来电者的语音直接传递给此智能体。不要自己调用 /api/v1/calls/listen——监听器已经将消息出队。只需自然地回答用户的问题然后退出。监听器会捕获你的输出并将其中继回去。
高级:不使用监听器脚本接听电话
如果你在没有 clawcall-listener.js 的情况下集成 ClawCall,请手动轮询入站消息:
GET https://api.clawcall.online/api/v1/calls/listen?timeout=25
Authorization: Bearer {CLAWCALLAPIKEY}
有通话等待时的响应:
json
{
ok: true,
call_sid: CA...,
message: 今天天气怎么样?
}
没有通话等待时的响应(超时):
json
{ ok: true, timeout: true }
收到消息后,提交你的回复:
POST https://api.clawcall.online/api/v1/calls/respond/{call_sid}
Authorization: Bearer {CLAWCALLAPIKEY}
Content-Type: application/json
{
response: 纽约现在72°F,天气晴朗。,
end_call: false
}
设置 end_call: true 可在说完回复后挂断。
设置 end_call: false 可保持线路畅通以便后续提问。
关于长时间任务的说明: ClawCall 会在等待你的回复时自动播放填充短语(正在处理。、请稍等。等)——你无需发送中间消息。只需在准备好时回复即可;线路保持活动状态。
消息前缀
| 前缀 | 含义 |
|---|
| (纯文本) | 来自用户的正常入站通话 |
| [SCHEDULED] <上下文> |
定时通话触发——提供简报 |
| [THIRD PARTY CALL] | 自主第三方通话的开始轮次 |
| [THIRD PARTY SAYS]: <文本> | 第三方的回复——继续对话 |
| [THIRD PARTY COMPLETE] | 第三方通话结束——JSON转录文本跟随 |
回拨用户(Pro套餐)
当后台任务完成且你需要通过电话通知用户时:
POST https://api.clawcall.online/api/v1/calls/outbound/callback
Authorization: Bearer {CLAWCALLAPIKEY}
Content-Type: application/json
{
message: 你的部署已完成。3个服务已更新,0个错误。,
allow_followup: true
}
如果 allow_followup 为 true,用户在收到消息后可以提出后续问题。这些回复会像往常一样通过 /calls/listen 到达。
需要Pro套餐。
安排定期通话(Pro套餐)
POST https://api.clawcall.online/api/v1/calls/schedule
Authorization: Bearer {CLAWCALLAPIKEY}
Content-Type: application/json
{
cron: 0 8 1-5,
label: 早间简报,
task_context: 总结我的日历、重要邮件和待办任务,
timezone: America/New_York
}
常见模式:每个工作日早上8点 0 8 1-5 · 每天上午9点 0 9 *。
要取消:DELETE https://api.clawcall.online/api/v1/calls/schedule/{id}
需要Pro套餐。
呼叫第三方(Pro套餐)
POST https://api.clawcall.online/api/v1/calls/outbound/third-party
Authorization: Bearer {CLAWCALLAPIKEY}
Content-Type: application/json
{
to_number: +141555