Saltar al contenido

Desarrolladores

API para desarrolladores

Automatiza PollsLive desde tu propio backend: crea encuestas, lee resultados, ejecuta sesiones en vivo y recibe webhooks. Disponible en todos los planes de pago: Pro y Premium.

Visión general

La API para desarrolladores es una API REST bajo /api/v1. Todas las solicitudes y respuestas son JSON. El contrato completo e interactivo está en la referencia de la API; esta página te lleva a tu primera llamada exitosa.

Autenticación

Autentícate con una clave de API del workspace enviada como token Bearer. Genera una en Studio → API para desarrolladores (planes de pago). El secreto se muestra una sola vez - guárdalo en un lugar seguro; si lo pierdes, revoca la clave y crea una nueva.

Cabecera de autorización
Authorization: Bearer $POLLSLIVE_KEY

Las claves actúan con autoridad de administrador dentro de su workspace. Nunca expongas una clave en código del lado del cliente: llama a la API desde tu servidor.

You can also authenticate using an OAuth 2.0 Client Credentials access token for machine-to-machine integrations.

Inicio rápido

Crea una encuesta, publícala y luego lee los resultados:

Crear una encuesta
curl -X POST https://pollslive.com/api/v1/polls \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Lunch vote",
    "content": {
      "questions": [{
        "id": "q1", "kind": "multiple_choice", "text": "Where to?",
        "type": "single",
        "options": [
          { "id": "a", "label": "Tacos" },
          { "id": "b", "label": "Sushi" }
        ]
      }]
    }
  }'
Publícala (usa el id de la respuesta de creación)
curl -X PATCH https://pollslive.com/api/v1/polls/POLL_ID \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "publish": true }'
Leer resultados
curl https://pollslive.com/api/v1/polls/POLL_ID/results \
  -H "Authorization: Bearer $POLLSLIVE_KEY"

Tipos de preguntas

Una encuesta es un mazo de diapositivas tipadas. Establece kind en cada diapositiva. Cada uno de estos tipos se puede crear mediante la API:

  • multiple_choice: type (única/múltiple), options[]. Votable de forma asíncrona.
  • quiz: options[], correctOptionIds[], timeLimitSec, points, speedBonus.
  • quiz_typed: acceptedAnswers[], timeLimitSec, points, speedBonus (solo en sesiones en vivo; 1-10 respuestas válidas de hasta 60 caracteres cada una, comparadas sin tener en cuenta mayúsculas ni espacios de más; los jugadores escriben hasta 40 caracteres).
  • quiz_order: items[], timeLimitSec, points, speedBonus (solo en sesiones en vivo; 3-6 elementos con id y label, guardados en el orden correcto; los jugadores los ven mezclados y solo puntúa el orden exacto).
  • scale: min, max, minLabel, maxLabel, statements[].
  • ranking: options[] (los encuestados las ordenan).
  • open_ended: maxLength, render (lista/nube).
  • qa: moderated, allowUpvotes.
  • estimation: cards[], deckPreset (Planning Poker; solo en sesiones en vivo, los votos permanecen ocultos hasta que los reveles).
  • brainstorm: maxLength, moderated, groups[], votesPerPerson (solo en sesiones en vivo; la sala vota los grupos que formas a partir de las ideas).
  • content - solo de visualización.
Una diapositiva de escala y una de quiz
{
  "questions": [
    {
      "id": "s1", "kind": "scale", "text": "How likely are you to recommend us?",
      "min": 0, "max": 10, "minLabel": "Not likely", "maxLabel": "Very likely"
    },
    {
      "id": "q2", "kind": "quiz", "text": "Capital of France?",
      "options": [{ "id": "a", "label": "Paris" }, { "id": "b", "label": "Rome" }],
      "correctOptionIds": ["a"], "timeLimitSec": 20, "points": 100, "speedBonus": true
    },
    {
      "id": "q3", "kind": "ranking", "text": "Rank these features by importance",
      "options": [
        { "id": "r1", "label": "Speed" },
        { "id": "r2", "label": "Reliability" },
        { "id": "r3", "label": "Price" }
      ]
    },
    {
      "id": "q4", "kind": "open_ended", "text": "Any other feedback?",
      "maxLength": 300, "render": "list"
    },
    {
      "id": "q5", "kind": "qa", "text": "Questions for the presenter",
      "moderated": true, "allowUpvotes": true
    }
  ]
}

Imágenes, vídeo y enlaces

Cualquier diapositiva y cualquier opción puede llevar media. Sube o pasa una URL a POST /media e incrusta el objeto devuelto. Las imágenes se descargan, se recodifican a WebP y se vuelven a alojar (cargas más pequeñas). Los vídeos de YouTube y los enlaces web conservan su URL y se renderizan del lado del cliente, así que nunca pagas por alojar vídeo. También puedes pasar media: { type, url } en línea en una diapositiva u opción y la API lo resuelve al guardar.

Ingiere una imagen y luego incrústala
# 1) Ingest an image (returns { data: { type, url, storedUrl, width, height } })
curl -X POST https://pollslive.com/api/v1/media \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://example.com/cat.jpg" }'

# 2) Embed the storedUrl on a slide option
{ "id": "a", "label": "Option A", "media": { "type": "image", "url": "https://pollslive.com/media/abc.webp" } }

# Or pass the original URL inline - the API resolves it on save:
{ "id": "a", "label": "Option A", "media": { "type": "image", "url": "https://example.com/cat.jpg" } }

# YouTube on a question slide
{ "id": "q1", "kind": "content", "text": "Watch this first",
  "media": { "type": "youtube", "url": "https://youtu.be/dQw4w9WgXcQ" } }

Respuestas y resultados

multiple_choice las diapositivas reciben votos mediante POST /polls/{id}/votes. Cualquier otro tipo recibe respuestas asíncronas mediante POST /polls/{id}/responses - envía el campo que corresponda a la diapositiva (scaleValue, rankingOrder, text, o optionIds). Lee los agregados por diapositiva desde GET /polls/{id}/results.

Record a scale response
curl -X POST https://pollslive.com/api/v1/polls/POLL_ID/responses \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "voterId": "user-123", "slideId": "s1", "scaleValue": 9 }'
Record a ranking response
curl -X POST https://pollslive.com/api/v1/polls/POLL_ID/responses \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "voterId": "user-123",
    "slideId": "q3",
    "rankingOrder": ["r2", "r1", "r3"]
  }'
Record an open-ended response
curl -X POST https://pollslive.com/api/v1/polls/POLL_ID/responses \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "voterId": "user-123", "slideId": "q4", "text": "Great product!" }'

Sesiones en vivo y control de sesiones

A live session lets you drive a poll in real time in front of an audience. Create a session via the API, share the PIN or QR code, then control pacing and results visibility with the control endpoint.

Crear una sesión
curl -X POST https://pollslive.com/api/v1/sessions \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "pollId": "POLL_ID" }'
# Response includes: id, pin, status, currentSlideIndex, hostToken (once)
Avanzar a la siguiente diapositiva
curl -X POST https://pollslive.com/api/v1/sessions/SESSION_ID/control \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "action": "next" }'

Todas las acciones de control de sesión

Haz un POST a /api/v1/sessions/{id}/control (Bearer) con una de estas cadenas de acción.

AcciónDescripción
startAbre la sesión y emite la primera diapositiva.
nextAvanza a la siguiente diapositiva.
prevVuelve a la diapositiva anterior.
gotoSalta a una diapositiva concreta: pasa slideIndex (empezando en 0) junto con action.
showResultsMuestra a los participantes los resultados en directo de la diapositiva actual.
hideResultsOculta los resultados (deja de mostrarlos a los participantes).
lockBloquea las respuestas: los participantes ya no pueden enviar respuestas a la diapositiva actual.
unlockDesbloquea las respuestas para que los participantes puedan responder.
endCierra la sesión. Los participantes ven un resumen de los resultados.
Jump to slide 2 (0-based)
{ "action": "goto", "slideIndex": 2 }

Exportar resultados

Descarga los resultados agregados como un archivo CSV UTF-8 RFC-4180, o como informe PDF con ?format=pdf. Cada fila contiene el número de diapositiva, el texto de la pregunta, el tipo, la etiqueta de respuesta y el recuento o valor. Compatible con Excel, Google Sheets y cualquier herramienta CSV. Solo en planes de pago.

Exportar los resultados de una encuesta como CSV
curl https://pollslive.com/api/v1/polls/POLL_ID/export \
  -H "Authorization: Bearer $POLLSLIVE_KEY" \
  --output results.csv

# CSV structure:
# Slide, Question, Type, Answer / Label, Count / Value
# 1, "Where to?", multiple_choice, Tacos, 12
# 1, "Where to?", multiple_choice, Sushi, 8
# 2, "Rate your experience", scale, Average, 8.50
# 2, "Rate your experience", scale, Rating 10, 5

Endpoints

  • Encuestas: GET/POST /polls, GET/PATCH/DELETE /polls/{id}
  • Resultados: GET /polls/{id}/results, GET/POST /polls/{id}/responses
  • Votos: GET/POST /polls/{id}/votes
  • Medios: POST /media
  • Sesiones: POST /sessions, GET /sessions/{id}, POST /sessions/{id}/control
  • Exportar: GET /polls/{id}/export

Consulta las formas de solicitud/respuesta y prueba llamadas en vivo en la referencia de la API.

Errores y límites de tasa

Los errores usan un sobre estable:

Respuesta de error
{ "error": { "code": "not_found", "message": "Poll not found." } }

Códigos comunes: 401 clave inválida o ausente, 402 se requiere mejorar el plan, 404 no encontrado, 409 conflicto (p. ej. ya votó, encuesta cerrada), 422 validación fallida, 429 límite de tasa alcanzado.,

Límites de frecuencia

La API permite 120 peticiones por minuto por clave en todos los endpoints. La ingesta de medios (POST /media) tiene un límite aparte de 30 peticiones por minuto. Al superar un límite se devuelve HTTP 429. Espera y vuelve a intentarlo.

EndpointLimit
All endpoints120 req / min
POST /media30 req / min

OAuth2 (Pro y superior)

Cualquier espacio de trabajo de pago (Pro o superior) puede usar credenciales de cliente OAuth2 en lugar de claves estáticas. Crea los clientes en el Studio; la guía de OAuth explica el flujo completo.

Cambios de la API para desarrolladores

Cambios en la API para desarrolladores, del más reciente al más antiguo. Los cambios del producto están en el registro de cambios.

Junio de 2026

  • OAuth 2.0 Client Credentials: autenticación de máquina a máquina para integraciones SaaS y servicios de backend. Crea clientes OAuth en Studio → Developer API → OAuth 2.0 Clients. Los tokens de acceso son de corta duración (1 h).
  • Rotación de claves de API: rota una clave con un periodo de solapamiento configurable (Inmediatamente / 24 horas / 7 días) para que los sistemas puedan actualizarse sin tiempo de inactividad. La clave antigua caduca en el plazo elegido; la nueva está activa de inmediato.
  • Analítica de uso por clave: un gráfico de uso por clave en el portal para desarrolladores (últimos 14 días), con recuentos diarios de peticiones de hasta 90 días.
  • POST /api/oauth/token: endpoint de concesión Client Credentials según RFC 6749.
  • GET /api/v1/postman: colección de Postman v2.1 importable con todos los endpoints de la API.

T4 2025

  • Webhooks: recibe eventos firmados con HMAC: poll.published, poll.closed, session.started, session.ended, response.created, vote.created.
  • GET /polls/{id}/export: descarga los resultados en CSV (Slide, Question, Type, Answer, Count).

T3 2025

  • API para desarrolladores v1: endpoints REST para encuestas, respuestas, control de sesiones en directo y multimedia.
  • Gestión de claves de API: crea, lista y revoca claves Bearer con alcance de espacio de trabajo en Studio → API para desarrolladores.

Política de versionado de la API

La API REST se versiona a nivel de URL (/api/v1/). Los cambios que rompen compatibilidad solo se introducen con un nuevo prefijo de versión y con al menos 90 días de aviso en funcionamiento paralelo. Los cambios aditivos (campos nuevos, endpoints nuevos, eventos de webhook nuevos) no rompen nada y pueden publicarse en cualquier momento.

¿Aún tienes preguntas?

Nuestro equipo estará encantado de ayudarte.

Contáctanos

Usamos cookies esenciales para mantener tu sesión iniciada y evitar votos duplicados. Con tu permiso, también usamos Cloudflare Web Analytics para contar las visitas a las páginas y el Whop Pixel para ver qué visitas terminan en una compra. Política de cookies