Every conversation, one API.
Axis Inbox is the shared service behind customer messaging on the Axis platform. Connect a WhatsApp number, a Facebook page, an inbox or a website widget; read and reply to every conversation through one contract; run campaigns and automation flows over the same connections — without naming a single provider in your code.
Reply to a conversation
npm install @~inbox/sdk
import { Inbox } from '@~inbox/sdk';
const inbox = new Inbox({
baseUrl: process.env.INBOX_URL,
appKey: process.env.INBOX_SERVICE_KEY, // an Axis Accounts sk_ key
tenant: `ws_${accountsUserGroupId}`, // the workspace this call acts for
});
const { data: threads } = await inbox.inbox.threads.list({ status: 'open' });
await inbox.inbox.threads.reply(threads[0].id, {
message: 'Thanks for getting in touch — looking into it now.',
});
The same call reaches WhatsApp, Instagram, Messenger, SMS, email or a live-chat widget. Which provider actually carries it is decided by the connection, not by the caller. Full walkthrough →
What it does
Connect
WhatsApp, Meta, SMS, email, live chat and the social networks — one connection model, credentials encrypted per binding.
Converse
A unified inbox of threads and entries, with unread counts, ordering that survives concurrency, and dedup on ingest.
Resolve
Tickets with assignment, SLA-grade response times and one-open-per-thread enforced by the database.
Know
Contacts deduplicated across channels by normalised phone, email and provider identity.
Reach
Segmented campaigns with consent, suppression, warm-up pacing and per-recipient delivery receipts.
Automate
Flows of 25 node types, versioned so an in-flight conversation keeps the graph it started on.
Built to be integrated
One credential, one tenant
An Accounts service key or a user session, plus the workspace header. Nothing else to sign.
Safe retries
Every write takes an Idempotency-Key. A replay returns the original response, not a duplicate send.
Live by default
WebSocket and SSE for the browser, signed outbound webhooks for your server.
One adapter per channel
Threads, dedup, unread counts, retries and fan-out are channel-agnostic. Adding a channel is one adapter.
Onboarding with an AI agent
Inbox describes itself in machine-readable form, so an agent can integrate an application
without a person reading these pages first. Point it at
/llms.txt — an indexed description of every page and
every skill file, generated from the docs themselves.
# Install the integration skill for Claude Code
mkdir -p ~/.claude/skills/inbox-integration/{references,scripts}
cd ~/.claude/skills/inbox-integration
BASE=https://inbox.myaxis.ai/skill
curl -sSO "$BASE/SKILL.md"
for f in config.example.json authentication.md consuming-the-api.md receiving-events.md channels.md manual-onboarding.md troubleshooting.md; do
curl -sS -o "references/$f" "$BASE/references/$f"
done
curl -sS -o scripts/onboard.mjs "$BASE/scripts/onboard.mjs"
The skill carries an idempotent onboarding script that registers the app in Accounts, publishes the scope catalogue, mints a scoped key and provisions a workspace — then proves the isolation by calling as that key and failing if it can see anything it should not. More on agent integration →
Start here
Run it locally
Postgres, Redis, migrations and the service — the six commands.
Connect an app
Register in Accounts, publish scopes, mint a key, resolve a tenant.
API reference
Every route, how it authenticates, and the scope it needs.