Quickstart: Send your first WhatsApp message#

get.chat puts a clean REST API in front of the WhatsApp Business API (WABA), so you can send and receive WhatsApp messages without dealing with WABA’s raw payloads, media handling, or its single-webhook limitation.

This guide takes you from zero to a sent — and received — message in about five minutes using nothing but curl.

What you’ll need

  • A get.chat instance (your stack name) and a user with API access (username + password).

  • A terminal with curl, or any HTTP client.


1. Find your base URL#

Every get.chat instance has its own host. Replace YOUR_STACK_NAME with the identifier in your inbox/admin URL:

https://YOUR_STACK_NAME.inbox.getchat.360dialog.io/

All API endpoints live under /api/v1/ on that host.

Quick sanity check — this endpoint needs no auth:

curl https://YOUR_STACK_NAME.inbox.getchat.360dialog.io/api/v1/status/health/

2. Get an API token#

Exchange your username and password for a token:

curl -X POST \
  https://YOUR_STACK_NAME.inbox.getchat.360dialog.io/api/v1/auth/token/ \
  -H "Content-Type: application/json" \
  -d '{"username": "peter", "password": "your-password"}'

Response:

{ "token": "9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b" }

Send this token on every authenticated request using the Token prefix:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

3. Send a message#

Send a text message with a single POST to /api/v1/messages/. wa_id is the recipient’s WhatsApp number in international format, without +:

curl -X POST \
  https://YOUR_STACK_NAME.inbox.getchat.360dialog.io/api/v1/messages/ \
  -H "Authorization: Token YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
        "wa_id": "48123123123",
        "type": "text",
        "text": { "body": "Hello from the get.chat API!" }
      }'

Sending media works the same way — just change the type:

{
  "wa_id": "48123123123",
  "type": "image",
  "image": {
    "link": "https://YOUR_STACK_NAME.inbox.getchat.360dialog.io/api/v1/media/image.jpg",
    "caption": "Here is the picture. Thanks!"
  }
}

Heads up — the customer care messaging window. Free-form (non-template) messages are only delivered while the customer care window is open. Don’t hard-code a duration: it lasts at least 24 hours after the customer’s last message, and Meta keeps it open longer for some conversations — notably chats started from a Click-to-WhatsApp (CTWA) ad. Read the expiry from contact.messaging_window_expires_at (a POSIX timestamp, returned on chats and contacts); a send outside it fails with HTTP 453. Outside the window, send an approved template instead (GET /api/v1/templates/) — a template opens a new window.

Here’s the same send call in JavaScript:

const BASE = "https://YOUR_STACK_NAME.inbox.getchat.360dialog.io";

await fetch(`${BASE}/api/v1/messages/`, {
  method: "POST",
  headers: {
    Authorization: "Token YOUR_TOKEN",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    wa_id: "48123123123",
    type: "text",
    text: { body: "Hello from the get.chat API!" },
  }),
});

4. Receive messages with webhooks#

WhatsApp’s official API lets you register only one webhook per number. get.chat removes that limit: it receives the WABA webhook and fans events out to multiple per-user webhooks that you control.

Register and manage your webhooks under:

GET  /api/v1/webhooks/waba/            # list your webhooks
GET  /api/v1/webhooks/waba/{id}/       # inspect one
PUT  /api/v1/webhooks/waba/{id}/       # update its target URL
GET  /api/v1/webhooks/waba/{id}/test/  # send a test event

Once configured, every inbound message and status update is POSTed to your endpoint as JSON, so your app can react in real time. See Multiple webhooks for WhatsApp for why this matters and how the fan-out works.

5. Where to go next#