Documentación
Conecta tu sistema con Ciudad Viva para publicar tus eventos automáticamente. Tu infraestructura no cambia — somos nosotros quienes consultamos tu API.
Visión general
La integración API de Ciudad Viva es un sistema de extracción automática (pull): Ciudad Viva consulta periódicamente tu API, obtiene los eventos y los publica en la plataforma. Tu sistema no necesita saber que Ciudad Viva existe ni enviar nada por iniciativa propia.
Sin modificar tu sistema
Solo necesitas una URL de API que devuelva tus eventos en JSON.
Sincronización automática
Sincronizamos diariamente a la 1 AM (hora de Chile). También puedes activar sincronizaciones manuales.
Credenciales seguras
Las credenciales de tu API se almacenan cifradas y nunca se exponen en la plataforma.
Cómo funciona
El proceso tiene dos actores: tu sistema (que ya existe y no cambia) y Ciudad Viva (que lo consulta).
- 1
Configuras la integración
Desde el panel de tu organización en Ciudad Viva, ingresas la URL de tu API, el método HTTP, las credenciales de autenticación (si corresponde) y el mapeo de campos.
- 2
Pruebas la conexión
Haces clic en "Probar conexión". Ciudad Viva consulta tu API en ese momento y muestra cuántos eventos encontró y una vista previa de los primeros resultados.
- 3
Activas la integración
Una vez que la prueba es exitosa, activas la integración. A partir de ese momento, Ciudad Viva sincroniza tus eventos automáticamente.
- 4
Sincronización diaria
Cada día a la 1 AM (hora de Chile), Ciudad Viva consulta tu API, crea los eventos nuevos, actualiza los que cambiaron y desactiva los que ya no están.
Requisitos de tu API
Tu API puede tener cualquier estructura, siempre que cumpla estos requisitos básicos:
- ✓Responde con JSON (Content-Type: application/json).
- ✓Devuelve un array de eventos, ya sea en la raíz de la respuesta o dentro de algún campo.
- ✓Cada evento tiene al menos un título y una fecha de inicio.
- ✓La URL es accesible desde internet (no puede ser localhost ni una red interna privada).
- ✓Acepta GET o POST como método HTTP.
Configuración paso a paso
Accede al panel de tu organización en Ciudad Viva y sigue estos pasos:
- 1
Ve a Mi organización → Integraciones → Nueva integración.
- 2
Ingresa un nombre descriptivo (ej: "API de eventos municipales").
- 3
Ingresa la URL de tu API.
- 4
Selecciona el método HTTP (GET o POST).
- 5
Si tu API devuelve los eventos dentro de un campo (ej:
data.results), ingresa esa ruta en Ruta al array de eventos. Si el array está en la raíz, deja este campo vacío. - 6
Configura la autenticación si tu API lo requiere (ver sección Autenticación).
- 7
Configura el mapeo de campos indicando qué campo de tu API corresponde a cada campo de Ciudad Viva (ver sección Mapeo de campos).
- 8
Haz clic en Probar conexión para verificar que todo funciona.
- 9
Si la prueba es exitosa, haz clic en Activar.
Autenticación
Ciudad Viva soporta cuatro métodos de autenticación. Elige el que usa tu API. Las credenciales se almacenan cifradas con AES-256-GCM y nunca se exponen en logs ni respuestas.
Sin autenticación
Para APIs públicas que no requieren credenciales.
{
"auth": {
"type": "none"
}
}API Key
Ciudad Viva enviará tu clave en el header que definas. El nombre del header lo pones tú (ej: X-API-Key, Authorization).
{
"auth": {
"type": "api_key",
"apiKeyHeader": "X-API-Key",
"apiKey": "tu-clave-secreta"
}
}Bearer Token
Ciudad Viva enviará el header Authorization: Bearer <token>.
{
"auth": {
"type": "bearer",
"bearerToken": "eyJhbGciOiJIUzI1NiJ9..."
}
}Basic Auth
Ciudad Viva codificará en Base64 el par usuario:contraseña y lo enviará en el header Authorization: Basic <encoded>.
{
"auth": {
"type": "basic",
"basicUsername": "mi-usuario",
"basicPassword": "mi-contraseña"
}
}Formato de respuesta
Tu API puede devolver los eventos en cualquiera de estas estructuras. El campo Ruta al array le indica a Ciudad Viva dónde encontrar el array de eventos.
Array en la raíz (Ruta al array: vacío)
[
{
"title": "Festival de Verano",
"date": "2026-02-15",
"location": "Parque O'Higgins"
},
{
"title": "Obra de Teatro",
"date": "2026-02-20",
"location": "Teatro Municipal"
}
]Array dentro de un campo (Ruta al array: events)
{
"status": "ok",
"total": 2,
"events": [
{
"title": "Festival de Verano",
"date": "2026-02-15"
}
]
}Array anidado en varios niveles (Ruta al array: data.results)
{
"meta": { "page": 1 },
"data": {
"results": [
{
"content": {
"title": "Festival de Verano",
"start": "2026-02-15T20:00:00"
}
}
]
}
}Mapeo de campos
El mapeo le dice a Ciudad Viva qué campo de tu API corresponde a cada campo de la plataforma. Puedes usar notación de punto para acceder a campos anidados (ej: content.title, meta.date.start).
| Campo Ciudad Viva | Estado | Descripción | Ejemplo de valor |
|---|---|---|---|
| title | obligatorio | Nombre del evento | Festival de Verano |
| startDate | obligatorio | Fecha y hora de inicio (ISO 8601 o fecha simple) | 2026-02-15T20:00:00 |
| endDate | opcional | Fecha y hora de término | 2026-02-15T23:00:00 |
| description | opcional | Descripción del evento | Gran festival de música... |
| imageUrl | opcional | URL de la imagen principal | https://ejemplo.cl/imagen.jpg |
| venue | opcional | Nombre del recinto o lugar | Parque O'Higgins |
| address | opcional | Dirección del evento | Av. Tupper 1955, Santiago |
| district | opcional | Comuna del evento | Santiago |
| price | opcional | Precio o descripción de entrada | Entrada liberada |
| eventUrl | opcional | URL del evento en tu sitio | https://ejemplo.cl/eventos/festival |
| externalId | opcional | ID único en tu sistema. Recomendado para deduplicación precisa. | EVT-2026-001 |
| category | opcional | Categoría del evento. Si no coincide, se usa la categoría por defecto. | Música |
Ejemplo de configuración de mapeo
Si tu API devuelve content.name como título y meta.startAt como fecha de inicio, el mapeo sería:
{
"fieldMap": {
"title": "content.name",
"startDate": "meta.startAt",
"endDate": "meta.endAt",
"description": "content.body",
"imageUrl": "content.coverImage",
"venue": "location.name",
"address": "location.address",
"district": "location.commune",
"price": "ticket.description",
"eventUrl": "permalink",
"externalId": "id"
}
}Deduplicación
Si mapeas el campo externalId, Ciudad Viva lo usará para identificar eventos de forma única y evitar duplicados. Si no lo mapeas, usará un hash del título y la fecha de inicio como alternativa. Se recomienda siempre mapear un ID externo para mayor precisión.
Prueba de conexión
Antes de activar la integración, puedes probar la conexión desde el formulario de configuración. Ciudad Viva consultará tu API en ese momento y mostrará:
- →El código HTTP de respuesta de tu API.
- →Cuántos eventos encontró en la respuesta.
- →Una vista previa de los primeros 3 eventos con el mapeo aplicado.
- →El mensaje de error si algo falla (URL incorrecta, autenticación rechazada, campo no encontrado, etc.).
Solo puedes activar la integración si la prueba de conexión fue exitosa. Si modificas la configuración después de activarla, la integración vuelve a estado borrador y deberás probarla nuevamente.
Webhook (opcional)
Además de la sincronización diaria automática, puedes configurar un webhook para que Ciudad Viva sincronice tus eventos en el momento en que tú lo necesites. Cuando creas un nuevo evento en tu sistema, tu sistema puede notificar a Ciudad Viva inmediatamente y el evento aparecerá en la plataforma sin esperar hasta el día siguiente.
Activar el webhook
En el panel de tu integración, activa la opción Webhook. Ciudad Viva generará una URL única y una API Key para tu integración. La URL tiene este formato:
https://server.ciudad-viva.cl/api/webhooks/{tu-webhook-key}Llamar al webhook desde tu sistema
Haz un POST a la URL del webhook cuando quieras sincronizar. El cuerpo de la solicitud puede estar vacío — no necesitas enviar datos, ya que Ciudad Viva consultará tu API de todas formas.
curl -X POST \
"https://server.ciudad-viva.cl/api/webhooks/{tu-webhook-key}"
# Respuesta exitosa (HTTP 202):
{ "queued": true }Límite de llamadas
Para proteger tu sistema y el nuestro, el webhook tiene un límite de 1 llamada cada 10 segundos (máximo 6 por minuto). Las llamadas que superen este límite recibirán una respuesta HTTP 429. Si publicas muchos eventos en ráfagas cortas, no te preocupes: la sincronización diaria los captará de todas formas.
# Si superas el límite:
HTTP 429 Too Many Requests
{ "error": "rate_limit_exceeded", "retryAfterMs": 8500 }Seguridad del webhook
La URL del webhook contiene un token de seguridad único. Trátala como una contraseña: no la compartas públicamente ni la incluyas en repositorios de código. Puedes regenerar la key en cualquier momento desde el panel; la key anterior quedará inválida de inmediato.
Sincronización
Cada sincronización sigue este proceso:
Consulta tu API
Ciudad Viva hace la solicitud HTTP con la configuración que definiste (URL, método, autenticación, headers).
Extrae los eventos
Navega a la ruta configurada dentro de la respuesta y aplica el mapeo de campos a cada evento.
Eventos nuevos
Los que no existían en Ciudad Viva se crean. Si tu organización está verificada, quedan aprobados de inmediato; si no, quedan en revisión.
Eventos existentes
Los que ya existen (identificados por externalId o hash) se actualizan si cambiaron.
Eventos desaparecidos
Los que estaban en Ciudad Viva pero ya no están en tu API se desactivan automáticamente.
Registro de ejecución
Ciudad Viva guarda un log con los resultados: cuántos eventos encontró, creó, actualizó, dejó sin cambios, desactivó y cuántos fallaron.
Notificaciones de error
Si tu API falla 3 sincronizaciones consecutivas, Ciudad Viva te enviará un email de alerta para que puedas revisarlo. La integración seguirá intentando en los siguientes ciclos.
Próximamente
Publicación directa de eventos
Estamos desarrollando un endpoint que te permitirá crear eventos en Ciudad Viva directamente desde tu sistema, sin necesidad de tener una API propia. Solo envías un POST con los datos del evento y aparece en la plataforma. Es ideal para sistemas internos como ERP municipales, sistemas de ticketing o agendas culturales que quieran publicar en Ciudad Viva sin exposición pública de su API.
La documentación de este endpoint se publicará aquí cuando esté disponible.
¿Necesitas ayuda?
Si tienes dudas sobre la integración o necesitas soporte, contáctanos.
Contactar al equipo