Plug Allo / into anything.

Calls, contacts, SMS, webhooks. A clean REST API that gives you the raw building blocks — so the phone system bends to your stack, not the other way around.

REST & JSON API key auth Webhooks included
~/allo — send an SMS
# One call. One text. Logged everywhere. $ curl -X POST "https://api.withallo.com/v1/api/sms" \ -H "Authorization: $ALLO_KEY" \ -H "Content-Type: application/json" \ -d '{ "from": "+13055550180", "to": "+13055550142", "message": "Your order just shipped 📦" }'
Response 200 OK
{ "from_number": "+13055550180", "to_number": "+13055550142", "type": "OUTBOUND" }
Built for teams who ship
REST
JSON in, JSON out
5
Real-time webhook topics
4
Scoped API key permissions
US · FR
SMS coverage, out of the box
What you can build

Your phone system, on tap.

Allo does the calls, texts, and AI summaries. The API hands you the raw data and the triggers, so you can wire it into whatever your team is already using.

Push every call into your CRM

Pull calls with recordings, transcripts, AI summaries, and tags. Drop them wherever your reps actually live — Salesforce, HubSpot, or the internal tool you built last quarter.

GET /v1/api/calls

Keep contacts in sync, both ways

Create, update, search, and fetch contacts from anywhere. New lead in your CRM? Push it to Allo. Contact edited in Allo? Your database hears about it via webhook.

POST /v1/api/contacts

Send SMS straight from code

Appointment reminders, shipping pings, OTPs, shift confirmations. One POST request and it's out the door — from your Allo number, logged in the same thread as the rest of the conversation.

POST /v1/api/sms

React the moment something happens

Webhooks fire when a call ends, an SMS lands, or a contact changes. No polling, no cron jobs. Your stack reacts in real time — exactly when the event actually happens.

POST /v1/api/webhooks
Endpoints

All the surfaces you'd
actually want to hit.

A small, focused API. No sprawling legacy endpoints, no mystery deprecations. Read the docs once and you're off.

Calls
READ

Search your call history. Every record includes transcripts, AI summaries, recording URLs, IVR selections, and transfer chains.

GET/v1/api/calls
Contacts
READ & WRITE

Full CRUD on your contact database. Create, fetch by ID, update, and search — with engagement data baked into every response.

GET/v1/api/contacts
POST/v1/api/contacts
PUT/v1/api/contacts/:id
SMS
SEND

Send SMS programmatically from any of your Allo numbers. Dedicated endpoints for US and France, both in E.164 format.

POST/v1/api/sms
POST/v1/api/sms/fr
Webhooks
REAL-TIME

Subscribe a URL to call, SMS, and contact events. Full envelope payloads — no secondary fetch to enrich the data.

GET/v1/api/webhooks
POST/v1/api/webhooks
DEL/v1/api/webhooks/:id
Conversations
READ

Pull the whole thread for a contact — calls and SMS stitched together, in order, with pagination built in from day one.

GET/v1/api/conversations
Phone Numbers
READ

List every Allo number on your account. Use it to route, filter, or match a number to an owner without hardcoding.

GET/v1/api/phone-numbers
Copy, paste, ship

Built so your
first request works.

The API is REST, the auth is a single header, and the responses are predictable JSON. Nothing clever. Nothing to memorise.

  • One header auth. Drop your API key in Authorization and you're in.
  • Scoped permissions. Four clear scopes — read what you need, write only what you must.
  • Standard pagination. size and page, up to 100 per request. That's it.
  • Honest rate limits. 429s come with a reset_in so your retry logic actually knows what to do.
See the auth guide
# Send an SMS from your Allo number $ curl -X POST "https://api.withallo.com/v1/api/sms" \ -H "Authorization: $ALLO_KEY" \ -H "Content-Type: application/json" \ -d '{ "from": "+13055550180", "to": "+13055550142", "message": "Your order just shipped 📦" }' # → 200 OK { "data": { "from_number": "+13055550180", "to_number": "+13055550142", "type": "OUTBOUND", "content": "Your order just shipped 📦", "start_date": "2026-04-21T10:30:00" } }
# Pull calls for one of your Allo numbers $ curl -X GET "https://api.withallo.com/v1/api/calls?allo_number=+13055550180&size=25" \ -H "Authorization: $ALLO_KEY" # → 200 OK { "data": { "results": [ { "id": "call_abc123", "from_number": "+13055550142", "length_in_minutes": 5.5, "type": "INBOUND", "summary": "Customer called about order status.", "tag": "support", "recording_url": "https://storage.withallo.com/...", "transcript": [ /* AI-generated, speaker-tagged */ ] } ], "metadata": { "total_pages": 5, "current_page": 0 } } }
# Subscribe to call and SMS events $ curl -X POST "https://api.withallo.com/v1/api/webhooks" \ -H "Authorization: $ALLO_KEY" \ -H "Content-Type: application/json" \ -d '{ "allo_number": "+13055550180", "enabled": true, "url": "https://your-app.com/allo/events", "topics": ["CALL_RECEIVED", "SMS_RECEIVED", "CONTACT_CREATED"] }' # Payloads arrive at your URL in real time: { "topic": "CALL_RECEIVED", "data": { "id": "call_abc123", "summary": "Order status inquiry", "length": "5m 30s", "type": "INBOUND" } }
# Push a new contact into Allo $ curl -X POST "https://api.withallo.com/v1/api/contacts" \ -H "Authorization: $ALLO_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Jordan", "last_name": "Rivera", "company": "Acme Inc", "emails": ["jordan@acme.com"], "numbers": ["+13055550142"] }' # → 200 OK { "data": { "id": "cnt_abc123", "name": "Jordan", "last_name": "Rivera", "company": "Acme Inc", "numbers": ["+13055550142"] } }
Webhooks

Events, the
moment they happen.

Skip the polling. Point Allo at a URL, pick your topics, and we'll deliver a full payload — AI summary and transcript included — the second the call wraps or the text lands.

Fair warning Payloads come through fast. Return a 200 within 30 seconds, use HTTPS, and keep your handler lean — or we'll assume your endpoint is down.
CALL_RECEIVED
Call ends → payload with summary & transcript
SMS_RECEIVED
Inbound text hits your Allo number
SMS_SENT
You sent one — log it everywhere else
CONTACT_CREATED
New contact appears in your Allo
CONTACT_UPDATED
Name, number, or company changed
REST
Built on HTTP. Returns JSON. Talks to anything.
API Keys
Scoped permissions. Rotate from settings in seconds.
E.164
Numbers are always normalised — no parsing headaches.
Free
Included with every Allo plan. Pay only for SMS sent.

Questions we keep getting

Short answers. If you want the long version, the docs have you covered.

API access is included in every Allo plan — no separate developer tier, no per-request fee. The only thing you pay extra for is outbound SMS you send through /v1/api/sms, billed per segment like the rest of your text usage.
Yes. HTTP verbs, JSON bodies, predictable status codes. Authentication is a single Authorization header. You'll need an Allo account and an API key generated from your settings to hit the endpoints.
Yes — for US numbers via /v1/api/sms and French numbers via /v1/api/sms/fr. The recipient has to be in the same country as the Allo number you're sending from. Messages up to 1,000 characters.
API keys. You generate them in your Allo settings and drop them in the Authorization header of every request. Each key has one or more scopes — CONVERSATIONS_READ, CONTACTS_READ, SMS_SEND, WEBHOOKS_READ_WRITE — so you grant exactly the access you need and nothing more.
Five topics today: CALL_RECEIVED, SMS_RECEIVED, SMS_SENT, CONTACT_CREATED, and CONTACT_UPDATED. Subscribe to any combination. Your endpoint needs to be HTTPS and return a 200 inside 30 seconds, or we'll flag the delivery as failed.
Yes, daily limits per API key. When you hit one, you'll get a 429 back with a reset_in field (in seconds) so your exponential backoff knows exactly when to try again. Cache when you can, subscribe to webhooks instead of polling when you can't.
Every endpoint, every field, every example lives at help.withallo.com/en/api-reference. Copy the cURL straight from the page — it's interactive.

Ready to build?

Get an API key, hit your first endpoint in under a minute, and wire Allo into whatever you're shipping this week.

# Two lines. That's the whole setup. $ export ALLO_KEY="sk_live_…" $ curl -X POST api.withallo.com/v1/api/sms ...