When Catalogian detects a change in your source, it sends a POST request to your webhook endpoint with a JSON payload describing the delta event. This page documents every field.
{
"event": "delta",
"webhookId": "wh_a1b2c3d4",
"sourceId": "cmmfyryl30005ygld7m5596gm",
"sourceName": "West Coast Earthquakes",
"deltaEventId": "evt_01j8k9m2n3p4q5",
"detectedAt": "2026-09-28T20:00:00.000Z",
"summary": {
"newCount": 3,
"changedCount": 3,
"deletedCount": 1,
"unchangedCount": 195,
"totalCount": 202
},
"newKeys": [
"nc75443740", "nc75443741", "nc75443742"
],
"changedKeys": ["nc75443737", "nc75443736", "nc75443735"],
"deletedKeys": ["nc75443001"]
}| Field | Type | Description |
|---|---|---|
event | string | Always "delta" — the event type |
webhookId | string | The webhook endpoint ID that triggered this delivery |
sourceId | string | The source ID |
sourceName | string | Human-readable source name |
deltaEventId | string | The delta event ID, use it to fetch row details via the API |
detectedAt | string | ISO 8601 timestamp when the change was detected |
summary.newCount | integer | Number of rows added since last check |
summary.changedCount | integer | Number of rows with modified values |
summary.deletedCount | integer | Number of rows removed since last check |
summary.unchangedCount | integer | Number of rows with no changes |
summary.totalCount | integer | Total rows in the current snapshot |
newKeys | string[] | Key field values of added rows (max 100) |
changedKeys | string[] | Key field values of changed rows (max 100) |
deletedKeys | string[] | Key field values of removed rows (max 100) |
The newKeys, changedKeys, and deletedKeys arrays include up to 100 keys each. If more than 100 rows changed in a category, the array is truncated. Use the delta rows API to get the complete list.
Catalogian does not send webhooks for no-change events (when nothing changed). Webhooks only fire when at least one row was added, changed, or deleted.
Every webhook request includes these headers:
| Header | Value |
|---|---|
Content-Type | application/json |
X-Catalogian-Event | delta |
X-Catalogian-Delivery | Unique delivery ID (for deduplication) |
X-Catalogian-Attempt | Attempt number, 1 through 5 |
X-Catalogian-Signature | sha256=<hmac> (only if signing secret is configured) |
A typical webhook handler:
app.post("/webhooks/catalogian", async (req, res) => {
const { event, sourceId, summary, deltaEventId } = req.body;
// Quick acknowledge — process async
res.status(200).send("OK");
if (summary.changedCount > 0 || summary.newCount > 0) {
// Fetch full row data from the API
const rows = await fetch(
`https://api.catalogian.com/v1/sources/${sourceId}/delta/${deltaEventId}/rows`,
{ headers: { Authorization: "Bearer " + process.env.CATALOGIAN_KEY } }
).then(r => r.json());
// Process the changes...
await syncToDatabase(rows);
}
});Secure your webhook endpoint. Verifying Signatures →