Agent Number

SMS

Send and receive SMS on the same number that handles voice. Near-instant OTP delivery via long-poll. Three REST endpoints, three matching MCP tools.

Three endpoints

Send your first SMS

curl -X POST https://agentnumber.really.com/sms/send \
  -H "authorization: Bearer <token>" \
  -H "content-type: application/json" \
  -d '{"to": "+15551234567", "body": "Hello from my agent."}'
# → {"message_id": "msg_...", "status": "queued"}

Receive an OTP

For OTP / 2FA flows, prefer the MCP receive_sms tool over the raw endpoint — it long-polls (up to 120 s) with MCP notifications/progress events. The REST endpoint here is the underlying primitive: it returns immediately with whatever's currently undelivered, without long-polling.

curl https://agentnumber.really.com/sms/receive \
  -H "authorization: Bearer <token>"
# → returns immediately with any undelivered messages
# → {"messages": [{...}], "count": 1}

Read message history

curl "https://agentnumber.really.com/sms/messages?limit=20" \
  -H "authorization: Bearer <token>"
# → {"messages": [...], "next_cursor": "..."}

MCP equivalents

Endpoints

EndpointAuthPurpose
POST/sms/sendbearerSend outbound SMS. Returns {message_id, status}.
GET/sms/receivebearerImmediate-return claim of undelivered inbound; atomic on delivered_at. Use MCP receive_sms for long-poll.
GET/sms/messagesbearerRead-only paginated history (cursor-based).

Practical notes

Common errors

StatusErrorMeaning
400invalid_requestBody malformed or missing required fields
401unauthorizedMissing, invalid, revoked, or expired bearer — see Auth
500subscription_missingSubscription record not found server-side
500slot_inventory_missingDevice-slot inventory row missing
502phone_node_errorPhone node (hardware adapter) returned non-2xx
503subscription_missing_slotSubscription has no assigned slot