Transactional messages
Send OTPs, receipts, and shipping alerts over WhatsApp, as text and as media or PDF templates, straight from your own systems.
Amargi Reach is a multi-channel messaging platform built on the WhatsApp Business Cloud API, with Amargi as a Meta Tech Provider, plus Messenger, Instagram, Telegram, web chat, and email, all in one inbox. Send templates and media, run campaigns, draft AI replies with human handoff, and receive signed webhooks.
One platform for transactional sends, marketing, support, and automation, all landing in the same shared inbox.
Send OTPs, receipts, and shipping alerts over WhatsApp, as text and as media or PDF templates, straight from your own systems.
Run campaigns to segmented audiences with broadcasts and batch send, linked to an approved template and an audience.
Support customers in one inbox across every channel, with assignment, conversation ownership, and internal notes.
AI drafts or auto-sends from your knowledge base and hands off to a human the moment a person takes over.
Send interactive messages and WhatsApp Flows: in-chat buttons, list pickers, and forms, plus rule-based auto-replies.
Your systems consume inbound message events and delivery-status changes as signed webhooks in real time.
Every channel lands in the same inbox and the same composer. The channel is selected via channel_kind on the API.
WhatsApp Business Cloud API directly through Meta: templates, media, interactive messages, Flows, and the 24h service window.
Connect a Facebook Page. The 24h window applies, with HUMAN_AGENT tags for agent replies outside it.
Instagram Business-account DMs, plus comment private replies, gated on Meta review.
Bot mode via a BotFather token, and Business-account mode that replies as a personal account through business_connection_id.
Live chat from your site or app routed through Reach, with an 'a human joined the chat' notice on the AI to human handoff.
Send and receive over IMAP/SMTP. Email lands in the same inbox next to your instant channels.
Five steps from sign-up to a live inbox with webhooks wired in.
Sign up at Amargi Workspace (see the Workspace docs) and open Reach from the launcher.
Connect your WABA via Meta Embedded Signup: Settings then Channels then WhatsApp then Connect. The dialog handles everything, Facebook auth, portfolio selection, phone-number selection, and system user creation.
Send your first message from Send. For WhatsApp outside the 24h service window, you must use an approved template (UTILITY / AUTHENTICATION / MARKETING).
Create a webhook in Webhooks then New subscription. You receive events like message.inbound, message.delivered, and message.read at your URL, each signed with HMAC-SHA256.
Open the operator inbox at Conversations. Inbound messages appear in real time via SignalR.
A WhatsApp Business Account (WABA) owns one or more phone numbers. Each number carries a quality rating (GREEN / YELLOW / RED) and a messaging tier (TIER_NEW through TIER_UNLIMITED), managed by Meta based on user feedback. Templates are required for any message outside the 24h window, and each must be approved by Meta first (UTILITY usually in a minute, MARKETING in about 30 minutes).
After a user messages your WABA, you can send any message type for 24 hours without per-message billing. Once the window closes you must use an approved template, and the template price for the region is billed. Reach enforces this automatically: out-of-CSW messages without a template are rejected at the API.
UTILITY covers transactional notifications (order confirmation, shipping update, reminders) and is cheapest. AUTHENTICATION covers OTPs and verification codes, priced separately and optimized for fast delivery. MARKETING covers promotions and campaigns, is most expensive, and requires explicit recipient opt-in.
Reach enforces STOP/UNSUBSCRIBE detection on inbound messages across 7 languages, both single words and multi-word phrases. When a user sends STOP, their contact-consent row is appended with opt_out and future MARKETING messages are blocked at the API. UTILITY and AUTHENTICATION are still allowed as transactional necessity.
Two limits apply: Meta's per-phone-number cap (scales with tier, for example about 80 messages/sec on TIER_1K) and Reach's own per-organization guard (a sliding window, default 60 messages/minute) that protects you from bursts. 429 responses from Meta are retried automatically with backoff, honoring Retry-After, then exponential with plus or minus 20% jitter.
Beyond plain text and templates, Reach sends interactive WhatsApp messages: reply buttons, list pickers, and single- or multi-product (catalog) messages, passed straight through to Meta. The user's tap comes back as a normal inbound message you can branch on. Reach also sends emoji reactions, stickers, and location messages, and can shorten links and track their clicks.
Flows are in-chat forms (sign-up, appointment booking, lead capture, surveys, contact-us). Reach ships a first-class Flows subsystem: a visual builder that emits Flow JSON, plus the full lifecycle (create, update JSON, publish, deprecate) and a short-lived Meta preview. Endpointless Flows return answers via a completion webhook; dynamic Flows can call an endpoint on your backend. Manage them under /api/v1/wabas/:id/flows. Note: publishing a Flow requires Meta Business Verification on the WABA.
A very common integration: your own system automatically sends a customer a file over WhatsApp the moment something happens, an order confirmation, an invoice or receipt (PDF), an image, a short explainer video, or a statement. With Reach that is a single API call from your backend, fully automated, no agent in the loop, in real time.
Upload a file once with POST /api/v1/media, then reference the returned media id when you send. Reach supports image, video, audio, and document (including PDF) messages, with an optional caption and a filename for documents.
To send proactively at any time (outside the 24-hour window), templates carry a media header: submit a UTILITY template with an IMAGE / VIDEO / DOCUMENT header, then send it with the uploaded media id. Reach resolves your internal media id into the provider's nested media object automatically, so your system can send, for example, a PDF receipt as a UTILITY template that skips the 24h window. That is exactly what makes automated, any-time delivery possible, not just inside an open conversation.
Reach has a built-in AI brain, powered by Amargi Agents, that reads the conversation history (with memory across the thread) and your knowledge base. It runs in two modes: assist (drafts a suggestion in the composer for an agent to accept, edit, or skip) or autonomous (replies on its own on the channels you enable).
The moment a human takes over, the bot stands down: AI and workflow replies are rejected while the conversation is in human-handoff, even on new inbound webhooks. AI auto-resumes after 24h of no human action (counted from the last human reply) or when the conversation is resolved. On web chat, the widget shows an 'a human joined the chat' notice on the transition.
Inbound messages can drive a visual workflow (Amargi Workflow Builder): trigger, run an AI agent, then reply on the same channel or hand off to a human or open a ticket. The reply is channel-aware: Messenger, Instagram, Telegram, web chat, and email go through an in-process reply port, while WhatsApp stays on the reviewed Meta send path.
These are two different things, and the inbox keeps them apart. Messages your own system sends through the API (OTPs, receipts, notifications, type=template with a wk_ key) appear under a neutral Automated chip. The AI chip appears only for the built-in AI brain's conversational replies, so if your org has no AI configured you will never see an AI chip. Keep automated transactional sends as type=template so they attribute as Automated.
One workspace for every channel. Beyond reply, the inbox gives your team the tools to run conversations as a team.
Assign a conversation, take it over, or transfer it. A viewer-by-default composer keeps two agents from replying to the same chat at once.
Every outbound message is tagged by sender: a teammate's name, an AI chip for the bot, or an Automated chip for programmatic API sends, with an AI to human handoff timeline.
Plain-text notes with @mentions (in-app and email notification), emoji reactions, and soft-delete for audit.
Open, pending, resolved, or snoozed, plus star and pin highlights and operator-authored custom fields.
Move a conversation through new, contacted, qualified, proposal, then won or lost, with a lead value.
Inbound messages, delivery status, typing, and presence stream live via SignalR.
OTPs are sent via an approved AUTHENTICATION template. Because templates bypass the 24-hour window, you can send a code to a brand-new user with no prior message and no opt-in (AUTHENTICATION is exempt from consent and from the STOP block). One API call: POST /api/v1/messages
{
"phone_number_id": "YOUR_PHONE_NUMBER_ID",
"to": "962790802310",
"type": "template",
"template": {
"name": "otp_verification",
"language": "ar",
"components": [
{ "type": "body", "parameters": [
{ "type": "text", "text": "483920" }
]},
{ "type": "button", "sub_type": "url", "index": 0, "parameters": [
{ "type": "text", "text": "483920" }
]}
]
}
}phone_number_id is Reach's internal phone UUID (from GET /api/v1/wabas/:id/phone-numbers), not Meta's numeric id.to is E.164 with no leading + (for example 962790802310).sub_type: url, index: 0 makes the code appear twice, once in the body and once in the copy-code button, so the one-tap Copy code button works.name + language must exactly match your approved AUTHENTICATION template. Templates are billable, so the org needs message credit.Prerequisites: the WhatsApp number must be registered and connected (Settings then Channels then activate the number) and the AUTHENTICATION template approved by Meta. The send is async, 202 Accepted, then track delivery via webhooks (message.sent, delivered, read). Pass an Idempotency-Key header so a retry never double-sends.
This is an automated send, not AI. It posts to your inbox under an Automated chip, never AI.
The everyday jobs, each a short recipe in the panel or a single API call.
Settings then API keys then New key. Choose scopes (least-privilege default is messages:send; Full access is all scopes) and an optional expiry (30 / 90 / 365 days / never). The secret (wk_live_...) is shown once at creation, so copy it then; Reach stores only a hash. Send it as an Authorization: Bearer wk_ header.
When your system has the file ready, upload it with POST /api/v1/media to get a media id, then send with POST /api/v1/messages. Inside the 24h window send the media directly; to send proactively at any time, use an approved UTILITY template with a DOCUMENT / IMAGE / VIDEO header referencing the media id. Pass an Idempotency-Key and track delivery via webhooks.
Templates then New template. Pick language and category (UTILITY / MARKETING / AUTHENTICATION), build components (header, body, buttons). Reach validates the components locally before submitting to Meta to avoid a rejection at their API. Status flows PENDING then APPROVED or REJECTED, with updates arriving via Meta's webhook in real time.
Define an audience in Audiences (segment on contact attributes or upload a CSV). Create a campaign in Campaigns then New campaign, linking a template and an audience. Schedule (schedule_at in the future) or launch immediately (/start), then monitor progress (queued / sent / delivered / read / failed).
Webhooks then New subscription. Enter your HTTPS URL, pick event types, and copy the generated signing secret into your server config. Verify the X-Amargi-Signature-256 header (formatted sha256=<hex>) with HMAC-SHA256 of the raw payload body, and return 2xx within 5 seconds. Failure queues the event for retry (exponential backoff, max 5 attempts).
Conversations opens the operator inbox. WhatsApp, Email, Messenger, Instagram, Telegram, and web-chat messages appear with channel filters at the top. Pick a conversation, type in the composer, and if inside the CSW send directly, otherwise pick an approved template. Delivery status (sent, delivered, read) streams into the bubble in real time.
All Reach endpoints sit under https://reach.amargicreative.com/api/v1/
API requests authenticate with a key in the Authorization: Bearer wk_live_... header (Reach API keys are prefixed wk_). Browser sessions inside the Reach panel use the amargi_workspace_access cookie instead.
POST /api/v1/messagesSend a message (text, media, template, interactive). Idempotency key in the Idempotency-Key header.GET /api/v1/messages/:idRetrieve a message by id.POST /api/v1/messages/batchBatch send, up to 5,000 messages per request.POST /api/v1/messages/:id/resendResend a failed message.POST /api/v1/mediaUpload a file (image / video / audio / document) for sending or template headers.GET /api/v1/conversationsList conversations. Filter by state, channel_kind, assignedUserId.GET /api/v1/conversations/:id/messagesMessages in a conversation.GET /api/v1/wabasList visible WABAs.GET /api/v1/wabas/:id/templatesTemplates for a given WABA.POST /api/v1/wabas/:id/templatesSubmit a new template for Meta approval.GET /api/v1/wabas/:id/phone-numbersPhone numbers on a WABA (internal id, e164, display name, status).POST /api/v1/wabas/:id/phone-numbers/:phoneId/registerRegister or activate a phone number on the Cloud API (required before it can send).POST /api/v1/templates/:id/archiveArchive a template (hide it without deleting), with /unarchive to reverse.GET/POST /api/v1/wabas/:id/flowsList or create WhatsApp Flows (plus publish / deprecate / preview).GET /api/v1/campaignsList campaigns.POST /api/v1/campaignsCreate a campaign (draft or scheduled).POST /api/v1/campaigns/:id/startLaunch a campaign immediately.GET/POST /api/v1/audiencesList or create audience segments (for campaigns).GET /api/v1/webhook-subscriptionsList webhook subscriptions.POST /api/v1/webhook-subscriptionsCreate a new webhook subscription.POST /api/v1/contacts/importBulk-import contacts (CSV, up to 10,000 rows; tags and custom fields).POST /api/v1/contacts/:id/consentsManually record a consent update.GET/POST /api/v1/admin/api-keysList or create API keys (scoped, optional expiry; the secret is shown once).POST /api/v1/admin/api-keys/:id/rotateRotate or revoke a key (DELETE to revoke).GET /api/v1/reports/messagingMessaging volume report (group_by=day|week).GET /api/v1/reports/billingBilling cost report (group_by=day|category).All outgoing events are signed with HMAC-SHA256 in the X-Amargi-Signature-256 header; the secret rotates per subscription, and you can rotate it manually any time.
message.inboundA message arrived from the end-user.message.queued / sent / delivered / read / failedAn outbound message's delivery lifecycle, a separate event per stage.template.status_changedPENDING then APPROVED or REJECTED.phone_number.quality_changedGREEN / YELLOW / RED plus tier change.phone_number.status_changedA phone number's connection status changed.waba.account_updatedA WABA-level account update from Meta.campaign.started / campaign.completedCampaign lifecycle transitions.invoice.issued / invoice.paidBilling events.Official clients, with more languages planned.
@amargi/reachTypeScript / Node.js. Official client, early access (available on request; not yet published to the public npm registry).
PythonPlanned for Q3 2026.
.NETPlanned for Q3 2026.
Full step-by-step guides live inside the product, right next to each feature. Tell us what you want to build and we will point you to the right setup, or request access and we will get you started.