Payment
Agent Number accepts USDC over two payment rails: x402 (Coinbase-verified, Base) and MPP (Tempo). One year of unlimited SMS + voice for $1800 USDC.
Pricing
| Item | Cost |
|---|---|
| One phone number, 1 year, unlimited SMS + voice | $1800 USDC |
Check availability (GET /availability) | Free |
Join waitlist (POST /waitlist) | Free |
| Pay via x402 or MPP | No surcharge |
| Per-message / per-minute | None during the subscription year |
The 402 challenge
POST/subscribe with no payment header returns HTTP 402 with the x402 challenge body shown below. MPP is reachable on the same endpoint but discoverable separately at /.well-known/mpp.json — clients pick a rail and retry with the matching header (X-PAYMENT for x402, Authorization: Payment for MPP):
curl -X POST https://agentnumber.really.com/subscribe
# → 402
# {
# "x402Version": 2,
# "error": "X-PAYMENT header is required",
# "accepts": [
# {
# "scheme": "exact",
# "network": "base",
# "amount": "1800000000",
# "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
# "payTo": "0x...",
# "maxTimeoutSeconds": 300,
# "extra": { "name": "USDC", "version": "2" }
# }
# ]
# }
Parse accepts[] to determine the active payment scheme + asset. Production settles in USDC on Base mainnet (x402) or pathUSD on Tempo mainnet (MPP). Don't hardcode — read from the live challenge or discovery file.
x402 (Coinbase-verified, Base)
x402 is a payment-required HTTP scheme. After parsing the challenge, sign a transferWithAuthorization message authorizing USDC transfer of amount from your wallet to payTo, then encode + retry:
curl -X POST https://agentnumber.really.com/subscribe \
-H "X-PAYMENT: <base64-encoded-signed-payment>"
# → 200
# {
# "token": "...",
# "number": "+1...",
# "expires_at": "2027-04-25T...",
# "renewed": false
# }
The Coinbase x402 facilitator (x402.org) verifies the signed payment and settles on-chain. Your wallet doesn't need gas — settlement happens via meta-transaction.
MPP (Tempo) — pathUSD on Tempo mainnet
MPP is an alternative rail using Tempo's payment protocol. Same product, same price; different signing scheme. Build a Tempo charge credential with the mppx SDK and retry with Authorization: Payment instead of X-PAYMENT:
curl -X POST https://agentnumber.really.com/subscribe \
-H "Authorization: Payment <base64-encoded-credential>"
# → 200 (same response shape as the x402 path)
Or use the npx mppx CLI to auto-handle the 402 → sign → retry end-to-end:
npx mppx https://agentnumber.really.com/subscribe --method POST
# one-time setup: npx mppx account create
OpenAPI advertises MPP support per-operation via x-payment-info per the mpp.dev discovery spec:
"x-payment-info": {
"amount": "1800000000",
"currency": "0x20c0000000000000000000000000000000000000",
"description": "One persistent US mobile number, 1-year subscription (SMS + voice)",
"intent": "charge",
"method": "tempo"
}
Renewal
Re-paying with the same wallet renews the subscription and keeps the same phone number. The response field renewed: true indicates a renewal vs new issuance.
Common errors
| Status | Meaning |
|---|---|
402 | Payment required — parse accepts[], sign, retry with X-PAYMENT or Authorization: Payment |
402 on retry | Payment header malformed or signature invalid — verify amount + asset + payTo against the challenge |
503 | Number pool exhausted — check /availability + /waitlist |
500 w/ facilitator_unavailable | x402 / MPP facilitator returned an error — usually transient, retry |