Skip to content

Quickstart

This walks through the three requests almost every integration starts with. You need:

  • an API key and your API base URL, both on the Integrations page of the dashboard (see Authentication)
  • the phone_number_id of the WhatsApp number to send from, shown on the Accounts page
  • the name and language of an approved template on that number’s WABA

Set them as shell variables so the examples run as-is:

Terminal window
export HELLO_API_URL="<API base URL from the dashboard>"
export HELLO_API_KEY="hello_live_xxxxxxxxxxxxxxxx"
export PHONE_NUMBER_ID="<phone number ID from the Accounts page>"
Terminal window
curl "$HELLO_API_URL/v1/ping" \
-H "Authorization: Bearer $HELLO_API_KEY"
{ "status": "ok", "test_mode": false }

A 401 here means the key is wrong. See authentication errors.

Only a template message can start a conversation with someone who hasn’t messaged you in the last 24 hours, so the first message is almost always a template. to needs a leading + and country code:

Terminal window
curl -X POST "$HELLO_API_URL/v1/$PHONE_NUMBER_ID/messages" \
-H "Authorization: Bearer $HELLO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+919999999999",
"type": "template",
"template": {
"name": "hello_world",
"language": { "code": "en_US" }
}
}'

The message is accepted onto the send queue and you get its id straight back:

{
"messaging_product": "whatsapp",
"contacts": [{ "input": "+919999999999", "wa_id": "919999999999" }],
"messages": [{ "id": "b7e1d2c3-4f5a-4b6c-8d9e-0a1b2c3d4e5f", "message_status": "queued" }]
}
Terminal window
curl "$HELLO_API_URL/v1/messages/b7e1d2c3-4f5a-4b6c-8d9e-0a1b2c3d4e5f" \
-H "Authorization: Bearer $HELLO_API_KEY"
{
"id": "b7e1d2c3-4f5a-4b6c-8d9e-0a1b2c3d4e5f",
"account_id": "3f9c2a1e-7b4d-4c8e-9a15-2d6f8e0b1c47",
"message_id": "wamid.HBgMOTE5ODc2NTQzMjEwFQIAERgSN0Q1QjE3RjA4QzU2QjBBQUE4AA==",
"conversation_id": "919999999999",
"direction": "outbound",
"message_type": "template",
"recipient_phone": "919999999999",
"sender_phone": "15551234567",
"template_name": "hello_world",
"content": { "template_name": "hello_world", "language": "en_US", "to": "919999999999" },
"status": "delivered",
"sent_at": "2026-09-26T10:15:02Z",
"delivered_at": "2026-09-26T10:15:04Z",
"created_at": "2026-09-26T10:15:01Z"
}

status moves from queued to sent, delivered and read, or to failed with error_code and error_message set. See the message object.