Add Phone Calls to Your OpenClaw Agent
What You're Building
Your OpenClaw agent can run shell commands, browse the web, manage files, and call APIs. At some point it hits a task that requires an actual phone call — book an appointment, verify insurance, follow up on an order, check if a restaurant can seat six on Friday.
This post gives you an AgentPhone skill for OpenClaw. It's a SKILL.md file that teaches the agent how to place phone calls using curl. Drop it in your skills directory, restart OpenClaw, and the agent has phone capability.
Prerequisites:
- A running OpenClaw instance (any model provider)
curlinstalled (it already is)- An AgentPhone API key (get one free — 5 calls, no credit card)
The Skill
OpenClaw skills are folders containing a SKILL.md file. The YAML frontmatter declares the skill's name, description, and requirements. The markdown body contains instructions the agent follows.
Create ~/.openclaw/skills/agentphone/SKILL.md:
---
name: agentphone
description: Place real phone calls to businesses or people. Use when a task requires calling someone — booking appointments, verifying information, following up on orders, getting quotes, or checking availability. The call is handled by a voice AI. Returns outcome, summary, and transcript.
metadata:
{
"openclaw":
{
"emoji": "📞",
"requires": { "env": ["AGENTPHONE_API_KEY"], "bins": ["curl", "jq"] },
"primaryEnv": "AGENTPHONE_API_KEY",
},
}
---
# AgentPhone — Place Phone Calls
Place real phone calls to businesses. Send a phone number and objective, get
back a structured result with outcome, summary, and full transcript.
## When to Use
- Book appointments at businesses without online booking
- Verify insurance coverage or account status
- Follow up on orders, deliveries, or invoices
- Get quotes or pricing from vendors
- Check business hours, availability, or stock
- Cancel subscriptions or services (capture confirmation numbers)
## API Details
- Base URL: `https://agentphone.app/api/v1`
- Auth header: `x-api-key: $AGENTPHONE_API_KEY`
- US/Canada numbers only (E.164 format: +1 followed by 10 digits)
- Calls take 30-120 seconds
## Workflow
### Step 1: Create the call
```bash
curl -s -X POST "https://agentphone.app/api/v1/calls" \
-H "x-api-key: $AGENTPHONE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to_phone_number": "+14155551234",
"objective": "OBJECTIVE_HERE",
"business_name": "BUSINESS_NAME_HERE"
}'
Response returns data.call_id and status: "queued".
Step 2: Poll until done
curl -s "https://agentphone.app/api/v1/calls/CALL_ID" \
-H "x-api-key: $AGENTPHONE_API_KEY" | jq '.data.status'
Poll every 4 seconds. Terminal statuses: completed, failed, canceled.
Step 3: Read the result
When status is completed, the response includes:
outcome:achieved,not_achieved, orpartialoutcome_details: why the outcome was what it wassummary: 2-3 sentence description of what happenedtranscript: full conversation textduration_seconds: call length
Full single-command example
# Create call and extract call_id
CALL_ID=$(curl -s -X POST "https://agentphone.app/api/v1/calls" \
-H "x-api-key: $AGENTPHONE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to_phone_number": "+14155551234",
"objective": "Book a dental cleaning, morning preferred, patient name Sarah Chen",
"business_name": "Pacific Heights Dental"
}' | jq -r '.data.call_id')
# Poll until terminal status
while true; do
STATUS=$(curl -s "https://agentphone.app/api/v1/calls/$CALL_ID" \
-H "x-api-key: $AGENTPHONE_API_KEY" | jq -r '.data.status')
if [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ] || [ "$STATUS" = "canceled" ]; then
break
fi
sleep 4
done
# Get final result
curl -s "https://agentphone.app/api/v1/calls/$CALL_ID" \
-H "x-api-key: $AGENTPHONE_API_KEY" | jq '.data | {status, outcome, summary, transcript}'
Writing Good Objectives
Be specific. Include names, dates, reference numbers, and relevant context.
Good: "Book a dental cleaning for Sarah Chen. Preferred dates: March 20 or 21, morning. Insurance: Delta Dental PPO."
Bad: "Book an appointment."
Good: "Follow up on purchase order PO-2847, placed February 28. Ask for delivery ETA and whether 500 units ship together or split."
Bad: "Check on our order."
Handling Outcomes
achieved: Objective accomplished. Report confirmed details to the user.not_achieved: Call connected but objective failed. Checkoutcome_detailsfor the reason (fully booked, wrong department, etc.) and suggest alternatives.partial: Some progress made. Report what was accomplished and what remains.failedstatus: Call didn't connect. Suggest retrying later.
Never retry a failed call without asking the user first.
That's the entire skill — YAML frontmatter for gating, markdown instructions for behavior. No code to compile, no SDK to install. OpenClaw reads the `SKILL.md` and knows how to place phone calls.
## Install It
### Option 1: Local skill (recommended)
```bash
mkdir -p ~/.openclaw/skills/agentphone
# Save the SKILL.md above to this directory
Skills in ~/.openclaw/skills/ are available to every OpenClaw session.
Option 2: Workspace skill
mkdir -p ./skills/agentphone
# Save the SKILL.md to your project's skills/ directory
Workspace skills override local skills and are scoped to the project.
Set the API key
Add AGENTPHONE_API_KEY to your environment. You can set it globally:
export AGENTPHONE_API_KEY="your_api_key_here"
Or configure it in openclaw.json:
{
"skills": {
"entries": {
"agentphone": {
"enabled": true,
"env": {
"AGENTPHONE_API_KEY": "your_api_key_here"
}
}
}
}
}
Restart OpenClaw after adding the skill. Skills snapshot when sessions begin.
Using It
Once installed, OpenClaw sees the agentphone skill in its system prompt. When a task requires a phone call, the agent follows the skill's workflow — creates the call with curl, polls for results, and reports back.
You: "Call Acme Parts at +15105557890 and check if they have hydraulic valve model HV-200 in stock. I need 12 units."
OpenClaw: Runs curl to create the call with the objective, polls until completed, reads the result.
OpenClaw: "Called Acme Parts. They have 47 units of the HV-200 in stock at $234.50 each. Ships same day if ordered before 3 PM Pacific."
What You Can Build
- Personal assistant — "Book my haircut, cancel my gym membership, and check if my dry cleaning is ready." Three calls, one message.
- Research — "Call five restaurants and ask about private dining for 20 people on April 5th. Compile the options." Web search for numbers, sequential calls, structured comparison.
- Procurement — "Follow up on the three overdue purchase orders in this spreadsheet." Read the file, make three calls, update the spreadsheet with ETAs.
- Lead qualification — "Call these five leads and verify their contact info and interest level. Update the CRM." Read CRM data, sequential calls, write results back.
- Healthcare coordination — "Verify insurance, then schedule the appointment, then send the patient a confirmation." Three sequential calls with data flowing between them.
Getting Started
Get an API key at agentphone.app (5 free calls). Full API reference at agentphone.app/docs.
Other frameworks: OpenAI Agents SDK | LangChain | CrewAI | MCP
