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.

checking service…

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.