Quickstart
Send your first WhatsApp message through the Lynkist API in five minutes.
This guide walks you end-to-end through sending a WhatsApp message via the Lynkist API. By the end you will have a working API key, a connected WhatsApp Business Account (WABA), and a delivered message on a real number.
1. Sign up and connect a WhatsApp Business Account
- Sign up at lynkist.io and complete onboarding.
- From the dashboard, run the embedded signup flow to connect a verified WhatsApp Business
Account. Until a WABA is connected and active, the
messagesendpoint will return404 No active WABA account for this tenant.
A free-tier tenant cannot call the Public API at all — see Rate Limits. Upgrade to Starter or higher to enable API access.
2. Generate an API key
- Open the dashboard at Settings → API keys (
/{tenant}/api/v1/settings/api-keys). - Click Create new key.
- Pick a name (visible to your team) and the scopes the key needs. For this walkthrough
pick the
messagingpreset (givescontacts:read,templates:read,media:write,messages:send). - Copy the secret immediately — it is shown once. It looks like
lk_sk_live_a1b2c3…(live) orlk_sk_test_…(sandbox).
export LYNKIST_API_KEY="lk_sk_live_..."See Authentication for the full scope catalogue and key-rotation flow.
3. Pick an approved template
The Public API only sends pre-approved WhatsApp templates (free-form messaging is dashboard-
only). List your approved templates to grab a template_name and language:
curl https://api.lynkist.io/api/v1/public/templates \
-H "Authorization: Bearer $LYNKIST_API_KEY"{
"data": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"template_name": "order_confirmation",
"language": "en_US",
"category": "UTILITY",
"status": "approved",
"components": [ /* … */ ],
"created_at": "2026-04-12T09:00:00Z"
}
],
"pagination": { "page": 1, "limit": 20, "total_items": 1, "total_pages": 1, "has_next": false, "has_prev": false }
}4. Send your first message
POST /api/v1/public/messages/template accepts a recipient (E.164 phone number), a template
name and language, and the optional components array (only required if the template has
variables).
curl -X POST https://api.lynkist.io/api/v1/public/messages/template \
-H "Authorization: Bearer $LYNKIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+919999999999",
"template_name": "order_confirmation",
"language": "en_US",
"components": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "Anurag" },
{ "type": "text", "text": "ORD-1042" }
]
}
]
}'A successful response:
{
"message_id": "wamid.HBgM…",
"status": "accepted",
"to": "+919999999999"
}status: accepted means we have handed the message to Meta. To know when it is actually
delivered or read, you need to subscribe to webhooks.
5. Subscribe to delivery webhooks
curl -X POST https://api.lynkist.io/api/v1/public/webhooks \
-H "Authorization: Bearer $LYNKIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/lynkist/webhook",
"events": ["message.sent", "message.delivered", "message.read", "message.failed"]
}'The response contains a signing_secret you must store — Lynkist signs every webhook with it
(see Webhooks for the signature recipe and the full event catalog).