Desarrolladores

Enviar las respuestas a tu servidor por webhook

Recibe cada respuesta como una carga útil JSON firmada, y comprueba que viene de verdad de StrawPoll.

Un webhook envía cada respuesta a una dirección de tu propio servidor, como una petición POST con un cuerpo JSON.

Configurarlo

  1. Abre Integraciones en tu panel, haz clic en Añadir una integración y elige Webhooks.
  2. Escribe la URL de tu endpoint. Debe empezar por https:// y ser accesible desde Internet.
  3. Opcional: añade las cabeceras que espera tu endpoint, por ejemplo una cabecera Authorization.
  4. Elige la encuesta e indica si hay que enviar las respuestas nuevas, las cambiadas o ambas, y guarda.
  5. Copia el Secreto de firma desde la página de la integración y haz clic en Enviar prueba.

La carga útil

json
{
	"id": "0193f1c2-…",
	"event": "response.created",
	"createdAt": "2026-11-08T14:05:12.000Z",
	"form": {
		"id": "…",
		"slug": "comida-equipo",
		"name": "Comida de equipo",
		"title": "¿Dónde comemos el viernes?",
		"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": "P1 · ¿Dónde comemos?",
				"value": "…",
				"text": "Pizza"
			}
		],
		"comment": null
	}
}
  • event vale response.created, response.updated, response.deleted o ping con Enviar prueba.
  • En response.deleted, deletedAt indica cuándo eliminó el participante su respuesta y answers contiene lo que había enviado. Elimínala también de tus propios datos.
  • id es único para cada envío. Úsalo para ignorar un envío que ya hayas procesado.
  • answers enumera todas las preguntas, en orden. text es la respuesta tal como aparece en tus resultados; value es el valor sin procesar, cuya forma depende del tipo de pregunta.

Cabeceras

CabeceraContenido
X-StrawPoll-EventEl evento, por ejemplo response.created
X-StrawPoll-DeliveryEl id del envío
X-StrawPoll-TimestampLa hora de envío, en segundos Unix
X-StrawPoll-Signaturesha256= seguido de la firma

Verificar la firma

La firma es un HMAC-SHA256, calculado con tu secreto de firma, del identificador del envío, la marca de tiempo y el cuerpo sin procesar de la petición, unidos por puntos. Calcúlala tú mismo y compara:

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

Firma el cuerpo exactamente como ha llegado, antes de analizarlo. Rechazar las marcas de tiempo demasiado antiguas impide que nadie reenvíe una petición interceptada.

Si tu secreto ha podido filtrarse, haz clic en Rotar en la página de la integración. El secreto anterior deja de funcionar al instante: actualiza tu endpoint.

Responder a tiempo

Responde con cualquier estado 2xx en un plazo de 10 segundos. Haz los procesos largos después de responder.

Si un envío falla, StrawPoll lo reintenta tres veces en el medio minuto siguiente, con el mismo id. No reintenta tras una respuesta 4xx distinta de 429, y nunca sigue redirecciones. Cada intento aparece en Entregas recientes, con la respuesta de tu servidor.