Für Entwickler
Antworten per Webhook an deinen eigenen Server senden
Empfange jede Antwort als signierte JSON-Nutzlast und prüf, ob sie von StrawPoll kommt.
Ein Webhook schickt jede Antwort an eine Adresse auf deinem eigenen Server, als POST-Anfrage mit einem JSON-Body.
Einrichten
- Öffne in deinem Dashboard Integrationen, klick auf Integration hinzufügen und wähle Webhooks.
- Gib die URL deines Endpoints ein. Sie muss mit
https://beginnen und aus dem Internet erreichbar sein. - Optional: Füg Header hinzu, die dein Endpoint erwartet, etwa einen
Authorization-Header. - Wähle die Umfrage und ob neue Antworten, geänderte Antworten oder beides gesendet werden, und speichere.
- Kopiere das Signatur-Geheimnis von der Seite der Integration und klick dann auf Test senden.
Die Nutzlast
{
"id": "0193f1c2-…",
"event": "response.created",
"createdAt": "2026-11-08T14:05:12.000Z",
"form": {
"id": "…",
"slug": "teamessen",
"name": "Teamessen",
"title": "Wo essen wir am Freitag?",
"url": "https://strawpoll.com/…"
},
"response": {
"id": "…",
"createdAt": "2026-11-08T14:05:11.000Z",
"updatedAt": null,
"deletedAt": null,
"respondent": { "name": "Sam", "email": "sam@example.com", "phone": null },
"answers": [
{
"fieldId": "…",
"question": "F1 · Wo essen wir?",
"value": "…",
"text": "Pizza"
}
],
"comment": null
}
}eventistresponse.created,response.updated,response.deletedoderpingbei Test senden.- Bei
response.deletedsagtdeletedAt, wann die Antwort gelöscht wurde, undanswersenthält, was gesendet worden war. Entferne sie auch aus deinen eigenen Daten. idist bei jeder Zustellung eindeutig. Damit erkennst du eine Zustellung, die du schon verarbeitet hast.answerslistet jede Frage der Reihe nach auf.textist die Antwort, wie sie in deinen Ergebnissen steht.valueist der Rohwert, dessen Form vom Fragetyp abhängt.
Header
| Header | Inhalt |
|---|---|
X-StrawPoll-Event | Das Ereignis, etwa response.created |
X-StrawPoll-Delivery | Die id der Zustellung |
X-StrawPoll-Timestamp | Wann sie gesendet wurde, in Unix-Sekunden |
X-StrawPoll-Signature | sha256= und die Signatur |
Die Signatur prüfen
Die Signatur ist ein HMAC-SHA256 mit deinem Signatur-Geheimnis über die Zustellungs-ID, den Zeitstempel und den unveränderten Body, jeweils durch Punkte verbunden. Berechne sie selbst und vergleiche:
import { createHmac, timingSafeEqual } from 'node:crypto';
function isFromStrawPoll(request, rawBody, secret) {
const id = request.headers['x-strawpoll-delivery'];
const timestamp = request.headers['x-strawpoll-timestamp'];
const signature = request.headers['x-strawpoll-signature'] ?? '';
const expected =
'sha256=' + createHmac('sha256', secret).update(`${id}.${timestamp}.${rawBody}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 300;
return (
fresh &&
signature.length === expected.length &&
timingSafeEqual(Buffer.from(signature), Buffer.from(expected))
);
}Signiere den Body genau so, wie er angekommen ist, bevor du ihn parst. Wenn du alte Zeitstempel ablehnst, kann niemand eine abgefangene Anfrage noch einmal abspielen.
Könnte dein Geheimnis in falsche Hände geraten sein, klick auf der Seite der Integration auf Erneuern. Das alte Geheimnis gilt sofort nicht mehr, pass also deinen Endpoint an.
Rechtzeitig antworten
Antworte innerhalb von 10 Sekunden mit einem beliebigen 2xx-Status. Langsame Arbeit erledigst du, nachdem du geantwortet hast.
Schlägt eine Zustellung fehl, versucht StrawPoll es in der nächsten halben Minute noch dreimal, mit derselben id. Eine 4xx-Antwort außer 429 wird nicht wiederholt, und Weiterleitungen folgt StrawPoll nie. Jeder Versuch erscheint unter Letzte Übermittlungen, mit der Antwort deines Servers.