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

  1. Öffne in deinem Dashboard Integrationen, klick auf Integration hinzufügen und wähle Webhooks.
  2. Gib die URL deines Endpoints ein. Sie muss mit https:// beginnen und aus dem Internet erreichbar sein.
  3. Optional: Füg Header hinzu, die dein Endpoint erwartet, etwa einen Authorization-Header.
  4. Wähle die Umfrage und ob neue Antworten, geänderte Antworten oder beides gesendet werden, und speichere.
  5. Kopiere das Signatur-Geheimnis von der Seite der Integration und klick dann auf Test senden.

Die Nutzlast

json
{
	"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
	}
}
  • event ist response.created, response.updated, response.deleted oder ping bei Test senden.
  • Bei response.deleted sagt deletedAt, wann die Antwort gelöscht wurde, und answers enthält, was gesendet worden war. Entferne sie auch aus deinen eigenen Daten.
  • id ist bei jeder Zustellung eindeutig. Damit erkennst du eine Zustellung, die du schon verarbeitet hast.
  • answers listet jede Frage der Reihe nach auf. text ist die Antwort, wie sie in deinen Ergebnissen steht. value ist der Rohwert, dessen Form vom Fragetyp abhängt.
HeaderInhalt
X-StrawPoll-EventDas Ereignis, etwa response.created
X-StrawPoll-DeliveryDie id der Zustellung
X-StrawPoll-TimestampWann sie gesendet wurde, in Unix-Sekunden
X-StrawPoll-Signaturesha256= 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:

js
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.