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
- Abre Integraciones en tu panel, haz clic en Añadir una integración y elige Webhooks.
- Escribe la URL de tu endpoint. Debe empezar por
https://y ser accesible desde Internet. - Opcional: añade las cabeceras que espera tu endpoint, por ejemplo una cabecera
Authorization. - Elige la encuesta e indica si hay que enviar las respuestas nuevas, las cambiadas o ambas, y guarda.
- Copia el Secreto de firma desde la página de la integración y haz clic en Enviar prueba.
La carga útil
{
"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
}
}eventvaleresponse.created,response.updated,response.deletedopingcon Enviar prueba.- En
response.deleted,deletedAtindica cuándo eliminó el participante su respuesta yanswerscontiene lo que había enviado. Elimínala también de tus propios datos. ides único para cada envío. Úsalo para ignorar un envío que ya hayas procesado.answersenumera todas las preguntas, en orden.textes la respuesta tal como aparece en tus resultados;valuees el valor sin procesar, cuya forma depende del tipo de pregunta.
Cabeceras
| Cabecera | Contenido |
|---|---|
X-StrawPoll-Event | El evento, por ejemplo response.created |
X-StrawPoll-Delivery | El id del envío |
X-StrawPoll-Timestamp | La hora de envío, en segundos Unix |
X-StrawPoll-Signature | sha256= 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:
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.