Create a key
Open Channels → Developer API and create a named server-side credential.
Bearercc_live_…Send messages, synchronize conversations, and receive channel events using the same messaging engine as ConvoClerk.
https://app.convoclerk.com/apiOpen Channels → Developer API and create a named server-side credential.
Bearercc_live_…Call GET /v1/channels and choose the channel ID your integration should use.
GET/v1/channelsSend with an idempotency key, poll message cursors, or configure signed channel webhooks.
POST/v1/messagesChoose a channel to see only its supported actions. The explorer is generated from the backend contract, so every request, media example, and limitation stays aligned with the API.
Official WhatsApp Business messaging through Meta's Cloud API.
Returns the capability matrix used to validate channel-specific actions.
channels:readhttps://app.convoclerk.com/apiThe key stays only in this page's memory. The explorer sends credentials exclusively to the published origin above.
curl --request GET \ --url 'https://app.convoclerk.com/api/v1/channel-types' \ --header 'Authorization: Bearer cc_your_api_key'
Run the request to inspect its status, duration, and response body.
Send Authorization: Bearer cc_… on every request. Choose only the scopes your integration needs, keep keys on your server, and reveal or revoke active keys as a company administrator.
Set client_message_id when sending. Retrying the same conversation and UUID returns the original message instead of sending a duplicate.
Use after with poll_cursor for pull-based synchronization, or configure message.received and message.sent webhooks on each channel for push delivery.
Each channel can deliver independently. Requests time out quickly, retry with exponential backoff, and never block provider message processing.
x-convoclerk-signatureHMAC-SHA256 signature of payloadx-convoclerk-timestampUnix timestamp of request (seconds)x-convoclerk-event-idUnique UUID for event deduplicationCompute HMAC-SHA256 over <timestamp>.<raw body> with the channel signing secret and compare it to x-convoclerk-signature.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyWebhookSignature({
rawBody,
timestamp,
signatureHeader,
signingSecret,
}: {
rawBody: string;
timestamp: string;
signatureHeader: string;
signingSecret: string;
}): boolean {
// 1. Calcula HMAC-SHA256 sobre timestamp + '.' + corpo bruto
const expectedHash = createHmac("sha256", signingSecret)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
// 2. Compara com x-convoclerk-signature usando timingSafeEqual
const expectedSignature = `v1=${expectedHash}`;
if (expectedSignature.length !== signatureHeader.length) return false;
return timingSafeEqual(
Buffer.from(expectedSignature),
Buffer.from(signatureHeader)
);
}Use the event ID for deduplication. Event types are message.received, message.sent, and webhook.test.
Triggered in real-time when a customer sends text, audio, or media on any channel.
{
"id": "evt_01h9yq9v8w0000000000000001",
"type": "message.received",
"api_version": "2026-08-14",
"created_at": "2026-09-22T20:15:00.000Z",
"data": {
"channel_id": "chn_meta_wa_01",
"channel_type": "meta-whatsapp",
"conversation_id": "cnv_01h9yq8x000000000000000001",
"customer": {
"id": "cst_01h9yq7z",
"name": "Maria Silva",
"phone": "+5511999998888"
},
"message": {
"id": "msg_01h9yq9v",
"direction": "inbound",
"type": "text",
"text": "Olá! Gostaria de saber os horários disponíveis."
}
}
}