--- name: agents-infra description: "Infrastructure for AI Agents. Phone, email, Social accounts, compute, domains, and voice calling for AI agents. Pay with USDC on Solana or Base via x402." --- **Base URL:** `https://agntos.dev` **Source:** https://github.com/0xArtex/AgentOS ## Quick Reference | Service | Endpoint | Cost (USDC) | |---------|----------|-------------| | Register agent | `POST /agents/register` | Free | | **Phone** | | | | Search numbers | `GET /phone/numbers/search?country=US` | Free | | Provision number | `POST /phone/numbers` | 2.00 | | Send SMS | `POST /phone/numbers/:id/send` | 0.05 | | Read messages | `GET /phone/numbers/:id/messages` | 0.01 | | **Voice Calls** | | | | Place call | `POST /phone/numbers/:id/call` | 0.10 | | Speak (TTS) | `POST /phone/calls/:callControlId/speak` | 0.05 | | Play audio | `POST /phone/calls/:callControlId/play` | 0.05 | | Send DTMF | `POST /phone/calls/:callControlId/dtmf` | 0.02 | | Gather input | `POST /phone/calls/:callControlId/gather` | 0.05 | | Record call | `POST /phone/calls/:callControlId/record` | 0.05 | | Hangup | `POST /phone/calls/:callControlId/hangup` | 0.01 | | Answer inbound | `POST /phone/calls/:callControlId/answer` | 0.01 | | Transfer call | `POST /phone/calls/:callControlId/transfer` | 0.10 | | List calls | `GET /phone/numbers/:id/calls` | 0.01 | | Call details | `GET /phone/calls/:id` | 0.01 | | **Email** | | | | Provision inbox | `POST /email/inboxes` | 1.00 | | Read inbox | `GET /email/inboxes/:id/messages` | 0.01 | | Send email | `POST /email/inboxes/:id/send` | 0.05 | | **Compute** | | | | List plans | `GET /compute/plans` | Free | | Upload SSH key | `POST /compute/ssh-keys` | 0.10 | | Create server | `POST /compute/servers` | 5.00-95.00 | | List servers | `GET /compute/servers` | 0.01 | | Server status | `GET /compute/servers/:id` | 0.01 | | Server action | `POST /compute/servers/:id/actions` | 0.05 | | Resize server | `POST /compute/servers/:id/resize` | 0.10 | | Delete server | `DELETE /compute/servers/:id` | 0.05 | | **Domains** | | | | Check availability | `GET /domains/check?domain=example.com` | Free | | TLD pricing | `GET /domains/pricing?domain=example` | Free | | Register domain | `POST /domains/register` | ~14-88 | | DNS records | `GET /domains/:domain/dns` | Free | | Update DNS | `POST /domains/:domain/dns` | Free | | Pricing | `GET /pricing` | Free | All paid endpoints use **x402** — make the request, get a 402, pay with USDC, done. ## Authentication **Option A: Agent token** (register once) ``` Authorization: Bearer aos_xxxxx ``` **Option B: x402 payment** (no registration needed) Just call any endpoint. The 402 response tells you what to pay. Payment = auth. ## How x402 Works 1. Call any paid endpoint → get `402 Payment Required` 2. Build a USDC transfer to the treasury address 3. Send it in the `Payment-Signature` header 4. Server verifies, settles on-chain, returns the response **Networks supported:** Solana mainnet + Base (EVM) --- ## Register Agent (Free) ```bash curl -X POST https://agntos.dev/agents/register \ -H "Content-Type: application/json" \ -d '{"name": "my-agent", "walletAddress": "YOUR_SOLANA_PUBKEY"}' ``` Returns token — save it: `Authorization: Bearer aos_xxxxx` --- ## 📱 Phone & SMS ### Search Available Numbers (Free) ```bash curl "https://agntos.dev/phone/numbers/search?country=US&limit=5" ``` ### Provision Number (2.00 USDC) ```bash curl -X POST https://agntos.dev/phone/numbers \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"country": "US"}' ``` Response: ```json { "id": "uuid", "phoneNumber": "+14782058302", "country": "US", "owner": "your-agent", "active": true } ``` ### Send SMS (0.05 USDC) ```bash curl -X POST https://agntos.dev/phone/numbers/PHONE_ID/send \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"to": "+15551234567", "body": "Hello from my agent!"}' ``` ### Read Messages (0.01 USDC) ```bash curl https://agntos.dev/phone/numbers/PHONE_ID/messages \ -H "Authorization: Bearer aos_xxxxx" ``` --- ## 📞 Voice Calls ### Place Outbound Call (0.10 USDC) ```bash curl -X POST https://agntos.dev/phone/numbers/PHONE_ID/call \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{ "to": "+15551234567", "tts": "Hello! I am an AI agent calling you.", "ttsVoice": "female", "record": true }' ``` Response: ```json { "id": "uuid", "callControlId": "v3:xxxxx", "from": "+14782058302", "to": "+15551234567", "status": "initiated", "message": "Calling +15551234567 from +14782058302", "hint": "TTS will play when the call is answered" } ``` **Parameters:** - `to` (required) — phone number to call (E.164 format) - `tts` — text-to-speech message to play when answered - `ttsVoice` — voice: `male` or `female` - `audioUrl` — URL of audio file to play when answered - `record` — `true` to record the call - `timeoutSecs` — ring timeout (default 30) ### In-Call Actions Once a call is connected, use the `callControlId` from the dial response: **Speak text (TTS) — 0.05 USDC:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/speak \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"text": "Please press 1 for sales or 2 for support", "voice": "female", "language": "en-US"}' ``` **Play audio file — 0.05 USDC:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/play \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"audioUrl": "https://example.com/greeting.mp3"}' ``` **Send DTMF tones — 0.02 USDC:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/dtmf \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"digits": "1234#"}' ``` **Gather DTMF input — 0.05 USDC:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/gather \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{ "maxDigits": 4, "terminatingDigit": "#", "prompt": "Please enter your PIN followed by the pound sign" }' ``` **Start recording — 0.05 USDC:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/record \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"format": "mp3"}' ``` **Stop recording:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/record/stop \ -H "Authorization: Bearer aos_xxxxx" ``` **Transfer call — 0.10 USDC:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/transfer \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"to": "+15559876543"}' ``` **Answer inbound call:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/answer \ -H "Authorization: Bearer aos_xxxxx" ``` **Hang up:** ```bash curl -X POST https://agntos.dev/phone/calls/CALL_CONTROL_ID/hangup \ -H "Authorization: Bearer aos_xxxxx" ``` ### Call History **List calls for a number (0.01 USDC):** ```bash curl https://agntos.dev/phone/numbers/PHONE_ID/calls \ -H "Authorization: Bearer aos_xxxxx" ``` **Get call details (0.01 USDC):** ```bash curl https://agntos.dev/phone/calls/CALL_ID \ -H "Authorization: Bearer aos_xxxxx" ``` ### Example: Agent calls a restaurant ``` 1. POST /phone/numbers/PHONE_ID/call → {"to": "+15551234567", "tts": "Hi, I'd like to place an order"} 2. Wait for call.answered webhook 3. POST /phone/calls/CTRL_ID/gather → {"prompt": "Press 1 for English", "maxDigits": 1} 4. POST /phone/calls/CTRL_ID/dtmf → {"digits": "1"} 5. POST /phone/calls/CTRL_ID/speak → {"text": "I'd like to order two large pizzas for delivery"} 6. POST /phone/calls/CTRL_ID/hangup ``` --- ## 📧 Email ### Provision Inbox (1.00 USDC) ```bash curl -X POST https://agntos.dev/email/inboxes \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"name": "my-agent", "walletAddress": "YOUR_SOLANA_PUBKEY"}' ``` Returns: `my-agent@agntos.dev` ### Read Inbox (0.01 USDC via x402) ```bash curl https://agntos.dev/email/inboxes/INBOX_ID/messages ``` ### Send Email (0.05 USDC via x402) ```bash curl -X POST https://agntos.dev/email/inboxes/INBOX_ID/send \ -H "Content-Type: application/json" \ -d '{"to": "user@example.com", "subject": "Hello", "body": "Message from my agent"}' ``` --- ## 💻 Compute (VPS) ### List Plans (Free) ```bash curl https://agntos.dev/compute/plans ``` Available plans: | Type | vCPU | RAM | Disk | Price/mo | |------|------|-----|------|----------| | cx23 | 2 | 4GB | 40GB | $5 | | cx33 | 4 | 8GB | 80GB | $9 | | cx43 | 8 | 16GB | 160GB | $15 | | cx53 | 16 | 32GB | 320GB | $28 | | cpx11 | 2 | 2GB | 40GB | $7 | | cpx21 | 3 | 4GB | 80GB | $15 | | cpx31 | 4 | 8GB | 160GB | $26 | | cpx41 | 8 | 16GB | 240GB | $48 | | cpx51 | 16 | 32GB | 360GB | $95 | ### Upload SSH Key (0.10 USDC) ```bash curl -X POST https://agntos.dev/compute/ssh-keys \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"name": "my-key", "publicKey": "ssh-ed25519 AAAA..."}' ``` Returns `id` — use it when creating servers. ### Create Server (5.00-95.00 USDC) ```bash curl -X POST https://agntos.dev/compute/servers \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"name": "my-server", "serverType": "cx23", "sshKeyIds": [KEY_ID]}' ``` Response: ```json { "id": "12345", "name": "my-server", "serverType": "cx23", "status": "running", "ipv4": "89.167.36.207", "message": "Server created. SSH in with: ssh root@89.167.36.207" } ``` **Zero-access design:** You provide your SSH public key. We never see your private key. We can't access your server. ### Server Actions (0.05 USDC) ```bash curl -X POST https://agntos.dev/compute/servers/SERVER_ID/actions \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"action": "reboot"}' ``` Actions: `reboot`, `poweron`, `poweroff`, `rebuild`, `reset` ### Resize Server (0.10 USDC) ```bash curl -X POST https://agntos.dev/compute/servers/SERVER_ID/resize \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"serverType": "cx33"}' ``` Note: Server must be powered off to resize. ### Delete Server (0.05 USDC) ```bash curl -X DELETE https://agntos.dev/compute/servers/SERVER_ID \ -H "Authorization: Bearer aos_xxxxx" ``` --- ## 🌐 Domains ### Check Availability (Free) ```bash curl "https://agntos.dev/domains/check?domain=example.com" ``` ### Get Pricing (Free) ```bash curl "https://agntos.dev/domains/pricing?domain=example" ``` ### Register Domain (dynamic pricing via x402) ```bash curl -X POST https://agntos.dev/domains/register \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"domain": "my-agent.dev"}' ``` ### DNS Management (Free for owners) ```bash # Get records curl https://agntos.dev/domains/my-agent.dev/dns -H "Authorization: Bearer aos_xxxxx" # Set records curl -X POST https://agntos.dev/domains/my-agent.dev/dns \ -H "Authorization: Bearer aos_xxxxx" \ -H "Content-Type: application/json" \ -d '{"records": [{"type": "A", "name": "@", "value": "1.2.3.4"}]}' ``` --- ## Payment Details - **Solana:** USDC to `B1YEboAH3ZDscqni7cyVnGkcDroB2kqLXCwLs3Ez8oX3` - **Base (EVM):** USDC to `0x7fA8aC4b42fd0C97ca983Bc73135EdbeA5bD6ab2` - **x402 Version:** 2 - **Facilitator:** `4R67MWivvc52g9BSzQRvQyD8GshttW1QLbnj46usBrcQ` ## Webhooks Set up webhooks to receive events: - **SMS inbound:** Messages to your number arrive via Telnyx webhook → stored, readable via API - **Voice events:** `call.initiated`, `call.answered`, `call.hangup`, `call.recording.saved`, `call.gather.ended` - **Email inbound:** Emails to `*@agntos.dev` processed via Cloudflare worker → stored encrypted