Location, contacts & reactions

Beyond text and media, the POST /send endpoint carries three more rich content types: a pin on a map, a shareable contact card, and an emoji reaction on an existing message. Each is a distinct content field on the same endpoint and maps to a Meta Cloud API object: contacts is passed to WhatsApp as-is, while location and reaction are rebuilt from the fields in the tables below (anything else in them is dropped).

All three need a Meta Cloud number (native or your own Meta app) — any other number returns 502 — and all three are free-form content, so they send inside the 24-hour customer service window; outside it, open the conversation with a template first. When the customer sends you one of these back, it arrives in content.* on the received webhook.


Location

Set the location field to drop a pin. latitude and longitude are required decimals; name and address are optional labels that render under the map preview — include them so the customer sees a titled place instead of bare coordinates.

curl -X POST https://api.telenow.ai/api/app-whatsapp/send \
  -H "Authorization: Bearer vai_app_…" \
  -H "Content-Type: application/json" \
  -d '{
    "channelId": "b1e2c3d4-…",
    "to": "+919876543210",
    "location": {
      "latitude": 19.076,
      "longitude": 72.877,
      "name": "Telenow HQ",
      "address": "Bandra Kurla Complex, Mumbai 400051"
    }
  }'
{ "success": true, "data": { "wamid": "wamid.HBgLMTQxNTU1MDEwMBUCABIYFj…" } }
FieldNotes
location.latitudeRequired decimal degrees, as a JSON number — a string returns 400 location needs numeric latitude and longitude
location.longitudeRequired decimal degrees, as a JSON number
location.nameOptional place name shown above the address (blank values are dropped)
location.addressOptional street address shown under the pin (blank values are dropped)

When a customer shares their location with you, the received webhook carries it as content.location — see Webhooks & events.

Contacts

The contacts field is an array of contact cards (send one or several at once). Each card needs a name object and a phones array; WhatsApp renders it as a tappable vCard the customer can save or message.

curl -X POST https://api.telenow.ai/api/app-whatsapp/send \
  -H "Authorization: Bearer vai_app_…" \
  -H "Content-Type: application/json" \
  -d '{
    "channelId": "b1e2c3d4-…",
    "to": "+919876543210",
    "contacts": [
      {
        "name": { "formatted_name": "Asha Rao", "first_name": "Asha" },
        "phones": [ { "phone": "+919812345678", "type": "CELL" } ]
      }
    ]
  }'
{ "success": true, "data": { "wamid": "wamid.HBgLMTQxNTU1MDEwMBUCABIYFj…" } }
FieldNotes
contactsArray of one or more contact cards — an empty or non-array value returns 502 contacts must be a non-empty array
contacts[].nameRequired; formatted_name is the display line, first_name optional
contacts[].phonesArray of { "phone", "type" } (type e.g. CELL, WORK, HOME)

A contact card the customer sends you arrives as content.contacts on the received webhook.

Reactions

Set the reaction field to attach an emoji to a message the customer sent you. message_id is the wamid of the message you're reacting to — the same wamid you received on the webhook — and emoji is a single emoji. Sending an empty emoji removes a reaction you previously placed.

curl -X POST https://api.telenow.ai/api/app-whatsapp/send \
  -H "Authorization: Bearer vai_app_…" \
  -H "Content-Type: application/json" \
  -d '{
    "channelId": "b1e2c3d4-…",
    "to": "+919876543210",
    "reaction": {
      "message_id": "wamid.HBgLMTQxNTU1MDEwMBUCABIYFj…",
      "emoji": "👍"
    }
  }'
{ "success": true, "data": { "wamid": "wamid.HBgLMTQxNTU1MDEwMBUCABIYFj…" } }

To clear a reaction, resend with an empty emoji:

curl -X POST https://api.telenow.ai/api/app-whatsapp/send \
  -H "Authorization: Bearer vai_app_…" \
  -H "Content-Type: application/json" \
  -d '{
    "channelId": "b1e2c3d4-…",
    "to": "+919876543210",
    "reaction": {
      "message_id": "wamid.HBgLMTQxNTU1MDEwMBUCABIYFj…",
      "emoji": ""
    }
  }'
{ "success": true, "data": { "wamid": "wamid.HBgLMTQxNTU1MDEwMBUCABIYFj…" } }
FieldNotes
reaction.message_idRequired — the wamid of the message you're reacting to (camelCase messageId also works). Missing → 400 reaction needs the target message_id (wamid)
reaction.emojiA single emoji; an empty string — or leaving emoji out — removes the reaction

When the customer reacts to one of your messages, it arrives as content.reaction on the received webhook.

With your org API key

With your org API key (X-API-Key: vai_live_…), send the same location, contacts or reaction object to the org route — the channel goes in the path, so there's no channelId in the body:

curl -X POST https://api.telenow.ai/api/orgs/{orgId}/whatsapp-hub/channels/{channelId}/send \
  -H "X-API-Key: vai_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+919876543210",
    "location": { "latitude": 19.076, "longitude": 72.877, "name": "Telenow HQ" }
  }'

Inside a conversation, post the same body without to to …/whatsapp-hub/threads/{threadId}/send. The rules above — including the Meta Cloud requirement — are identical; the key needs the owner, admin or developer role.