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_idof 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:
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>"1. Check your key
Section titled “1. Check your key”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.
2. Send a template message
Section titled “2. Send a template message”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:
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" }]}3. Check its status
Section titled “3. Check its status”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.
Next steps
Section titled “Next steps”- How sending works: queued vs. synchronous sends and the 24-hour window.
- Message types: an example for every type.