Skip to content
Live on Base mainnet · x402 v2

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
Live call+1 (937) 538-7033
0:00
transcribing…
402 → paid $0.25 USDCsettled on Base
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.
How it works

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.

$0.25

Dial any US number and get back a turn-by-turn transcript of what was said.

  1. 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. 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. 3

    Take the ticket

    A 202 hands back a callId and a poll URL. The call is already dialing.

    {  "callId": "5f1c…",  "status": "initiating"}
  4. 4

    Read the transcript

    Poll every few seconds until the status is completed, then read the transcript and duration.

    {  "status": "completed",  "duration": 41}
Quickstart

Paste this, make a call

Any HTTP client works. These use an x402-aware client so the 402 retry is handled for you.

one paid request
# 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> | jq
Capabilities

Built for agents that act, not just answer

Everything an autonomous caller needs, and nothing it has to be configured around.

Pricing

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.

Most used

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
Read outbound docs

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
Read inbound docs
API reference

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
For AI agents

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.

discover on the bazaar
npx awal@latest x402 bazaar search "phone call"
clawcall.xyz/llms.txt
# 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            |
FAQ

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.

make your first call
npx awal@latest x402 pay https://www.clawcall.xyz/api/call \  -X POST \  -d '{"phoneNumber": "+19375387033", "prompt": "What are your hours today?"}'