Public API
Quick start
Send your first WhatsApp message in under five minutes. The Public API is wire-compatible with Meta Cloud API where the resource overlaps—swap base URL and token to migrate.
Base URL
All endpoints are versioned under /v1 and served from your SigFollow gateway:
https://api.sigfollow.com/v1For self-hosted deployments substitute your own hostname. The version prefix stays stable; breaking changes increment to /v2without dropping the old version.
Code sample conventions
Every endpoint reference page ships four sample languages in consistent style — copy them straight into your project:
- curl — POSIX shell, single command, ready to paste
- JavaScript — runtime-agnostic native
fetch(Node 18+, Deno, Bun, modern browsers — no dependency required) - Python —
requests(install withpip install requests) - Java — OkHttp for HTTP + Jackson for JSON. Maven coordinates:
com.squareup.okhttp3:okhttp:4.12.0andcom.fasterxml.jackson.core:jackson-databind:2.17.0(or newer). Request bodies are built withMap.of/List.ofand serialized throughObjectMapper, so you never escape JSON by hand. We picked OkHttp overjava.net.httpbecause it's ubiquitous in production Java stacks, has cleaner multipart APIs, and sensible connection-pooling defaults; Jackson over Gson because Spring Boot ships it.
Examples elide the enclosing method signature for brevity — wrap the snippets in a method that throws Exception (Jackson serialization may throw JsonProcessingException, OkHttp's execute() throws IOException).
1. Generate an API key
Sign in as a tenant administrator and open Integrations → API Keys → New key. Pick the scopes you need (scope reference):
messages:send— send WhatsApp messagestemplates:read/templates:write— list and create message templatescontacts:read/contacts:write— sync customer contacts and tagsblacklist:read/blacklist:write— maintain the tenant blacklist
2. Send a message
Plug the phone number ID (from Channels → Phone numbers) and your key into the request:
curl -X POST https://api.sigfollow.com/v1/PHONE_NUMBER_ID/messages \
-H "Authorization: Bearer sflo_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "{{Recipient-Phone-Number}}",
"type": "text",
"text": { "body": "Hello from SigFollow" }
}'A successful response mirrors Meta's Cloud API shape:
{
"messaging_product": "whatsapp",
"contacts": [{ "input": "{{Recipient-Phone-Number}}", "wa_id": "{{Recipient-Phone-Number}}" }],
"messages": [{ "id": "wamid.HBgN..." }]
}3. Handle errors
Errors return Meta-style bodies (error reference):
{
"error": {
"message": "Invalid or expired API key",
"type": "OAuthException",
"code": 190
}
}HTTP 401 means the key is invalid or revoked. 403 means the key is valid but lacks the required scope. 429 means you exceeded the per-second rate limit; honor the Retry-After header.
Where to next
- Authentication — Bearer token, HMAC signatures, IP allowlists
- Rate limiting & idempotency — backoff strategy and safe retries
- Messages reference — every message type and field
- Postman collection — import the full API into Postman in one click