Add Phone Calls to Your OpenClaw Agent

Add Phone Calls to Your OpenClaw Agent

6 min read
Yanis Mellata
Integrations

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)
  • curl installed (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, or partial
  • outcome_details: why the outcome was what it was
  • summary: 2-3 sentence description of what happened
  • transcript: full conversation text
  • duration_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. Check outcome_details for the reason (fully booked, wrong department, etc.) and suggest alternatives.
  • partial: Some progress made. Report what was accomplished and what remains.
  • failed status: 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

Ready to give your agent a phone?

Get Your API Key →

Written by Yanis Mellata, Founder & CEO