Webhooks
A Voxpanda webhook sends a signed JSON POST to your URL the moment something happens in your workspace, such as a published post, a new comment or an automated reply. Use it to connect Voxpanda to Zapier, Make, n8n, a CRM or your own server. Owners and admins manage webhooks in API & MCP, under Webhooks.
Add a webhook
- Open API & MCP in the menu.
- In Webhooks, enter the Endpoint URL. It must start with
https://. - Add a Description so your team knows what the endpoint is for.
- Tick the Events you want.
- Select Add webhook.
- Copy the signing secret. It starts with
whsec_and is shown only once.
Send test queues a webhook.test event so you can check your receiver before real events arrive.
Events
| Event | Sent when |
|---|---|
post.published |
a post goes live on a channel |
post.failed |
a post could not be published after its retries |
comment.received |
a new comment arrives on one of your posts |
message.received |
a new direct message arrives |
mention.received |
your brand is mentioned or tagged |
automation.triggered |
a keyword automation matches a comment or DM, with the result (sent, partly sent, failed or skipped) and the reason |
video.ready |
a vertical video has finished rendering |
repurpose.done |
a repurpose job has written its posts |
What a delivery looks like
Every delivery is a POST with a JSON body:
{
"id": "6f1c0d6e-1d1a-4b51-9d0e-3f1a5c0d9e21",
"event": "comment.received",
"created_at": "2026-10-25T04:05:19Z",
"workspace_id": "…",
"brand_id": "…",
"data": { "platform": "instagram", "kind": "comment", "author": "sari", "text": "How much is it?" }
}
The request carries three headers:
Voxpanda-Event: the event name.Voxpanda-Delivery: the delivery id. It stays the same when Voxpanda retries, so use it to skip duplicates.Voxpanda-Signature:t=<unix time>,v1=<signature>.
Verify the signature
The signature is an HMAC-SHA256, in hex, of the text t.body: the t value, a dot, and the raw request body. The key is your full whsec_ secret. Reject requests older than 5 minutes.
import crypto from 'node:crypto';
function verify(secret, rawBody, header) {
const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
const mac = crypto.createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex');
return mac.length === parts.v1.length && crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(parts.v1));
}
Use the raw body as received. Parsing the JSON and printing it again changes the bytes and the signature no longer matches.
Answer quickly
Reply with any 2xx status within 10 seconds. Voxpanda does not follow redirects and reads at most 4 KB of your response. Do slow work after you answer.
Retries and automatic turn-off
| Attempt | When |
|---|---|
| 1 | right away |
| 2 | 1 minute later |
| 3 | 5 minutes later |
| 4 | 30 minutes later |
| 5 | 2 hours later |
| 6 | 6 hours later |
After the sixth failed attempt the delivery is marked Gave up. When an endpoint fails 25 times in a row, Voxpanda turns it off and shows the reason. Fix your receiver, then select Turn on. The failure count resets.
Rotate the secret
Select New secret to create a new signing secret. The old one stops working at once, so update your receiver right after.
Questions
Which Voxpanda plans include webhooks?
Webhooks are part of every active workspace. Each workspace can have up to 5 webhook endpoints, and only owners and admins can add them.
What happens when my server is down?
Voxpanda tries a failed delivery 5 more times, after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours. After 25 failed deliveries in a row the endpoint turns itself off until you turn it on again.
Can a webhook point to a local address?
No. The URL must use https on port 443. Addresses such as localhost, .local, .internal and private IP ranges are refused when you save and checked again before each delivery.
Can I see what Voxpanda sent?
Yes. History on each endpoint shows the last 50 deliveries from the past 30 days with the event, the HTTP status, the time it took and any error, and Send again queues a copy.