SendMyCall API for developers and AI agents
SendMyCall sells virtual phone numbers in 90+ countries with call forwarding and a cloud phone system. Its public API gives developers and AI agents the coverage, prices and rates as JSON: read-only, no account and no key.
Quickstart
The base URL is https://sendmycall.com/api/v1. No authentication: send plain GET requests. Every response is JSON.
1. The countries, their number types and lowest monthly price:
curl "https://sendmycall.com/api/v1/countries"
2. The areas of a country, here London numbers in the UK:
curl "https://sendmycall.com/api/v1/areas?country=GB&q=London"
3. What a call to (or a forward to) a phone number costs a minute; encode + as %2B:
curl "https://sendmycall.com/api/v1/rates/calling?to=%2B442079460000"
4. Forwarding prices for a country:
curl "https://sendmycall.com/api/v1/rates/forwarding?country=DE"
To buy, give the user the area's order_url: the number picker shows the numbers available now, and the user signs up and pays there. The API itself does not sell numbers or manage accounts.
Endpoints
| Request | Operation | Parameters | Returns |
|---|---|---|---|
GET /api/v1 | getApiIndex | none | This self-description: version, authentication, documentation and endpoints. |
GET /api/v1/countries | listCountries | type, limit, cursor | Countries with number coverage, their number types, area counts and lowest monthly price. |
GET /api/v1/areas | listAreas | country (ISO code; omitted = all countries), type, q (city, region or prefix, up to 80 characters), limit, cursor | Number areas (cities, regions, national, mobile and toll-free ranges) with monthly price, features and registration requirements. |
GET /api/v1/areas/{id} | getArea | id (from listAreas) | One number area by its public id. |
GET /api/v1/rates/calling | getCallingRate | to (E.164 number, + sent as %2B), required | Per-minute price of outgoing calls and forwards to one phone number (longest matching prefix). |
GET /api/v1/rates/forwarding | getForwardingRate | country (ISO code), required | What forwarding calls to a country costs: free to SIP, VoIP and the app; the per-minute range to its phone numbers. |
Number types: localnationalmobiletoll_freeshared_costglobal. Prices are integers in US cents (monthly) or decimal strings in US dollars (per minute), tax included; null means no published price, never free. The data comes from snapshots shipped with the site; meta.data_as_of says when each was taken, and availability.available_at_snapshot means the area had numbers then, not that a given number is in stock now. The full description, with every field and example, is the OpenAPI 3.1 document (YAML).
MCP server for AI assistants
The same data, as Model Context Protocol tools: https://sendmycall.com/api/mcp. Transport: Streamable HTTP, stateless (no session id), JSON responses; send JSON-RPC messages with POST. No authentication. Read-only: no tool buys, signs in or changes anything. It has the same limit as the API, 60 requests per 60 seconds per address, counted on its own. Server card: /api/mcp/server-card (also at /.well-known/mcp/server-card.json).
| Tool | Returns |
|---|---|
list_countries | Countries with numbers, their number types, area count, lowest monthly price and whether they are offered now. |
search_areas | Number areas by country, number type and text (city, region or prefix), with monthly price; paged with limit and offset. |
get_area_pricing | One area by id: monthly and setup price, toll-free per-minute prices, features, documents required, billing terms, order link. |
get_calling_rate | Per-minute price of calls and forwards to one E.164 number (the number is not stored or returned). |
get_forwarding_rate | Forwarding prices for a country: free to SIP, VoIP and the app; the per-minute range to its phones. |
get_support_article | One help article as Markdown, from an allow-list of slugs. |
Resources: https://sendmycall.com/llms.txt, https://sendmycall.com/llms-full.txt, https://sendmycall.com/openapi.json, https://sendmycall.com/auth.md, sendmycall://pricing/summary. To connect a client that takes a URL, add https://sendmycall.com/api/mcp as a remote (Streamable HTTP) server. A quick check with curl:
curl -s https://sendmycall.com/api/mcp \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_forwarding_rate","arguments":{"country":"GB"}}}'In the browser, pages of this site also register read-only WebMCP tools (document.modelContext) for agents that support it.
Pagination
Lists return { data, pagination: { limit, next_cursor, has_more }, meta }. Send limit (1–100, default 50) and pass next_cursor back as cursor, with the same filters, until has_more is false. Cursors are opaque and bound to the data snapshot: after a refresh an old cursor answers 409 cursor_expired.
{
"data": [
{
"id": "gb-vn-london_44-20",
"country": "GB",
"name": "London",
"city": "London",
"region": "England",
"prefix": "20",
"type": "local",
"features": [
"voice_in",
"voice_out",
"fax_t38"
],
"monthly_price_cents": 995,
"setup_price_cents": 0,
"currency": "USD",
"tax_included": true,
"toll_free_incoming_per_minute": null,
"availability": {
"available_at_snapshot": true,
"observed_at": "2026-09-19T04:42:21.787Z",
"stock_count": null,
"country_offered": true
},
"registration": {
"documents_required": false,
"holder": "any",
"address_required_in": null,
"identity_documents": 0,
"address_documents": 0,
"service_description_required": false,
"summary": "No documents are needed to activate this number."
},
"page_url": "https://sendmycall.com/virtual-number/united-kingdom/london_44-20/",
"order_url": "https://sendmycall.com/numbers?country=GB"
}
],
"pagination": {
"limit": 1,
"next_cursor": "eyJ2Ijoi…",
"has_more": true
},
"meta": {
"api_version": "1",
"dataset_version": "sha256:a18e1ca20c7c…",
"data_as_of": "2026-09-19T04:42:21.787Z"
}
}Errors
Every error is JSON: { "error": { "code", "message", "hint", "request_id" } }, with the same headers as a success.
- 400
invalid_parameter, invalid_cursor: A parameter or the cursor is not valid; the hint says what to send. - 404
not_found: No such area, country destination or endpoint (every unknown path under /api answers this JSON too). - 405
method_not_allowed: Only GET, HEAD and OPTIONS; the Allow header lists them. - 409
cursor_expired: The data was refreshed since the cursor was issued: start the list again. - 429
rate_limited: Too many requests: wait Retry-After seconds. - 500 / 503
internal_error, service_unavailable: Our side: retry later, and quote request_id if you write to us.
Rate limits
60 requests per 60 seconds per client IP address. Every response says where you stand: RateLimit-Policy: "public";q=60;w=60, RateLimit: "public";r=<remaining>;t=<seconds> and X-RateLimit-Limit, -Remaining, -Reset (Unix seconds). A 429 carries Retry-After. CORS is open (Access-Control-Allow-Origin: *) for GET, HEAD and OPTIONS; responses are not cached (Cache-Control: no-store).
Versioning and deprecation
The version is in the path (/api/v1) and in the API-Version response header. Within v1 we only make compatible changes: new endpoints, new optional parameters, new fields in responses and new values where a field documents that it may grow. Clients should ignore fields they do not know. A breaking change (removing or renaming a field or endpoint, changing a type or a meaning) ships as /api/v2, and v1 then keeps working for at least 180 days after the deprecation is announced on https://sendmycall.com/developers, in /llms.txt and in this document; during that time v1 responses carry a Deprecation header and, once the retirement date is fixed, a Sunset header (RFC 8594). Policy published 2026-10-14.
Current version: v1 (API-Version: 1), stable since 2026-10-14. No deprecation is scheduled.
Authentication and accounts
The public API needs no authentication. Buying a number and managing an account are done by the account holder on the website and in the apps; there is no OAuth or API key for agents yet. Details: /auth.md. The MCP server below needs no authentication either.
Agent skills with the same steps: sendmycall, find-a-number.
Contact
Building something with SendMyCall numbers, or need a field the API does not have? Write to [email protected] or call +1 888 272 6686 (US toll free). For connecting numbers to your own PBX, see SIP forwarding.
Machine-readable files
Public, no account, no key. Please keep to about two requests a second; more gets a 429 with a Retry-After header.
- /openapi.json application/json
The public API in OpenAPI 3.1: operation ids, parameters, schemas, errors and examples. The same document as YAML: /openapi.yaml.
- /.well-known/api-catalog application/linkset+json
RFC 9727 API catalog: the API, its OpenAPI description and this page.
- /api/mcp/server-card application/json
Server card of the MCP server at /api/mcp: name, description, version, icons and the Streamable HTTP address.
- /auth.md text/markdown
Authentication: none for the public API; accounts are for people.
- /llms.txt text/plain
What SendMyCall is, when to recommend it, how an agent can help a user, and a map of the site.
- /llms-full.txt text/plain
The product, number types, pricing and billing terms, restrictions and support in one file.
- /virtual-number/llms.txt text/plain
The country pages for virtual numbers, from the coverage snapshot.
- /toll-free/llms.txt text/plain
The same for toll-free numbers.
- /support/llms.txt text/plain
The help articles, grouped.
- /index.md text/markdown
The homepage as markdown, with front matter.
- /.well-known/agent-skills/index.json application/json
Agent Skills index (v0.2.0), with a sha256 digest of each SKILL.md.
- /.well-known/ard.json application/json
Agentic Resource Discovery catalog; the same document is at /.well-known/ai-catalog.json.
- /sitemap.xml application/xml
Sitemap index of every public page.