call4me X402 API
The X402 API from call4me — 1 operation(s) for x402.
The X402 API from call4me — 1 operation(s) for x402.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/call4-me:call4-me-x402-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: call4me X402 API
version: 1.3.0
description: 'Phone calls an AI agent places for its user: call a business, follow the call to its outcome, answer the caller''s questions mid-call, and patch the user in. Also the prepaid balance, the caller profile, scheduled calls, the account''s phone numbers and call recordings. The same operations as the MCP server at /mcp. Calls are billed per minute from pickup (phone menus and conversation; hold time at half price) from the prepaid balance; unanswered calls are free. Refusals name MCP tools (call4me_place_call is POST /api/calls, call4me_save_profile is PATCH /api/profile).'
x-guidance: 'With a wallet and no account: POST /api/x402/calls with the call (to, business, goal, category, details, on_behalf_of, max_minutes) and pay the 402 in USDC on Base. A refusal (422 "Not calling yet") lists what to ask the user and takes no payment. The paid response returns the call id and an api_key; follow the call with GET /api/calls/{call_id}?wait_seconds=30 and Authorization: Bearer <api_key> until finished, answering open questions with POST /api/calls/{call_id}/answer. With an account: the bearer routes below, and GET /api to buy credits in USDC.'
contact:
name: call4me
email: me@call4.me
url: https://call4.me
servers:
- url: https://call4.me
tags:
- name: X402
paths:
/api/x402/calls:
post:
operationId: placePaidCall
description: 'Place a call paid in USDC on Base over x402, with no call4me account: the payment is max_minutes (default 10, up to 60) at the destination''s per-minute price, and the paying wallet becomes a call4me account. The call is checked before payment settles: 422 "Not calling yet" lists what to ask the user and takes nothing. Returns the call and the account''s api_key; follow it with GET /api/calls/{call_id}. Minutes the call does not use stay as credits on that account.'
security: []
requestBody:
required: true
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
to:
type: string
minLength: 3
maxLength: 40
description: the number to call, e.g. "+14155550123", "(415) 555-0123", or abroad with its country code, e.g. "+31 20 123 4567"
business:
type: string
minLength: 1
maxLength: 120
description: 'who you are calling, as a person would say it: "Nopa", "Dr. Chen''s office", "Toyota of Berkeley service"'
goal:
type: string
minLength: 5
maxLength: 1500
description: 'what the call should achieve, in plain words: "Book a table for 4 tomorrow (Sat Oct 3) around 7pm under Khami."'
category:
type: string
enum:
- medical
- dental
- restaurant
- veterinary
- auto_service
- auto_sales
- home_service
- personal_care
- internet_new_service
- internet_existing_account
- flight_change
- general
description: the kind of call; decides what must be known first (see call4me_get_requirements)
details:
description: answers to the category's fields by key, e.g. {"reason":"annual physical","patient_status":"existing","availability":"weekday mornings next week"}. Profile fields (name, DOB, phone, insurance...) are filled from the saved profile only when the call is for the profile's owner; for anyone else (on_behalf_of is another name) pass all of their details here, since the owner's are never used.
type: object
propertyNames:
type: string
additionalProperties:
type: string
maxLength: 1000
on_behalf_of:
description: 'who the call is for, as the caller should say it (default: the profile''s full_name). The caller calls FOR this person; it never claims to be them.'
type: string
minLength: 1
maxLength: 80
facts:
description: anything else the caller may share beyond the category's fields, one per line
type: string
maxLength: 3000
flexibility:
description: 'what the caller may accept without asking: "any time 6:30-8pm", "a different day this week is fine", "up to $300". Anything outside this becomes a question to you.'
type: string
maxLength: 1500
timezone:
description: IANA time zone of the business, e.g. "America/Los_Angeles", so "tomorrow" is unambiguous
type: string
maxLength: 60
connect_when:
description: 'when to ring the user and patch them into the call without being asked, e.g. "as soon as a person picks up" (skip the hold) or "if they need to speak to me". Rings their own phone: details.phone when given, else the one in their profile; a call with neither is refused. They hand the call back to the caller by pressing * or hanging up.'
type: string
maxLength: 300
listen_in:
description: 'ring the user as soon as the business answers so they can listen in: nobody on the call hears them and the caller keeps working. They press 1 anytime to take over, or hang up to stop listening. Rings their own phone: details.phone when given, else the one in their profile; a call with neither is refused.'
type: boolean
max_minutes:
description: the most minutes the answered call may run, including phone menus (default 10); the payment is this many minutes at the destination's per-minute price. Minutes the call does not use stay as credits on the paying wallet's call4me account
type: integer
minimum: 1
maximum: 60
voice:
description: caller voice (default marin); hear each at https://call4.me/voices
type: string
enum:
- marin
- cedar
- gleam
- meridian
- vesper
- willow
accent:
description: 'an accent or dialect the caller speaks with for this call only, e.g. "Austrian German" for a call in Vienna (default: the profile''s accent, else its voice''s own)'
type: string
maxLength: 40
caller_name:
description: 'a first name the caller introduces itself with, e.g. "Jordan", for this call only (default: the profile''s assistant_name, else none: just "<user>''s assistant"). Put the caller''s name and company here, never in the goal: the caller''s identity comes only from these fields.'
type: string
maxLength: 30
calling_as:
description: 'a company the caller calls from, e.g. "Acme": it introduces itself as "Jordan from Acme" (or "calling from Acme" without caller_name) instead of "<user>''s assistant", and callbacks to the number it called from answer as that company. Calling for several companies: pass the company on every call and give each one its own number (from), so callbacks reach the right identity.'
type: string
minLength: 1
maxLength: 80
callback_number:
description: 'the number the caller gives for call-backs and on voicemail, when the user wants callbacks to ring a phone of theirs (e.g. "(415) 555-0123"). Default: the number the call comes from, so a call4me number answers the callback and finishes the task. A callback to callback_number goes straight to that phone instead, and call4me never hears it. Phone numbers in details or facts are only for finding or verifying an account, never given as the callback.'
type: string
maxLength: 40
from:
description: 'which of the account''s numbers to call from (default: a call4me number in the callee''s country). May be one of the user''s own verified numbers (call4me_verify_number), for businesses in its country: they see it and call back the user directly'
type: string
maxLength: 40
required:
- to
- business
- goal
- category
additionalProperties: false
x-payment-info:
price:
mode: dynamic
currency: USD
min: '0.25'
max: '60.00'
protocols:
- x402: {}
responses:
'201':
description: Paid and dialing
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
call:
type: object
properties:
id:
type: string
status:
type: string
enum:
- queued
- dialing
- in_progress
- completed
- no_answer
- busy
- failed
- canceled
finished:
type: boolean
description: true once the call ended and its recap is written; poll until then
direction:
type: string
enum:
- outbound
- inbound
business:
type: string
number:
type: string
calling_number:
description: the call4me number that rings the user when they join
type:
- string
- 'null'
goal:
type:
- string
- 'null'
outcome:
anyOf:
- type: object
properties:
result:
type: string
summary:
type: string
details:
type: object
propertyNames:
type: string
additionalProperties: {}
required:
- result
- summary
additionalProperties: {}
- type: 'null'
open_questions:
type: array
items:
type: object
properties:
id:
type: string
question:
type: string
required:
- id
- question
additionalProperties: {}
description: 'the business is waiting on the line: answer right away'
answered_questions:
type: array
items:
type: object
properties:
question:
type: string
answer:
type: string
required:
- question
- answer
additionalProperties: {}
talk_minutes:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
cost:
type: string
cost_cents:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
description: billed so far, in US cents; final once finished
ended:
description: who ended the call and why
type:
- string
- 'null'
error:
type:
- string
- 'null'
created_at:
type: string
transcript:
type: array
items:
type: string
required:
- id
- status
- finished
- direction
- business
- number
- calling_number
- goal
- outcome
- open_questions
- answered_questions
- talk_minutes
- cost
- cost_cents
- ended
- error
- created_at
additionalProperties: {}
api_key:
type: string
follow:
type: string
credited:
type: string
credited_cents:
type: number
balance:
type: string
balance_cents:
type: number
transaction:
type: string
payer:
type: string
required:
- call
- api_key
- follow
- credited
- credited_cents
- balance
- balance_cents
- transaction
- payer
additionalProperties: {}
'400':
description: Request failed
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'402':
description: 'Payment required: the x402 v2 requirements, also in the PAYMENT-REQUIRED header'
content:
application/json:
schema:
type: object
properties:
x402Version:
type: integer
accepts:
type: array
items:
type: object
required:
- x402Version
- accepts
'403':
description: Request failed
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'409':
description: Request failed
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'422':
description: Request failed
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'502':
description: Request failed
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'503':
description: Request failed
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
tags:
- X402
summary: Place paid call
x-summary-source: derived
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: A call4me API key or OAuth access token for the site or MCP resource.