Développeurs

Envoyer les réponses vers votre propre serveur avec des webhooks

Recevez chaque réponse sous forme de charge utile JSON signée, et vérifiez qu’elle provient bien de StrawPoll.

Un webhook envoie chaque réponse à une adresse sur votre propre serveur, sous forme de requête POST avec un corps JSON.

Le configurer

  1. Ouvrez Intégrations dans votre tableau de bord, cliquez sur Ajouter une intégration et choisissez Webhooks.
  2. Saisissez l’URL de votre endpoint. Elle doit commencer par https:// et être accessible depuis Internet.
  3. Facultatif : ajoutez les en-têtes attendus par votre endpoint, par exemple un en-tête Authorization.
  4. Choisissez le sondage et indiquez s’il faut envoyer les nouvelles réponses, les réponses modifiées ou les deux, puis enregistrez.
  5. Copiez le Secret de signature depuis la page de l’intégration, puis cliquez sur Envoyer un test.

La charge utile

json
{
	"id": "0193f1c2-…",
	"event": "response.created",
	"createdAt": "2026-11-08T14:05:12.000Z",
	"form": {
		"id": "…",
		"slug": "dejeuner-equipe",
		"name": "Déjeuner d’équipe",
		"title": "Où déjeune-t-on vendredi ?",
		"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": "Q1 · Où déjeune-t-on ?",
				"value": "…",
				"text": "Pizza"
			}
		],
		"comment": null
	}
}
  • event vaut response.created, response.updated, response.deleted ou ping pour Envoyer un test.
  • Pour response.deleted, deletedAt indique quand le participant a supprimé sa réponse et answers contient ce qu’il avait envoyé. Supprimez-la aussi de vos propres données.
  • id est unique pour chaque envoi. Utilisez-le pour ignorer un envoi que vous avez déjà traité.
  • answers liste toutes les questions, dans l’ordre. text est la réponse telle qu’elle apparaît dans vos résultats ; value est la valeur brute, dont la forme dépend du type de question.

En-têtes

En-têteContenu
X-StrawPoll-EventL’événement, par exemple response.created
X-StrawPoll-DeliveryL’id de l’envoi
X-StrawPoll-TimestampL’heure d’envoi, en secondes Unix
X-StrawPoll-Signaturesha256= suivi de la signature

Vérifier la signature

La signature est un HMAC-SHA256, calculé avec votre secret de signature, de l’identifiant de l’envoi, de l’horodatage et du corps brut de la requête, reliés par des points. Calculez-la vous-même et comparez :

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))
	);
}

Signez le corps exactement tel qu’il est arrivé, avant de l’analyser. Rejeter les horodatages trop anciens empêche quiconque de rejouer une requête interceptée.

Si votre secret a pu fuiter, cliquez sur Renouveler sur la page de l’intégration. L’ancien secret cesse immédiatement de fonctionner : mettez donc votre endpoint à jour.

Répondre à temps

Répondez avec n’importe quel statut 2xx dans un délai de 10 secondes. Effectuez les traitements longs après avoir répondu.

En cas d’échec d’un envoi, StrawPoll réessaie trois fois au cours de la demi-minute suivante, avec le même id. Il ne réessaie pas après une réponse 4xx autre que 429, et ne suit jamais les redirections. Chaque tentative apparaît dans Envois récents, avec la réponse de votre serveur.