✦ Documentación de la API

Tus datos de compromiso, en tus propias herramientas

Una API REST de solo lectura sobre tus encuestas, ciclos, resultados agregados, personas y métricas del panel. Autenticación con bearer token, paginación por cursor y una promesa de versionado escrita, no solo implícita. Incluida en el plan Enterprise — un contrato anual personalizado, no una actualización de autoservicio. Habla con nosotros.

Autenticación

Un encabezado, una clave

Crea una clave en Configuración → API. La clave completa se muestra una sola vez, al crearla. Nosotros guardamos un hash SHA-256 de ella, así que si se pierde el único camino es revocarla y generar una nueva.

# Cada solicitud lleva la clave como bearer token.
curl https://app.bloomder.io/api/v1/surveys \
  -H "Authorization: Bearer blm_live_YOUR_KEY_HERE"

Qué puede y qué no puede hacer una clave

  • Está limitada a la organización que la creó. No existe una clave entre organizaciones.
  • Es de solo lectura. La API no tiene ningún endpoint de escritura, así que una clave filtrada no puede alterar, borrar ni enviar nada.
  • Puede revocarse en cualquier momento por el dueño de la cuenta, con efecto en la siguiente solicitud.
  • Opcionalmente puede configurarse para expirar después de cierto número de días. Si se deja en blanco, la clave no expira — una expiración silenciosa rompería el trabajo nocturno de un cliente meses después de haberla configurado.

Trata una clave como una contraseña

Una clave otorga acceso de lectura a todos los datos de compromiso de tu organización. Guárdala en un gestor de secretos, nunca en código del lado del cliente ni en un repositorio público, y revócala en el momento en que sospeches de una exposición. Cada creación y revocación queda registrada en tu registro de auditoría.

Anonimato

Lo que esta API no devuelve

La garantía de anonimato es una propiedad de la plataforma, no del panel, así que aplica aquí de forma idéntica. Este es el resumen honesto más breve de lo que no puedes obtener, ni siquiera con una clave válida.

  • Ninguna respuesta individual. No existe un endpoint que devuelva las respuestas de una sola persona, porque la plataforma elimina el vínculo entre una respuesta y una persona en el momento en que la respuesta se guarda.
  • Ningún resultado de grupos pequeños. Los agregados de un ciclo con menos de cinco respondientes distintos regresan como suppressed: true, con solo los conteos de participación — que se conocen por la lista de envío, no por ninguna respuesta.
  • Ninguna forma de bajar el umbral. El piso de cinco está fijo en la plataforma desplegada y no puede cambiarlo un administrador, un parámetro de consulta, ni nosotros.

La segmentación por departamento sigue funcionando, porque un departamento es un atributo de grupo registrado al momento de enviar la invitación, no una identidad. Lee la explicación completa en la página de seguridad.

Paginación

Cursores, no números de página

Los endpoints de listado devuelven una página de data y un next_cursor. Pasa ese cursor de vuelta para obtener la siguiente página; null significa que llegaste al final. Los cursores son estables ante inserciones, algo que la paginación por offset no es — una encuesta creada a mitad del recorrido no puede hacer que te saltes o repitas una fila.

# Primera página: 50 encuestas.
curl "https://app.bloomder.io/api/v1/surveys?limit=50" \
  -H "Authorization: Bearer $BLOOMDER_KEY"

# Respuesta
{
  "data": [ { "id": "clx…", "name": "Q3 Pulse", "status": "ACTIVE", … } ],
  "next_cursor": "clx8f2k…"
}

# Siguiente página.
curl "https://app.bloomder.io/api/v1/surveys?limit=50&cursor=clx8f2k…" \
  -H "Authorization: Bearer $BLOOMDER_KEY"

limit tiene un valor por defecto de 25 y un tope de 100. Un valor mayor se recorta, no se rechaza.

Errores

Actúa según el código, no el mensaje

Todos los errores devuelven el mismo formato. code es una cadena estable que forma parte del contrato; error es texto legible para humanos que puede cambiar de redacción en cualquier momento. Construye tu integración contra el código.

{
  "error": "The public API is not included in this plan. It is part of the Enterprise plan — contact us to enable it.",
  "code": "plan_required"
}
EstadoCódigoQué significa
400invalid_requestUn parámetro estaba mal formado.
401invalid_api_keyLa clave falta, es desconocida, fue revocada o expiró. Un solo código para los cuatro casos, deliberadamente: la respuesta no puede usarse para averiguar qué claves existieron alguna vez.
402plan_requiredEl plan de la organización no incluye acceso a la API.
404not_foundNo existe ese recurso en esta organización. Un id que pertenece a otro cliente devuelve 404, nunca 403.
429rate_limitedSe superó el límite de tasa. Respeta el encabezado Retry-After.
500internal_errorAlgo falló de nuestro lado. El cuerpo trae un request_id — menciónalo en una solicitud de soporte y podremos encontrar la línea exacta del registro.
Límites de tasa

120 solicitudes por minuto, por clave

El presupuesto es por clave, no por organización ni por IP: tu integración corre desde donde sea que esté tu infraestructura, y dos claves en una misma cuenta no deberían competir por el mismo límite.

  • X-RateLimit-Limit y X-RateLimit-Window vienen en cada respuesta, no solo en un 429, así que un cliente puede regular su ritmo antes de que lo rechacen.
  • En un 429, Retry-After indica los segundos que hay que esperar. Respétalo en lugar de reintentar de inmediato.
  • ¿Necesitas más para una recarga masiva? Escribe a [email protected] y cuéntanos la forma del trabajo.
Versionado

Qué podemos cambiar, y qué no

Una API es una promesa sobre el futuro, así que esta es la promesa exacta. Cada respuesta también trae X-Bloomder-Api-Version con la fecha del contrato desplegado.

Los cambios aditivos se publican en /v1 sin previo aviso

  • Endpoints nuevos.
  • Campos nuevos en una respuesta existente. Interpreta con tolerancia: un campo desconocido no es un error.
  • Valores nuevos en un campo tipo enum, cuando el campo ya documenta que puede crecer.

Los cambios que rompen compatibilidad nunca se publican en /v1

Quitar un campo, renombrarlo, cambiar su tipo, o cambiar el significado de un valor existente — todo eso crea /api/v2 en su lugar. Cuando eso pasa, /v1 sigue funcionando durante al menos seis meses y empieza a devolver un encabezado Sunset con la fecha en que se detiene. También te lo haremos saber por correo antes de que aparezca el encabezado.

El documento OpenAPI es la especificación

Esta página explica la API; openapi.json la define, y no necesita una clave para leerse. Apunta ahí a Postman, Insomnia o el generador que prefieras.

Referencia

Todos los endpoints, en una tabla

Todas las rutas son relativas a https://app.bloomder.io/api/v1. No hay endpoints de escritura.

EndpointDevuelveParámetros
GET/surveys Tus encuestas, de la más reciente a la más antigua, con conteos de preguntas y ciclos. limit, cursor
GET/surveys/{id} Una encuesta con sus preguntas, su audiencia (departamentos, categorías, divisiones) y su calendario.
GET/surveys/{id}/runs Los ciclos de la encuesta con invitaciones enviadas, respuestas recibidas y tasa de respuesta. limit, cursor
GET/surveys/{id}/results Resultados agregados de un ciclo: distribuciones y promedios por pregunta, NPS, promedio de bienestar, desglose por departamento. Suprimido por debajo de cinco respondientes. run_id (se omite para usar el ciclo más reciente)
GET/employees Las personas de tu lista con su departamento, categoría y división. Sin datos de respuestas. limit, cursor, include_inactive
GET/departments Tus departamentos.
GET/categories Tus categorías de empleados, usadas para segmentar encuestas.
GET/divisions Tus divisiones.
GET/action-items Elementos de acción con prioridad, estado, responsable y fecha límite. limit, cursor
GET/metrics/dashboard Los mismos agregados que renderiza el panel para una ventana de tiempo. range (7, 28, 90, 180, 365, all, Q1Q4), department_id
GET/openapi.json El documento OpenAPI 3.1. No requiere autenticación.

Un ejemplo completo

Obtén los resultados más recientes de cada encuesta activa — la forma que toman la mayoría de las actualizaciones de BI.

#!/usr/bin/env bash
# Requiere: curl, jq. Define BLOOMDER_KEY en tu entorno.
set -euo pipefail
BASE="https://app.bloomder.io/api/v1"
AUTH=(-H "Authorization: Bearer $BLOOMDER_KEY")

curl -s "$BASE/surveys?limit=100" "${AUTH[@]}" \
  | jq -r '.data[] | select(.status == "ACTIVE") | .id' \
  | while read -r id; do
      curl -s "$BASE/surveys/$id/results" "${AUTH[@]}" \
        | jq '{survey: .survey_name, rate: .run.response_rate, suppressed, nps: .nps_score}'
    done

¿Listo para ponerla en marcha?

El acceso a la API es parte del plan Enterprise, un contrato anual personalizado. Habla con nosotros sobre lo que estás construyendo y lo configuramos; una vez activo, creas claves desde la configuración de tu cuenta.

¿Preguntas sobre una integración específica? Escribe a [email protected].