Introducción
Con la Forms API (v4), tu propio código crea encuestas y formularios, los publica, recoge las respuestas y lee los resultados. Es la misma API que usa el editor de StrawPoll.
- URL base:
https://api.strawpoll.com/v4(también disponible enhttps://strawpoll.com/api/v4) - Formato: JSON tanto de entrada como de salida. Las marcas de tiempo son cadenas ISO 8601, y los identificadores, UUID.
- Especificación legible por máquina: OpenAPI 3.1
Cada formulario tiene un identificador público corto, el slug, como en https://strawpoll.com/r/AZPg4n1Td3-hnVAj6Q8p. Todos los endpoints de formularios esperan el slug.
Autenticación
Crea una clave en Ajustes → Claves de API. Solo se muestra una vez: guárdala en un lugar seguro. Envíala con cada petición:
curl https://api.strawpoll.com/v4/me
-H "X-API-Key: sp_your_key"Authorization: Bearer sp_your_key también funciona. Una clave actúa en tu nombre: puede gestionar
todos los formularios que gestionas en el panel, incluidos los de los espacios de trabajo de los
que eres miembro. Elimina una clave en los ajustes para revocarla al instante.
Los endpoints para los participantes, submit y verify, no piden clave desde un navegador. Las
peticiones de scripts, bibliotecas HTTP, navegadores headless, bots y agentes de IA, reconocidos
por su user agent, se rechazan con automated si no envían una clave.
Errores
Los errores devuelven el estado HTTP correspondiente y un cuerpo JSON:
{ "error": "This poll is closed.", "code": "closed" }error está pensado para personas; code, cuando aparece, para tu código.
| Estado | Significado |
|---|---|
| 400 | La petición no es válida. Los errores de voto indican también la pregunta en step. |
| 401 | Sin clave de API, o invalid_api_key. |
| 403 | No puedes gestionar este formulario, o no acepta esta respuesta. |
| 404 | No encontrado. |
| 409 | Conflicto, por ejemplo una respuesta duplicada (duplicate). |
| 429 | rate_limited: espera los segundos que indica Retry-After. |
| 503 | busy: están llegando muchísimos votos a la vez. Vuelve a intentarlo en un momento. |
Límites de frecuencia
120 peticiones por minuto y por clave. Sin clave, las peticiones de un navegador se cuentan por
cuenta con sesión iniciada o por navegador (mediante su cookie de voto), hasta 3000 por minuto para
todos los navegadores detrás de una misma dirección IP; las peticiones sin ninguna de las dos se
cuentan por dirección IP. Cada respuesta indica tu cuota en X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset (segundos Unix).
Estructura de un formulario
Un formulario es una lista de sections. Las secciones de pregunta contienen fields, y los campos de opciones contienen choices.
type de sección | Qué se pregunta | Fields |
|---|---|---|
multiple_choice | Elegir una o varias opciones; properties.layout dropdown muestra una respuesta como desplegable | un field multiple_choice con choices |
picture_choice | Elegir imágenes | un field multiple_choice, choices con mediaId |
ranking | Ordenar opciones, con puntos por puesto | un field ranking con choices |
ranked_choice | Papeleta de voto preferencial, con recuento por segunda vuelta instantánea | un field ranked_choice con choices |
meeting | Encontrar una fecha | un field date por día (label YYYY-MM-DD), un choice por hueco (label 09:00-10:00 o All day) |
content | Texto, o una pregunta con properties.variant en yes_no, rating, scale, text, long_text, name, email o word_cloud | un field para la pregunta |
contact_info | Nombre y dirección de correo | fields text_small y email |
page_break, welcome_screen, thank_you_screen, end_screen, redirect | Diseño y pantallas finales | ninguno |
Los ajustes válidos para todo el formulario están en properties. Los más usados:
| Propiedad | Valores | Por defecto |
|---|---|---|
resultsVisibility | public, public_after_response, public_after_close, private | public |
responsesVisibility | public muestra los nombres junto a los resultados, private no | private |
responseDuplicateCheck | none, session, ip, name, email, code | ip |
responseDuplicateCheckInterval | minutos hasta que una misma persona puede volver a responder, o null | null |
opensAt, closesAt | marcas de tiempo ISO, o null | null |
responseLimit | número máximo de respuestas, o null | null |
allowComments, commentsVisibility | true/false, public/private | false, private |
editResponsePermissions | admin_own_responses, own_responses, admin, nobody | admin_own_responses |
blockVPNUsers, useCaptchaVerification | true/false | true, false |
La especificación OpenAPI enumera todas las propiedades de las secciones, fields y choices.
Crear una encuesta
curl https://api.strawpoll.com/v4/forms
-H "X-API-Key: sp_your_key"
-H "Content-Type: application/json"
-d '{
"title": "¿Dónde comemos?",
"status": "published",
"properties": { "responseDuplicateCheck": "ip", "resultsVisibility": "public" },
"sections": [{
"type": "multiple_choice",
"fields": [{
"type": "multiple_choice",
"label": "¿Dónde comemos?",
"properties": { "isMultipleChoice": false },
"choices": [{ "label": "Pizza" }, { "label": "Sushi" }, { "label": "Tacos" }]
}]
}]
}'La respuesta contiene el formulario completo, con los identificadores generados y sus enlaces en urls.formUrl y urls.resultsUrl. Sin "status": "published", un formulario empieza como
borrador, visible solo para ti.
Una encuesta de reunión propone huecos en determinados días, en la zona horaria de la sección:
{
"title": "Reunión de equipo",
"status": "published",
"sections": [
{
"type": "meeting",
"properties": { "timezone": "Europe/Madrid", "duration": 60, "location": "Sala 1" },
"fields": [
{
"type": "date",
"label": "2026-11-02",
"choices": [{ "label": "09:00-10:00" }, { "label": "14:00-15:00" }]
},
{ "type": "date", "label": "2026-11-03", "choices": [{ "label": "09:00-10:00" }] }
]
}
]
}Asistentes de IA (MCP)
StrawPoll tiene un servidor de Model Context Protocol: así, asistentes de IA como Claude, ChatGPT o Cursor pueden crear encuestas y leer resultados por ti.
- URL del servidor:
https://strawpoll.com/mcp(Streamable HTTP) - Conexión: OAuth. Añade la URL como conector personalizado en tu asistente e inicia sesión en
StrawPoll cuando te lo pida; tú decides si autorizas el acceso. Los clientes sin OAuth pueden
enviar en su lugar una clave de API mediante
X-API-KeyoAuthorization: Bearer sp_your_key.
| Herramienta | Qué hace |
|---|---|
create_poll | Una pregunta con opciones: una votación, una clasificación o una encuesta de reunión. Publicada. |
create_form | Un cuestionario de varias preguntas, de multiple_choice a matrix. Un borrador. |
publish_poll | Publicar un borrador. |
list_polls | Tus encuestas, de la más reciente a la más antigua, con el número de respuestas. |
get_results | Votos por opción, puestos medios, disponibilidad de las encuestas de reunión y últimas respuestas de texto. |
set_poll_open | Cerrar una encuesta o reabrirla. |
Las encuestas creadas por un asistente son tuyas como las demás y usan tus ajustes por defecto para encuestas nuevas. Un asistente puede crear hasta 30 por hora.
Enlaces de encuesta
Los asistentes sin herramientas pueden darte un enlace que abre el editor con la encuesta ya rellenada, lista para revisar y publicar:
https://strawpoll.com/forms/new?title=%C2%BFD%C3%B3nde%20comemos%3F&options=Pizza|Sushi|Tacosoptions se divide por | (o repite option=). Añade type=ranking o type=meeting (opciones como 2026-11-03 o 2026-11-03 14:00-15:00, con timezone=Europe/Madrid), multiple=1 para permitir más de una respuesta y other=1 para una respuesta libre.
Endpoints
Cuenta
GET/me | El propietario de la clave y sus espacios de trabajo. |
Formularios
GET/forms | Tus formularios, del más reciente al más antiguo. ?workspaceId= muestra los formularios de un espacio de trabajo. |
POST/forms | Crear un formulario. workspaceId opcional; por defecto, tu primer espacio de trabajo. |
GET/forms/{slug} | El formulario publicado, con sus sections, fields, choices y recuentos. |
PUT/forms/{slug} | Sustituir el formulario publicado (ver más abajo). |
PATCH/forms/{slug} | Cambiar solo name, isOpen o properties. |
DELETE/forms/{slug} | Eliminar definitivamente el formulario y sus respuestas. |
PUT lo sustituye todo: las sections, fields y choices que omitas se eliminan, con sus
respuestas. Vuelve a enviar los identificadores de los elementos que quieras conservar para que sus
respuestas se mantengan. Los formularios retirados por moderación (deleted, blocked) responden 403.
Borradores y publicación
El editor guarda los cambios como borrador y los publica en un solo paso. Hasta entonces, los participantes siguen viendo el formulario publicado.
PUT/forms/{slug}/draft | Guardar title, themeId, properties y sections como borrador. |
DELETE/forms/{slug}/draft | Descartar el borrador. |
POST/forms/{slug}/publish | Publicar el borrador. Un cuerpo con sections se guarda antes. |
Respuestas
GET/forms/{slug}/responses | Las respuestas, de la más reciente a la más antigua. limit (hasta 100) y offset. |
DELETE/forms/{slug}/responses | Restablecer: eliminar todas las respuestas y poner los recuentos a cero. |
Los totales por opción están en el propio formulario: responseCount en cada field y cada choice,
y score en las clasificaciones. El objeto fields de una respuesta contiene sus respuestas en la
forma descrita en Enviar una respuesta.
Enviar una respuesta
POST/forms/{slug}/submit envía una respuesta igual que la página de votación, aplicando todas
las reglas del formulario: calendario, límites, una respuesta por persona, captcha, bloqueo de
VPN, códigos y verificación del correo. Los navegadores no necesitan clave; los scripts y otros
clientes automatizados tienen que enviar una.
{
"fields": {
"<id del campo de opciones>": ["<id del choice>"],
"<id del campo de clasificación>": [
"<id del mejor choice>",
"<id del siguiente choice>",
"<id del último choice>"
],
"<id del campo de fecha>": [{ "choiceId": "<id del choice>", "status": "yes" }],
"<id del campo sí/no>": "yes",
"<id del campo de texto>": "Texto libre"
},
"name": "Ada",
"comment": "Opcional",
"code": "Código único opcional"
}| Respuesta | Forma |
|---|---|
| Preguntas de opciones y de imágenes | lista de identificadores de choices, más un texto si se permiten respuestas libres |
| Clasificación | cada identificador de choice, el mejor primero |
| Voto preferencial | el identificador del choice en cada puesto, el mejor primero, null para un puesto en blanco |
| Encuesta de reunión | para cada field de fecha, una lista de choiceId y status (yes, if_need_be, no); name es obligatorio |
| Sí/no | "yes" o "no" |
| Valoración y escala | el número como cadena, por ejemplo "4" |
| Campos de texto y datos de contacto | una cadena |
Un envío correcto devuelve el id de la respuesta. Los rechazos llevan un code: upcoming, closed, full, unavailable, decided, captcha, vpn, code, verify_email, disposable, automated (todos con 403), duplicate (409) y busy (503).
El navegador del participante recibe una cookie strawpoll_session. Con ella, PUT/forms/{slug}/submit y
el id de la respuesta cambian esa respuesta, si el formulario permite a los participantes
cambiarla.
En los formularios limitados a una respuesta por dirección de correo, verifica primero la
dirección con POST/forms/{slug}/verify: envía action: "send" con el email, y luego action: "verify" con el code de 6 cifras que ha recibido el participante.
Códigos e invitaciones
GET/forms/{slug}/codes | Códigos únicos. |
POST/forms/{slug}/codes | Generar count códigos de length caracteres, con style y prefix opcionales. |
DELETE/forms/{slug}/codes | Eliminar códigos por ids. |
GET/forms/{slug}/invites | Invitaciones por correo. |
POST/forms/{slug}/invites | Añadir una invitación, o hasta 1000 mediante invites. |
PATCH/forms/{slug}/invites/{id} | Cambiar una invitación. |
DELETE/forms/{slug}/invites/{id} | Eliminar una invitación. |
DELETE/forms/{slug}/invites | Eliminar invitaciones por ids. |
POST/forms/{slug}/invites/import | Invitar a todas las personas de una lista de invitados (inviteListId). |
POST/forms/{slug}/invites/send | Enviar las invitaciones por correo con subject y message. |
Los mensajes de invitación pueden usar las variables name, form y link entre dobles llaves.
Medios y temas
POST/media | Subir una imagen (file en multipart, hasta 5 MB). Su id sirve como mediaId de un choice. |
GET/themes | Tus temas, los de tus espacios de trabajo y los temas integrados; ?workspaceId= para los de un espacio de trabajo. |
POST/themes | Crear un tema con un name y properties de color; añade workspaceId para compartirlo con un espacio de trabajo que posees o gestionas. |
PUT/themes/{id} | Cambiar un tema. workspaceId lo comparte con un espacio de trabajo; null lo vuelve a hacer personal de su propietario. |
DELETE/themes/{id} | Eliminar un tema. Los temas de un espacio de trabajo los pueden cambiar y eliminar su propietario y sus administradores. |
Migrar desde la Poll API (v3)
La Poll API v3 sigue funcionando, con las mismas rutas, claves y encuestas. La guía de compatibilidad v3 indica qué corresponde a qué.