Skip to main content

WhatsApp

Reach 2+ billion WhatsApp users through Orbit’s WhatsApp Business API integration. Send template messages, start interactive sessions, and handle rich media — all through a single API.

Send a Template Message

WhatsApp requires pre-approved templates for business-initiated conversations.

Send a Session Message

Once a user messages you, a 24-hour session window opens for free-form replies. Use the window-status check to confirm the window is still open before sending.

Check the 24-Hour Window

Before composing a free-form (session) message, call the window-status endpoint to confirm the recipient is still inside Meta’s 24-hour re-engagement window. The send pipeline enforces the same check, but this pre-flight lets you gate the UI (force template-only when the window has closed) and avoid a wasted send attempt.
  • to (required) — the contact’s E.164 number.
  • from (optional) — the WABA number that will be the sender. When omitted, the check spans any of your WABA numbers; when supplied it is scoped to that sender pair (matching the send-time gate).

Response

reason is one of: When the window is closed, within_window is false and you must fall back to an approved template message.

Send a Broadcast

Fan a single approved template out to up to 256 recipients in one operation (Meta’s documented broadcast-list cap). Each recipient receives a normal 1:1 conversation — there is no shared thread, so per-recipient STOP / opt-out handling is preserved. The endpoint is persist-then-attempt: every recipient is pre-inserted as a pending row in one transaction before the per-recipient send pipeline runs, so a pre-create rejection (template not approved, parameter-count mismatch, 24-hour-window block, fraud guard, quota, sender validation) flips that row to failed rather than throwing without persisting a record.
  • recipients (required) — 1–256 entries, each with a to (E.164) and optional per-row template_params / metadata. Per-row template_params override the batch-level shared template_params. Duplicate numbers in one request are rejected (422).
  • template_name (required) — an approved WhatsApp template.
  • template_language, from, template_params, scheduled_at, webhook_url, metadata (optional) — shared across the batch. With scheduled_at set, every recipient lands as scheduled for the worker queue.

Response

Returns a per-recipient result array plus a summary. Inspect summary.failed and each results[].status — the HTTP status code signals whether to look at the body.
Broadcasts are rate-limited to 30 requests/minute per tenant. Larger or recurring sends belong in the campaigns module.

Features

  • Template messages — pre-approved message templates for outbound notifications
  • Session messaging — free-form replies within the 24-hour conversation window, with a pre-flight window-status check
  • Broadcast lists — fan one approved template out to up to 256 recipients with per-recipient results
  • Rich media — images, videos, documents, audio, stickers, and location sharing
  • Interactive messages — buttons, list pickers, and quick replies
  • Read receipts — know when messages are delivered and read
  • Catalog & product messages — share product listings directly in chat

Media Support

Send images, video, documents, audio, and stickers over WhatsApp. Each media type has its own size limit, set and enforced by WhatsApp (Meta) at the Graph API — there is no single blanket ceiling. Orbit forwards your media to WhatsApp, so keep each file within the limit for its type or WhatsApp rejects the send. Limits are per type, not shared: a 90 MB PDF is accepted as a document but rejected if the same file is sent as an image, and a sticker must stay under 100 KB. Check each file against the limit for its media type before sending.

Platform WABA credentials (operators)

Most tenants connect their own WhatsApp Business Account through the dashboard Embedded Signup flow, and Orbit uses that tenant’s stored credentials at send time. The variables below configure Orbit’s own platform-owned WABA — the shared fallback / send path used for the unverified test account, platform-initiated template management, and WhatsApp Calling registration. Set all three in Secret Manager (or .env for local dev). They are optional at boot: when DEVOTEL_WHATSAPP_ACCESS_TOKEN is set, messaging-bootstrap.ts registers one platform-wide WhatsApp provider; when it is unset, only per-tenant connections resolve at send time. Inbound webhook HMAC for WhatsApp still uses the shared DEVOTEL_META_APP_SECRET / DEVOTEL_META_VERIFY_TOKEN regardless of whether the platform credentials are set.

Dashboard Embedded Signup (build-time client config)

The dashboard’s WhatsApp Embedded Signup card and the Meta Ads channel card load Meta’s JS SDK in the browser, so they need a Meta App ID and an Embedded Signup configuration ID available on the client. Two NEXT_PUBLIC_* variables carry those values. Because they are NEXT_PUBLIC_*, they are baked into the dashboard when it is built — changing them requires rebuilding the dashboard, not just updating a server environment variable. Both are optional. Leave them unset for standard production deployments; the defaults connect tenants to Orbit’s production Meta app. Override both when you build the dashboard against a non-production Meta app — a staging / preview environment pointed at a test Meta app and Embedded Signup config, or a white-label deployment that runs its own Meta app rather than Orbit’s. Provide both as build-time variables when you build the dashboard, and set the matching server-side DEVOTEL_META_APP_ID so the runtime and build-time values agree.

Template Management

Manage templates through the Orbit dashboard under Channels > WhatsApp > Templates, or via the API:
Templates go through Meta’s approval process (typically 1–24 hours).