Solutions / Developers
Ship WhatsApp features with an API you can reason about.
A versioned REST API, signed webhooks and a real tenant model. Start with a personal workspace, connect a test number through Embedded Signup, and build without learning the Meta Graph API surface.
The problem
The Meta surface is powerful but unforgiving
Graph API versions move, tokens expire, webhooks duplicate, and error payloads vary. Product teams need a stable abstraction without losing delivery truth.
Tokens must never reach a browser or a mobile client.
Template components have strict shape and category rules.
Webhook verification and deduplication are mandatory, not optional.
Messaging windows and opt-in requirements are policy, not suggestions.
How it works
An infrastructure API with guard rails
ClickMaker validates requests before they reach Meta, encrypts credentials, queues outbound sends and normalises events back to your application.
Create an API key
Choose scopes per application. Keys are shown once and stored as hashes.
Connect a number
Use the dashboard or Embedded Signup flow. The resulting phone number ID is used in every send.
Send and retry safely
Attach an idempotency key. Message state is persisted so a retry does not create a duplicate send.
Consume events
Register a webhook endpoint, verify signatures, and acknowledge quickly. Retries use exponential backoff.
ClickMaker ConnectCustomer-owned WABA and phone number. Meta policy, templates and delivery remain under Meta's control.
Assets stay with the customerCapabilities
What you can build on the platform.
Normalised errors
A stable error envelope with code, message, requestId and optional field details.
Message state machine
queued → sent → delivered → read, with failed and cancelled as explicit terminal states.
Cursor pagination
Stable ordering for contacts, conversations, messages and usage records.
Request tracing
Every response carries a request ID that maps to server logs without exposing payload secrets.
Send a text message
TypeScriptconst response = await fetch(
"https://connectapi.clickmaker.in/api/v1/messages",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CLICKMAKER_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "order-4412-confirmation",
},
body: JSON.stringify({
phoneNumberId: "pn_01J...",
to: "919876543210",
type: "text",
text: { body: "Your order is confirmed." },
}),
},
)
const message = await response.json()
// { data: { id, status: "queued", ... }, requestId }Examples reflect the documented API shape. Endpoints marked as planned in the developer portal are not yet available.
FAQ
Common questions.
Do you provide an SDK?
The API is designed to be usable with plain HTTP. Official SDK packages are planned; this site marks anything not yet published as upcoming.
How do I test without sending real messages?
A provider adapter and sandbox application are planned for safe local testing. Until then, use a dedicated Meta test number and restricted recipients.
Are webhooks at-least-once?
Yes. Deliveries are retried, so consumers must deduplicate by event ID and tolerate out-of-order arrival.
ClickMaker Connect
Read the API, then build
The developer portal documents authentication, messaging, templates and webhook verification.
No shared ClickMaker sender · Customers own their assets