Phone numbers for agents.
Provision numbers, send/receive SMS, make calls, handle webhooks. x402 auth. No Twilio account. No KYC.
# Get a phone number in one request $ curl -X POST https://ring.prim.sh/v1/numbers \ -H "X-402-Payment: $PAYMENT_TOKEN" \ -d '{"country": "US", "capabilities": ["sms", "voice"]}' # → 402 → pay → 201 { "id": "num_p3x7k9", "number": "+12125551847", "country": "US", "capabilities": ["sms", "voice"], "webhook": null, "ttl": 86400 } # Send SMS $ curl -X POST https://ring.prim.sh/v1/sms \ -H "X-402-Payment: $PAYMENT_TOKEN" \ -d '{"from": "+12125551847", "to": "+14155559999", "body": "Deployment complete. All systems green."}'
x402 auth + payment
SMS send + receive
Voice calls
0 signup required
MCP + REST
Part of agentstack
↓ scroll

How it works

1
Provision number
📱
Send / receive SMS
🪝
Webhook on inbound
📞
Voice (TTS / record)

Numbers are ephemeral by default (24h). Extend or make permanent. Release when done.

What agents use it for

2FA verification

Agent signs up for a service that requires phone verification. Provision a number, receive the SMS code, verify, release the number. Under a minute.

SMS notifications

Text a human when something matters. Server down, trade executed, build failed. The one channel humans actually check immediately.

Conversational SMS

Agent maintains an SMS conversation with a human. Inbound messages hit a webhook, agent responds via API. No app install required.

Voice calls

Agent makes a phone call with TTS. Appointment reminders, status updates, emergency alerts. Programmable voice without Twilio.

Phone trees

Inbound calls → webhook → agent decides routing. Press 1 for support, press 2 for sales. Except the "agent" routing it is an AI.

Disposable numbers

Need a phone number for 10 minutes? Pay for 10 minutes. No monthly commitment, no plan, no account. Spin up, use, tear down.

API reference

# Number management
POST   /v1/numbers                # Provision a number
GET    /v1/numbers                # List your numbers
GET    /v1/numbers/:id            # Number details
PUT    /v1/numbers/:id            # Update TTL, webhook, capabilities
DELETE /v1/numbers/:id            # Release number

# SMS
POST   /v1/sms                    # Send SMS
GET    /v1/numbers/:id/messages   # Poll for inbound SMS
GET    /v1/messages/:id           # Get message details

# Voice
POST   /v1/calls                  # Initiate outbound call
GET    /v1/calls/:id              # Call status / recording URL
POST   /v1/calls/:id/say         # TTS into active call
POST   /v1/calls/:id/hangup      # End call

# Webhooks
PUT    /v1/numbers/:id            # Set webhook for inbound SMS/calls
# Inbound SMS → POST to webhook:
# { "from", "to", "body", "timestamp" }
# Inbound call → POST to webhook:
# { "from", "to", "call_id", "action_url" }

# Available inventory
GET    /v1/available              # Search available numbers by country/area

MCP tools

# Your agent gets these tools
tools:
  provision_number:
    country: "US"
    capabilities: ["sms", "voice"]
    webhook: "https://my-agent.example/inbound"

  send_sms:
    from: "+12125551847"
    to: "+14155559999"
    body: "Your verification code is 847291"

  read_sms:
    number: "num_p3x7k9"
    since: "5m"

  make_call:
    from: "+12125551847"
    to: "+14155559999"
    tts: "Hello, this is an automated message. Your order has shipped."

  release_number:
    number: "num_p3x7k9"

Pricing

ActionCostNotes
Provision number$0.03/dayUS local. Intl varies.
Send SMS$0.008US domestic
Receive SMS$0.005Webhook delivery included
Outbound call$0.015/minUS domestic
Inbound call$0.010/minWebhook included
TTS$0.005/minMultiple voices
Call recording$0.002/minStored 24h default

A full 2FA flow (provision + receive SMS + release) costs under $0.04.

Part of the agentstack

Same x402 payment token works across spawn.sh (compute), relay.sh (email), and ring.sh (phone). One identity, three primitives.

A phone number is an API call.

Agents don't have phones. They have HTTP clients.

Read the docs →

or just: curl https://ring.prim.sh/v1/available?country=US