Add calling, chat and location to your app
Callio puts voice and video calls, chat and live location inside your iOS, Android, Flutter, React Native or web app. Your users talk to each other or to your contact centre without ever seeing a phone number.
- Get a sandbox. You get a test organisation with two users, an API key and a console login. It takes a few seconds.
- Mint tokens on your server. Your backend calls
POST /api/v1/tokenswith the API key and hands the token to your app. The SDK never sees a password. - Add the SDK and start it. Then dial a user, an order, or support.
Versions
All SDKs are at … and follow semantic versioning. Read the changelog.
API
REST with JSON. Download the OpenAPI 3.1 spec for code generators and Postman.
Webhooks
Call, chat and order events are signed with HMAC-SHA256 and sent to your URL. They are also available as a pull feed at /api/v1/events.
Quick start
Your server: hand out tokens
// Node / Express. CALLIO_KEY is the API key from your sandbox (keep it on the server).
app.post('/callio-token', requireYourLogin, async (req, res) => {
const r = await fetch(`${CALLIO_URL}/api/v1/tokens`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.CALLIO_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ username: req.user.callioUsername, ttlSec: 900 }),
});
res.json(await r.json()); // { token, expiresAt }
});
API reference
Authenticate every request with Authorization: Bearer cio_…. Paste a sandbox key to try the read calls here; it stays in this tab.
Loading…
Samples
Call by order
A customer calls whoever is delivering their order. Reassigning the order reroutes the next call.
POST /api/v1/orders
{ "id": "ORD-1001", "customer": "customer1",
"agent": "agent1", "label": "Grocery delivery" }
// in the app
engine.callOrder('ORD-1001')Call support
The app calls the tenant's support entry point. It overflows to the next one when nobody answers.
// web engine
await engine.loadEntryPoints();
engine.callSupport(); // or callSupport('Arabic desk')Pre-call check
Before a call, test the server, the microphone, STUN and TURN.
const r = await engine.preCallTest();
if (!r.ok) showWarning(r.verdict);Follow events for BI
let after = 0;
for (;;) {
const r = await api(`/api/v1/events?after=${after}`);
store(r.events); after = r.next;
}Full host-app examples, including CallKit and ConnectionService ringing from a killed app, are in sdk/EXAMPLES.md in the SDK repository. The changelog is in sdk/CHANGELOG.md.
Get a sandbox
A test organisation with a customer and an agent who can call and chat, an API key and an admin console login. It allows 10 users and 2 calls at a time, with no recording, and expires after 14 days.