For Developers

One REST API for every channel you send on.

Scoped API keys, idempotent sends, real-time webhooks, and a schema-validated endpoint for every mini-app — WhatsApp, Audiences, Sequences, Bot Flows, Instagram, and Email.

Quickstart

Send a WhatsApp message in one call

Every send endpoint follows the same shape: authenticate with your scoped API key, describe the message, and optionally attach an Idempotency-Key so retried requests never duplicate a send.

  • Type-specific endpoints for text, image, video, document, and location messages
  • Consistent request/response schema across every mini-app
  • 400 with a precise validation error on any malformed payload
bash
curl -X POST "$BROADCASTS_API_BASE/api/ext/v1/whatsapp/messages/text" \
  -H "X-API-Key: $BROADCASTS_API_KEY" \
  -H "Idempotency-Key: order-8842-confirmed" \
  -H "Content-Type: application/json" \
  -d '{
    "instanceId": "inst_9f2a",
    "to": "+919876543210",
    "text": "Your order #8842 has shipped! Track it here: https://trk.example/8842"
  }'
javascript
import fetch from "node-fetch";

const base = process.env.BROADCASTS_API_BASE;
const res = await fetch(base + "/api/ext/v1/whatsapp/messages/text", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.BROADCASTS_API_KEY,
    "Idempotency-Key": "order-8842-confirmed",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    instanceId: "inst_9f2a",
    to: "+919876543210",
    text: "Your order #8842 has shipped! Track it here: https://trk.example/8842",
  }),
});

const message = await res.json();
console.log(message.id, message.status);
python
import os, requests

response = requests.post(
    f"{os.environ['BROADCASTS_API_BASE']}/api/ext/v1/whatsapp/messages/text",
    headers={
        "X-API-Key": os.environ["BROADCASTS_API_KEY"],
        "Idempotency-Key": "order-8842-confirmed",
    },
    json={
        "instanceId": "inst_9f2a",
        "to": "+919876543210",
        "text": "Your order #8842 has shipped! Track it here: https://trk.example/8842",
    },
)

message = response.json()
print(message["id"], message["status"])

Your API base URL and key are issued from your account's API settings once access is granted.

Why this API

Built for production integrations

Scoped API keys

Every key is issued with explicit scopes — whatsapp:send, contacts:read, flows:write and more. Give an integration exactly the access it needs, nothing else.

Idempotent sends

Pass an Idempotency-Key header on any send endpoint and retry network failures safely — you'll never double-send a message because a request timed out.

Real-time webhooks

Subscribe to inbound messages, delivery status changes, and flow events. Your systems stay in sync without polling.

Validated & documented

Every endpoint is schema-validated end-to-end and ships with an interactive OpenAPI/Swagger reference — request shapes can't drift from the docs.

Mini-apps

One key, every mini-app

Each product surface is exposed as its own scoped mini-app under /api/ext/v1.

WhatsApp

Send text, image, video, document, and location messages; manage devices.

Broadcast

Trigger and estimate audience-wide broadcast campaigns.

Contacts

Create, look up, and manage contact records and custom fields.

Audiences

Add or remove contacts from segments; trigger audience-based automations.

Sequences

Enrol and manage contacts in multi-step, multi-channel nurture journeys.

Bot Flows

Trigger published Bot Flow sessions and read session state.

Templates

List and send approved WhatsApp message templates.

Instagram

Send DMs and manage comment-to-DM automation.

Email

Send transactional and campaign email through the same contact graph.

Media

Upload and retrieve media assets referenced across channels.

FAQ

Developer FAQ

How do I authenticate with the Broadcasts API?

Every request carries an X-API-Key header. Keys are generated per-tenant from your dashboard and are issued with specific scopes (for example whatsapp:send or contacts:read), so an integration only gets the access it's granted.

How do I avoid sending a message twice on retry?

Send endpoints accept an Idempotency-Key header. If you retry a request with the same key after a timeout, Broadcasts returns the original result instead of sending again.

Can I get notified of delivery status and replies without polling?

Yes — configure a webhook endpoint to receive inbound messages, delivery status changes (sent, delivered, read, failed) and flow/sequence events in real time.

Is there interactive API documentation?

Yes, every account gets an OpenAPI-generated Swagger reference covering every mini-app endpoint, its scopes, request schema and example payloads.

Let's talk

Ready to build on the same API we run on?

Request access and get a scoped key within the day.