Referencia de la API
API de CivicFlow
Una API REST predecible y webhooks firmados para incidencias, equipos, categorías y vecinos: la misma API sobre la que construimos nuestras apps.
https://api.civicflow.site/v2 v2 · Estable OpenAPI 3.1 En esta página
La API se organiza en recursos con URL predecibles. Las peticiones y respuestas son JSON sobre HTTPS, las marcas de tiempo siguen ISO 8601 en UTC y todos los listados usan la misma paginación por cursor.
Cada espacio de trabajo tiene un entorno de producción y otro de pruebas con claves de API distintas. Los datos de pruebas nunca se muestran a los vecinos.
- Protocolo
- REST sobre HTTPS (TLS 1.3)
- Formato
- JSON, UTF-8
- Especificación
- OpenAPI 3.1
- Eventos
- Webhooks firmados
openapi.yaml está disponible en tu espacio, en Ajustes → Desarrolladores.
Autentícate con una clave de API secreta enviada como token Bearer. Los administradores crean las claves en Ajustes → Desarrolladores; cada clave tiene un nombre, un entorno y un conjunto de permisos (scopes), y puede rotarse o revocarse en cualquier momento.
curl https://api.civicflow.site/v2/incidents \ -H "Authorization: Bearer $CIVICFLOW_KEY" | Permiso | Permite |
|---|---|
incidents:read | Leer incidencias, historial y metadatos de adjuntos |
incidents:write | Crear, actualizar, asignar y resolver incidencias |
comments:write | Publicar notas internas y respuestas a vecinos |
attachments:write | Subir y eliminar adjuntos |
teams:read | Leer equipos, miembros y zonas de servicio |
categories:write | Crear y actualizar categorías y políticas de SLA |
webhooks:manage | Crear, probar y eliminar endpoints de webhooks |
residents:read | Leer y exportar perfiles de vecinos (datos personales) |
residents:erase | Anonimizar vecinos para atender solicitudes de supresión |
Los límites se aplican por espacio de trabajo y entorno, con un margen de ráfaga adicional. Cada respuesta indica tu cupo actual; si lo superas, la API devuelve 429 con una cabecera Retry-After.
| Plan | Peticiones / minuto | Ráfaga | Acceso |
|---|---|---|---|
| Starter | 60 | 10 | Endpoints de solo lectura |
| Growth | 600 | 100 | Lectura y escritura |
| Enterprise | desde 3.000 | A medida | Lectura y escritura, límites a medida |
Cabeceras de respuesta
-
X-RateLimit-Limit - Peticiones permitidas en la ventana actual
-
X-RateLimit-Remaining - Peticiones restantes en la ventana actual
-
X-RateLimit-Reset - Hora Unix en la que se reinicia la ventana
-
Retry-After - Segundos de espera antes de reintentar (solo con 429)
Los listados devuelven hasta limit elementos (25 por defecto, 100 como máximo) y un next_cursor. Pásalo como cursor para obtener la página siguiente; cuando has_more sea false, habrás llegado al final. Los cursores se mantienen estables mientras paginas, aunque lleguen incidencias nuevas.
# First pagecurl "https://api.civicflow.site/v2/incidents?limit=50" \ -H "Authorization: Bearer $CIVICFLOW_KEY"# Next page: pass next_cursor from the previous responsecurl "https://api.civicflow.site/v2/incidents?limit=50&cursor=c_8f3a91d2" \ -H "Authorization: Bearer $CIVICFLOW_KEY" CivicFlow usa los códigos de estado HTTP habituales. Los errores incluyen siempre un code legible por máquinas, un message legible por personas y un request_id que puedes indicar al contactar con soporte.
| Estado | Código | Significado |
|---|---|---|
| 400 | invalid_request | La petición está mal formada, p. ej. JSON no válido o un parámetro desconocido. |
| 401 | unauthenticated | Falta la clave de API, está revocada o no es válida. |
| 403 | insufficient_scope | La clave es válida, pero no tiene permiso para esta acción. |
| 404 | not_found | El recurso no existe en este espacio de trabajo. |
| 409 | conflict | La petición entra en conflicto con el estado actual, p. ej. resolver una incidencia ya resuelta. |
| 422 | validation_failed | La validación ha fallado; consulta los errores por campo en details. |
| 429 | rate_limited | Se ha superado el límite de uso; reintenta tras el intervalo de Retry-After. |
| 500 | internal_error | Algo ha fallado por nuestra parte. Puedes reintentar con espera progresiva. |
{ "error": { "code": "validation_failed", "message": "location is required for category lighting", "details": [{ "field": "location", "issue": "missing" }], "request_id": "req_7c41e09b2a" }} La versión mayor forma parte de la URL (/v2). Dentro de una versión solo hacemos cambios aditivos: endpoints nuevos, parámetros opcionales, campos y tipos de evento nuevos. Diseña clientes que ignoren los campos desconocidos.
- Los cambios incompatibles solo llegan en una nueva versión mayor.
- Los endpoints obsoletos siguen funcionando al menos 12 meses y devuelven las cabeceras
DeprecationySunset. - Avisamos a los administradores por correo y en el espacio, y las llamadas obsoletas aparecen en el informe de uso de la API.
- La API v1 está obsoleta y se retirará el 31 de marzo de 2027.
Todos los recursos siguen los mismos patrones. El listado de incidencias se documenta por completo más abajo; el resto está en openapi.yaml.
Incidencias
- GET
/v2/incidentsListar incidencias, filtradas y ordenadas Documentado abajo - POST
/v2/incidentsCrear una incidencia en nombre de un vecino o sistema - GET
/v2/incidents/{id}Obtener una incidencia con todo su historial - PATCH
/v2/incidents/{id}Actualizar estado, prioridad, categoría o ubicación - POST
/v2/incidents/{id}/assignAsignar una incidencia a un equipo o persona - POST
/v2/incidents/{id}/resolveResolver una incidencia con una nota y fotos de prueba
Comentarios
- GET
/v2/incidents/{id}/commentsListar notas internas y respuestas a vecinos - POST
/v2/incidents/{id}/commentsAñadir una nota interna o responder al vecino - DELETE
/v2/comments/{id}Eliminar una nota interna
Adjuntos
- GET
/v2/incidents/{id}/attachmentsListar fotos y archivos de una incidencia - POST
/v2/incidents/{id}/attachmentsSubir una foto o archivo (hasta 25 MB) - DELETE
/v2/attachments/{id}Eliminar un adjunto
Equipos
- GET
/v2/teamsListar equipos y brigadas de campo - GET
/v2/teams/{id}Obtener un equipo con sus miembros y zona de servicio - PATCH
/v2/teams/{id}Actualizar miembros, turnos o zona de servicio de un equipo
Categorías
- GET
/v2/categoriesListar categorías con sus políticas de SLA - POST
/v2/categoriesCrear una categoría - PATCH
/v2/categories/{key}Actualizar una categoría o su política de SLA
Webhooks
- GET
/v2/webhooksListar endpoints de webhooks - POST
/v2/webhooksRegistrar un endpoint de webhook para los eventos elegidos - POST
/v2/webhooks/{id}/testEnviar un evento de prueba firmado a un endpoint - DELETE
/v2/webhooks/{id}Eliminar un endpoint de webhook
Vecinos
- GET
/v2/residents/{id}Obtener el perfil de un vecino - GET
/v2/residents/{id}/exportExportar todo lo que se guarda de un vecino (solicitud de acceso) - POST
/v2/residents/{id}/eraseAnonimizar a un vecino (solicitud de supresión)
GET /v2/incidents
Devuelve las incidencias del espacio de trabajo, de la más reciente a la más antigua. Requiere el permiso incidents:read. Puedes combinar filtros libremente: se aplican con Y lógico.
Parámetros de consulta
| Parámetro | Tipo | Descripción |
|---|---|---|
status | string | Filtra por estado: open, urgent, assigned o resolved. Separa varios con comas. |
category | string | Clave de categoría, p. ej. lighting. |
district | string | Clave de distrito, p. ej. north. |
team | string | Solo incidencias asignadas a este id de equipo. |
updated_since | timestamp | Solo incidencias actualizadas en esta marca de tiempo ISO 8601 o después. |
sort | string | created_at, -created_at (por defecto), priority o sla_due_at. |
limit | integer | Elementos por página, de 1 a 100. Por defecto, 25. |
cursor | string | El next_cursor de una página anterior. |
Ejemplo de petición
curl "https://api.civicflow.site/v2/incidents?status=open,urgent&district=north&limit=2" \ -H "Authorization: Bearer $CIVICFLOW_KEY"Ejemplo de respuesta
{ "data": [ { "id": "CF-4821", "title": "Streetlight outage", "category": "lighting", "status": "urgent", "priority": "high", "district": "north", "location": { "address": "Linden St & 4th Ave", "lat": 52.3791, "lng": 4.8994 }, "assigned_team": "elec-4", "created_at": "2026-10-08T09:12:44Z", "sla_due_at": "2026-10-08T21:12:00Z" }, { "id": "CF-4833", "title": "Hydrant leak", "category": "water", "status": "urgent", "priority": "high", "district": "north", "location": { "address": "Birch Ln", "lat": 52.3804, "lng": 4.9051 }, "assigned_team": null, "created_at": "2026-10-08T08:47:10Z", "sla_due_at": "2026-10-08T12:47:10Z" } ], "has_more": true, "next_cursor": "c_8f3a91d2"} Registra un endpoint HTTPS y elige los eventos que recibe. Los envíos son peticiones POST con JSON; responde con cualquier 2xx en menos de 10 segundos. Los envíos fallidos se reintentan con espera exponencial durante un máximo de 24 horas, y cada intento queda en el registro de envíos.
| Evento | Se envía cuando |
|---|---|
incident.created | Un vecino, un empleado o una integración comunica una incidencia nueva. |
incident.assigned | Una incidencia se asigna o reasigna a un equipo o persona. |
incident.status_changed | Cambia el estado de una incidencia. Incluye previous_status. |
incident.resolved | Se resuelve una incidencia, con nota de resolución y fotos de prueba. |
comment.created | Se añade una nota interna o una respuesta del vecino. |
Verifica las firmas
Cada envío incluye la cabecera CivicFlow-Signature con una marca de tiempo y un HMAC-SHA256 de timestamp.body, firmado con el secreto del endpoint. Verifícala con el cuerpo original de la petición y rechaza los envíos de hace más de cinco minutos.
import crypto from "node:crypto";// header: "t=1791460023,v1=5f2b…"; rawBody: the unparsed request bodyexport function verifySignature(header, rawBody, secret) { const { t, v1 } = Object.fromEntries(header.split(",").map((part) => part.split("="))); const expected = crypto .createHmac("sha256", secret) .update(`${t}.${rawBody}`) .digest("hex"); const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300; return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));} Clientes oficiales y tipados que gestionan por ti la autenticación, la paginación y los reintentos.
-
Node.js
3.4.0Tipos de TypeScript para cada recurso. Node 18 o posterior.
npm install @civicflow/node -
Python
1.2.1Clientes síncronos y asíncronos con anotaciones de tipo. Python 3.9 o posterior.
pip install civicflow -
Go
PróximamenteUn módulo idiomático de Go está en beta privada con dos clientes.
-
1 de octubre de 2026
v2.8
Sincronización incremental de incidencias
Nuevo filtro
updated_sinceenGET /v2/incidentsy campoprevious_statusen los eventosincident.status_changed. -
9 de septiembre de 2026
v2.7
Adjuntos más grandes
Los adjuntos admiten ahora hasta 25 MB (antes, 10 MB). Las subidas de más de 5 MB usan sesiones reanudables.
-
12 de agosto de 2026
v2.6
API de vecinos y SDK de Python 1.0
Nuevos endpoints para exportar y anonimizar vecinos en solicitudes de acceso y supresión. El SDK de Python alcanza la versión 1.0.
¿Estás creando una integración?
Lee las guías de configuración y conceptos, consulta la disponibilidad de la API en directo o revisa cómo protegemos tus datos.