Integrationen
Webhooks
Andere Systeme bei neuen Bewerbungen und veröffentlichten Stellen benachrichtigen.
Unter Integrationen, Abschnitt Benachrichtigungen an andere Systeme, trägst du eine Adresse ein und wählst Ereignisse. Jeder Webhook bekommt ein Geheimnis, das mit whsec_ beginnt und nur einmal angezeigt wird.
| Ereignis | Wann |
|---|---|
application.submitted | Eine Bewerbung kommt über die Karriereseite. |
job.published | Eine Stelle wird veröffentlicht. |
application.stageChanged, application.rejected, application.hired | Geplant, noch nicht aktiv. |
Zustellung
Quontio sendet POST mit JSON und den Kopfzeilen x-quontio-event und x-quontio-signature. Antwortet dein System nicht innerhalb von zehn Sekunden mit 2xx, zählt der Versuch als Fehler; die Anzahl steht in der Liste. Wiederholt wird derzeit nicht.
{
"event": "application.submitted",
"organizationId": "…",
"occurredAt": "2026-09-12T10:00:00.000Z",
"data": {
"application": {
"id": "…", "jobId": "…", "jobTitle": "Frontend Developer",
"stageId": "new", "status": "active", "source": "indeed",
"candidate": { "firstName": "Anna", "lastName": "Muster", "email": "anna@example.org" },
"createdAt": "…", "url": "https://app.quontio.com/jobs/…/pipeline?application=…"
}
}
}Signatur prüfen
Die Kopfzeile hat die Form t=<Unix-Sekunden>,v1=<hex>. v1 ist ein HMAC-SHA256 über <t>.<Rohdaten des Bodys> mit deinem Geheimnis. Lehne Zeitstempel ab, die älter als fünf Minuten sind.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verify(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
const expected = createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
return timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}