Automate with Webhooks
Webhooks let your application react to changes in Vivreal in real time. When a content item (collection object) is created, updated, or deleted, Vivreal sends an HTTP POST to your endpoint with the event payload.
Prerequisites
- A Vivreal account with an active group
- A publicly accessible server or service (e.g. Express.js, Vercel serverless function, or a tool like ngrok for local development)
- Basic knowledge of Node.js
Create a webhook receiver
Set up a simple Express.js server that verifies the signature and handles incoming events. Note the use of express.raw() — the signature is computed over the raw request body, so you must NOT parse the body as JSON before verifying.
const express = require("express");
const crypto = require("crypto");
const app = express();
const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET; // from Vivreal
function verifySignature(rawBody, signatureHeader) {
// Header format: "sha256=<hex>" — strip the prefix
if (!signatureHeader || !signatureHeader.startsWith("sha256=")) {
return false;
}
const received = signatureHeader.slice("sha256=".length);
const expected = crypto
.createHmac("sha256", WEBHOOK_SECRET)
.update(rawBody)
.digest("hex");
const a = Buffer.from(received, "hex");
const b = Buffer.from(expected, "hex");
if (a.length !== b.length) return false;
return crypto.timingSafeEqual(a, b);
}
app.post(
"/webhooks/vivreal",
express.raw({ type: "application/json" }),
(req, res) => {
const signature = req.headers["x-vivreal-signature"];
if (!verifySignature(req.body, signature)) {
return res.status(401).json({ error: "Invalid signature" });
}
const { event, data } = JSON.parse(req.body.toString("utf8"));
console.log(`Received event: ${event}`, data);
switch (event) {
case "content.created":
// Handle new content item
break;
case "content.updated":
// Handle update
break;
case "content.deleted":
// Handle deletion
break;
default:
console.log("Unknown event type:", event);
}
res.status(200).json({ received: true });
},
);
app.listen(3001, () => console.log("Webhook receiver on :3001"));
Expose your local server
If you are developing locally, use ngrok to create a public URL:
ngrok http 3001
Copy the forwarding URL (e.g. https://abc123.ngrok.io).
Configure the webhook in Vivreal
In the portal, go to Group Settings → Webhooks → + New Webhook. Fill in:
- URL: Your public endpoint (e.g.
https://abc123.ngrok.io/webhooks/vivreal) - Events: Select the events you want to receive (
content.created,content.updated,content.deleted) - Secret: Vivreal generates an HMAC secret. Copy it and set it as
WEBHOOK_SECRETin your server environment.
Click Save to activate the webhook.
Test with a sample payload
Create or edit a content item in any collection. Your webhook receiver should log the incoming event within a few seconds. The payload structure looks like this:
{
"event": "content.created",
"timestamp": "2026-03-15T12:00:00.000Z",
"groupID": "68f27fec32e7acbb755c087e",
"dbKey": "general_shared",
"data": {
"_id": "68f28012a3c1d4b001234567",
"refID": "68f27fff9a2b4c0012345001",
"objectValue": {
"title": "New Post",
"tags": ["announcement"]
}
}
}
Handle failures gracefully
Vivreal's delivery pipeline sits behind an SQS queue. If your endpoint returns a non-2xx status or times out, the event is redelivered according to the queue's visibility-timeout and maxReceiveCount policy. After 10 consecutive failures for a single endpoint, that endpoint is automatically disabled.
Your endpoint should:
- Return a 2xx status code within 5 seconds to acknowledge receipt.
- Process heavy work asynchronously (e.g. queue it) rather than blocking the response.
- Use the
X-Vivreal-Deliveryheader for idempotency — the same event may be delivered more than once. - Log failures for debugging — check the Webhook Delivery section in the portal for delivery history.
Always verify the X-Vivreal-Signature header (format: sha256=<hex>) before processing a webhook. Without verification, an attacker could send fake events to your endpoint.
During development, return a 200 immediately and log the payload. Once your logic is stable, add signature verification and error handling.
Common Use Cases
| Use Case | Event | Action |
|---|---|---|
| Rebuild static site | content.updated | Trigger Amplify rebuild |
| Send notification | content.created | Post to Slack or email |
| Sync to external DB | Any | Upsert into Postgres / Algolia |
| Invalidate cache | content.updated | Purge CDN cache key |
Next Steps
- Explore the full API reference for all available endpoints
- See the Webhooks overview for retry policy and signature details
- See Event Types for the full list of events Vivreal emits