Your agent can make phone calls now.
ClawCall turns one HTTP request into a real conversation with a real human, then hands back the transcript. Your agent pays $0.25 in USDC over x402 — no signup, no API key, no invoice.
- $0.25 a call
- Any US number
- Transcript returned
POST /api/call{ "phoneNumber": "+1937…", "prompt": "What are your hours?" } 402 Payment Required → sign → 202 Accepted- Per outbound call
- $0.25
- Settled in USDC on Base at request time.
- API keys to provision
- 0
- x402 replaces signup, auth, and invoicing.
- Request to transcript
- ~45s
- Typical short business enquiry, end to end.
- Inbound number lease
- 30 min
- A live number your AI answers, then releases.
Four moves from request to transcript
The whole protocol is HTTP. Ask, pay on the retry, poll, read. Nothing to install and nothing to keep warm.
Dial any US number and get back a turn-by-turn transcript of what was said.
- 1
Ask for the call
POST a number and a prompt. The first response is a 402 carrying x402 payment requirements.
{ "phoneNumber": "+1937…", "prompt": "Your hours?"} - 2
Pay in the retry
Re-send the request with a signed X-PAYMENT header. $0.25 of USDC settles on Base before the phone rings.
POST /api/callX-PAYMENT: <signed> - 3
Take the ticket
A 202 hands back a callId and a poll URL. The call is already dialing.
{ "callId": "5f1c…", "status": "initiating"} - 4
Read the transcript
Poll every few seconds until the status is completed, then read the transcript and duration.
{ "status": "completed", "duration": 41}
Paste this, make a call
Any HTTP client works. These use an x402-aware client so the 402 retry is handled for you.
# awal signs the x402 payment for younpx awal@latest x402 pay https://www.clawcall.xyz/api/call \ -X POST \ -d '{"phoneNumber": "+19375387033", "prompt": "What are your hours today?"}' # then poll for the transcriptcurl https://www.clawcall.xyz/api/call/<callId> | jqBuilt for agents that act, not just answer
Everything an autonomous caller needs, and nothing it has to be configured around.
Pay per call, not per month
x402 settles USDC on Base at request time. No account, no card on file, no minimum spend, nothing to cancel.
Both directions
Dial out to any US number, or lease a number that answers on your behalf. Same payment rail, same transcript shape.
Transcripts, not recordings
Every call returns a turn-by-turn transcript and a duration, ready to hand straight back to your model.
Prompt screening
Claude Haiku rejects harassment and prank calls with a 422 before anything dials. It fails open, so real traffic is never blocked by a gateway blip.
Voice that behaves
Telnyx NaturalHD voices open with your question and stay terse — no repeating back, no filler, no wasted seconds.
Docs an agent can eat
The whole API fits in one markdown brief. Copy it into a context window and your agent is ready to call.
Discoverable on the bazaar
Agents find ClawCall on their own through the x402 bazaar — no integration announcement required.
Observable by default
Structured pino logs, OpenTelemetry traces through an OTel sidecar, and Sentry capture on every unhandled path.
You pay for calls. That is the whole model.
Priced in USDC, settled on Base, charged only when a request is actually served. No subscription exists to forget about.
Outbound call
$0.25per call
One request, one call, one transcript.
- Any US number in E.164 format
- Prompt up to 2,000 characters
- Turn-by-turn transcript and duration
- Free polling on GET /api/call/:id
Inbound number
$1.00per 30 minutes
A live number your AI answers, for as long as you need it.
- Dedicated number for the full lease
- Unlimited calls answered while active
- Transcript for every caller
- Release early for free at any time
Six endpoints, three of them free
Only the two that place calls cost anything. Polling, status, and release never charge.
Outbound
- POST
/api/callPlace an outbound AI call. Returns 202 with a callId and poll URL.$0.25 - GET
/api/call/:idPoll call status, transcript, and duration.Free
Inbound
- POST
/api/inbound/reserveLease a phone number for 30 minutes with your assistant prompt.$1.00 - GET
/api/inbound/:idReservation status plus every call it has handled.Free - POST
/api/inbound/:id/releaseReturn the number to the pool before the lease expires.Free
Utility
- GET
/api/healthLiveness probe for uptime checks.Free
One brief. The whole API.
No SDK, no OpenAPI sprawl. Copy this markdown into a context window and an agent has everything it needs to pay for and place a call.
Self-describing
Endpoints, request shapes, status transitions, and every error code in one file.
Or let them find it
ClawCall lists itself on the x402 bazaar, so agents can discover the service without you telling them about it.
Safe by construction
Prompts are screened before dialing, so a misguided agent gets a 422 instead of a phone call.
npx awal@latest x402 bazaar search "phone call"# ClawCall API
AI-powered phone calls via the x402 payment protocol. Two modes: outbound (call a number) and inbound (reserve a number that answers calls with your AI).
Base URL: `https://www.clawcall.xyz`
## Authentication
Payment endpoints require x402. The server responds with `HTTP 402` containing payment requirements. Include a signed `X-PAYMENT` header to proceed.
- **Network**: Base mainnet (USDC)
- **Facilitator**: OpenX402
- **Discovery**: `npx awal@latest x402 bazaar search "phone call"`
---
## Outbound Calls ($0.25)
Make an AI-powered call to any US phone number.
### POST /api/call
**Request:**
```json
{
"phoneNumber": "+15551234567",
"prompt": "What are your business hours today?"
}
```
| Field | Type | Required | Description |
|-------------|--------|----------|--------------------------------------------|
| phoneNumber | string | yes | E.164 format (e.g. +15551234567) |
| prompt | string | yes | Instructions for the AI (1-2000 chars) |
**Response (202):**
```json
{
"callId": "uuid",
"status": "initiating",
"pollUrl": "/api/call/{uuid}"
}
```
### GET /api/call/:id
Poll for call result. No payment required.
```json
{
"callId": "uuid",
"status": "completed",
"transcript": "assistant: Hi, what are your hours?\nuser: We're open 9 to 5.",
"duration": 45
}
```
**Statuses:** `initiating` -> `ringing` -> `in_progress` -> `completed` | `failed` | `timeout`
### Outbound Flow
1. `POST /api/call` with phone number and prompt
2. Receive `402` with x402 payment requirements
3. Re-send with signed `X-PAYMENT` header (USDC on Base)
4. Receive `202` with `callId` and `pollUrl`
5. Poll `GET /api/call/:id` every 3-5 seconds
6. When status is `completed`, read `transcript`
---
## Inbound Calls ($1.00)
Reserve a phone number for 30 minutes. Incoming calls are answered by an AI assistant using your prompt.
### POST /api/inbound/reserve
**Request:**
```json
{
"prompt": "You are a pizza shop called Mario's. Our hours are 11am-10pm daily. We have cheese, pepperoni, and veggie pizzas."
}
```
| Field | Type | Required | Description |
|--------|--------|----------|--------------------------------------------------|
| prompt | string | yes | Instructions for the AI assistant (1-2000 chars) |
**Response (201):**
```json
{
"reservationId": "uuid",
"phoneNumber": "+15551234567",
"expiresAt": "2025-01-01T00:30:00.000Z",
"durationMinutes": 30,
"statusUrl": "/api/inbound/{uuid}"
}
```
### GET /api/inbound/:id
Get reservation status and call history. No payment required.
```json
{
"reservationId": "uuid",
"phoneNumber": "+15551234567",
"prompt": "You are a pizza shop...",
"status": "active",
"expiresAt": "2025-01-01T00:30:00.000Z",
"calls": [
{
"callId": "uuid",
"status": "completed",
"duration": 30,
"transcript": "assistant: Hello, thank you for calling...\nuser: What are your hours?",
"callerNumber": "+15559876543",
"createdAt": "2025-01-01T00:05:00.000Z"
}
]
}
```
**Reservation statuses:** `active` | `expired` | `released`
### POST /api/inbound/:id/release
Release a reservation early. No payment required. Returns the phone number to the pool.
### Inbound Flow
1. `POST /api/inbound/reserve` with prompt
2. Receive `402` with x402 payment requirements
3. Re-send with signed `X-PAYMENT` header (USDC on Base)
4. Receive `201` with `phoneNumber` and `expiresAt`
5. Call the phone number -- AI answers with your prompt
6. Poll `GET /api/inbound/:id` for call history and transcripts
7. Optionally `POST /api/inbound/:id/release` to release early
---
## Utility
### GET /api/health
```json
{ "status": "ok", "service": "clawcall" }
```
## Error Responses
| Status | Meaning |
|--------|----------------------------------|
| 400 | Invalid request body |
| 402 | Payment required (x402) |
| 404 | Not found |
| 409 | Reservation already released |
| 422 | Prompt rejected by validation |
| 503 | No numbers available |
| 500 | Internal server error |
The questions that come up first
What is x402, and why not just an API key?
x402 revives HTTP 402 Payment Required as a real handshake. The server answers an unpaid request with the price and where to send it; the client retries with a signed payment header. An autonomous agent can complete that loop unaided — no dashboard, no key rotation, no invoice to reconcile.
Do I need an account?
No. There is nothing to sign up for. A funded wallet on Base is the entire onboarding process, and the first call can happen seconds after you decide to make one.
Which numbers can ClawCall dial?
US numbers in E.164 format, like +15551234567. Anything else is rejected with a 400 before payment is captured.
What stops this being used for spam?
Every prompt is screened by Claude Haiku before a call is placed. Business enquiries — hours, stock, availability, appointments — pass. Harassment, pranks, and cold outreach scripts come back as a 422.
What happens if the call fails?
The call moves to failed or timeout and the poll response says so. Statuses run initiating, ringing, in_progress, then completed, failed, or timeout.
Can my agent discover ClawCall on its own?
Yes. ClawCall publishes itself to the x402 bazaar, so a search for “phone call” surfaces it along with its price and schema.
The next call your agent makes could be a real one.
One command, $0.25, and a transcript comes back. There is nothing to sign up for.
npx awal@latest x402 pay https://www.clawcall.xyz/api/call \ -X POST \ -d '{"phoneNumber": "+19375387033", "prompt": "What are your hours today?"}'