Webhooks
API-Schlüssel erhaltenEinen Webhook registrieren
Registrieren Sie eine öffentliche https-Adresse und die gewünschten Events. Das Signing-Secret (whsec_…) wird nur in dieser Antwort angezeigt. Eine Anwendung kann bis zu 10 Webhooks haben.
curl -X POST https://api.sofia-post.com/api/v1/webhooks \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"url":"https://app.example.com/hooks/sofia","events":["post.published","post.failed"]}'Events
| Event | data |
|---|---|
post.published | postId, establishmentId, platform, publishedAt, permalink |
post.failed | postId, establishmentId, platform, error |
webhook.test | webhookId |
Sofia sendet jedes Event per POST als JSON { id, type, createdAt, data }, mit den Headern Sofia-Event-Id, Sofia-Event-Type und Sofia-Signature. Es werden nur die Beiträge gemeldet, die Ihre Anwendung erstellt hat.
Die Signatur prüfen
Sofia-Signature ist t=<unix time>,v1=<hex>, wobei v1 der HMAC-SHA256 von <t>.<raw body> mit Ihrem Secret ist. Prüfen Sie sie am rohen Body und lehnen Sie einen alten Zeitstempel ab:
import { createHmac, timingSafeEqual } from 'node:crypto';
const isSignedBySofia = (header, rawBody, secret) => {
const parts = Object.fromEntries(
(header ?? '').split(',').map((part) => part.trim().split('=', 2)),
);
const timestamp = Number(parts.t);
if (!Number.isInteger(timestamp) || typeof parts.v1 !== 'string') return false;
if (Math.abs(Date.now() / 1000 - timestamp) > 300) return false;
const expected = createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest();
const received = Buffer.from(parts.v1, 'hex');
return received.length === expected.length && timingSafeEqual(received, expected);
};Zustellung und Wiederholungen
- Eine
2xx-Antwort stellt das Event zu. Jede andere Antwort, eine Weiterleitung (wird nie verfolgt) oder 10 Sekunden ohne Antwort löst eine Wiederholung nach 1 Minute, 5 Minuten, 30 Minuten und 2 Stunden aus, höchstens 5 Versuche. - Dasselbe Event kann zweimal ankommen: Deduplizieren Sie anhand von
Sofia-Event-Id. - Antworten Sie schnell und verarbeiten Sie das Event danach.
POST /v1/webhooks/{id}/test sendet ein Event webhook.test, signiert wie die anderen.