Desarrolladores

API de eventos para vuestro sitio web

Integrad los eventos públicos de vuestro ensemble en cualquier sitio web — con una simple petición HTTP, sin cuenta y sin clave de API.

Lo esencial

  • Acceso público, no se requiere autenticación.
  • CORS está habilitado, el endpoint funciona directamente desde el navegador.
  • Las respuestas se cachean 5 minutos, límite de 60 peticiones por minuto.
  • Solo se devuelven los datos que habéis habilitado para visualización pública en la configuración del sitio web.
  • Para uso público es obligatorio un aviso 'Powered by Chorilo' con enlace a nuestro sitio web.

Powered by Chorilo — Atribución en vuestro sitio

Si usáis la API en una página pública, añadid por favor un aviso visible 'Powered by Chorilo' con enlace a https://www.chorilo.com. Una línea discreta en el pie de página es más que suficiente.

Es un intercambio justo: integráis vuestros eventos automáticamente en otros sistemas y no tenéis que mantenerlos por duplicado. Cada petición a la API también genera carga en nuestros servidores y costes de infraestructura — cuanto más tráfico tenga vuestra página, más recursos consume por nuestro lado. A cambio, la pequeña mención da a Chorilo algo de visibilidad que nos ayuda a llegar a nuevos coros.

HTML
<a href="https://www.chorilo.com" target="_blank" rel="noopener">
  Powered by Chorilo
</a>

Endpoint

Un único endpoint GET devuelve los próximos eventos de vuestro ensemble. Sustituid por el slug de URL de vuestro sitio web público de Chorilo.

¿Dónde encuentro mi slug?

Abrid la configuración de vuestro sitio web público en el backend de Chorilo. El slug es la parte única de la URL, por ejemplo 'mi-coro' en https://chorilo.com/w/mi-coro.

GET
https://backend.chorilo.com/api/public-websites/{slug}/embed-events

Controlar la visibilidad

La API respeta la configuración de visibilidad de vuestro sitio web público. Todo lo oculto en el sitio web también está bloqueado por la API — incluso cuando se solicita explícitamente.

Interruptor principal: Si show_events está deshabilitado, la API devuelve una lista vacía.

Tipos de eventos: Solo se devuelven los tipos habilitados. Una petición para tipos deshabilitados (por ejemplo types[]=concert con el interruptor de conciertos apagado) se filtra silenciosamente.

AjusteAfecta al tipo
show_eventsInterruptor principal (deshabilita todo)
show_rehearsalsrehearsal
show_concertsconcert
show_other_eventsevent
show_event_descriptionsControla el campo description en la respuesta

Parámetros de consulta

Todos los parámetros son opcionales. Sin parámetros, el endpoint devuelve los próximos eventos según la configuración predeterminada de vuestro sitio web.

NombreTipoPredeterminadoDescripción
limitinteger5Número de eventos devueltos. Mínimo 1, máximo 100.
fromISO 8601ahoraInicio del rango de fechas. Los eventos pasados no se devuelven por defecto.
toISO 8601Fin del rango de fechas.
types[]arraytodos los permitidosUno o más de: rehearsal, concert, event. Los tipos deshabilitados se filtran silenciosamente.
langstring (2)Código de idioma de dos letras (de, en, fr, nl, es, sv, it, sl). Actualmente se devuelve como eco en el meta de la respuesta.

Límite de peticiones y caché

El endpoint está limitado a 60 peticiones por minuto por dirección IP. Si se supera el límite, el servidor responde con HTTP 429.

Las respuestas se cachean en el servidor durante 5 minutos (por combinación de parámetros). Los nuevos eventos pueden aparecer con un pequeño retraso.

Límite

60 / min

por dirección IP

Caché del servidor

5 min

por combinación de parámetros

Formato de respuesta

La respuesta es un objeto JSON. Cada evento contiene solo campos públicos — descripciones internas, datos de participantes u otra información sensible nunca se devuelven.

  • events[] — Lista de eventos con id, title, type, location, start_time, end_time, has_ticket_sale, opcionalmente ticket_sale_url (cuando la venta de entradas está activa) y opcionalmente description.
  • ensemble_name — Nombre visible de vuestro ensemble.
  • theme_color — Código de color hexadecimal de la configuración del sitio web.
  • language — Código de idioma de vuestro sitio web.

El campo description contiene exclusivamente la descripción pública. La descripción interna de un evento nunca forma parte de la respuesta.

JSON
{
  "events": [
    {
      "id": 42,
      "title": "Sommerkonzert",
      "type": "concert",
      "location": "Stadthalle Musterstadt",
      "start_time": "2026-06-14T19:30:00+02:00",
      "end_time": "2026-06-14T21:30:00+02:00",
      "description": "Concierto anual de verano en el jardín de la casa de la comunidad.",
      "has_ticket_sale": true,
      "ticket_sale_url": "https://www.chorilo.com/shop/tickets/42"
    }
  ],
  "ensemble_name": "Musterchor",
  "theme_color": "#6366f1",
  "language": "de"
}

Ejemplos

Cómo llamar a la API desde diferentes lenguajes. El ejemplo carga hasta 10 próximos conciertos y otros eventos.

curl "https://backend.chorilo.com/api/public-websites/mein-chor/embed-events?limit=10&types[]=concert&types[]=event"

Códigos de estado

CódigoSignificado
200Éxito, eventos en el array events.
404No se encontró ningún sitio web con este slug.
422Parámetros de consulta inválidos (por ejemplo tipo desconocido o to antes de from).
429Límite de peticiones superado, inténtalo de nuevo en un minuto.

All public endpoints

These are the read-only public endpoints currently exposed. No authentication required. JSON responses only.

MethodPathDescriptionLimit
GET/api/tickets/eventsList public concert events90/min
GET/api/tickets/events/{eventId}Single event detail90/min
GET/api/public-websites/{slug}Public ensemble website by slug90/min
GET/api/public-websites/{slug}/embed-eventsEmbeddable concert calendar60/min
GET/api/choir-associations/publicPublic association directory90/min

Rate-limit response headers

Every /api/* response carries rate-limit headers. They are exposed via Access-Control-Expose-Headers for cross-origin agents.

  • X-RateLimit-Limit — per-window quota
  • X-RateLimit-Remaining — remaining requests
  • Retry-After — seconds to wait (HTTP 429 only)

JSON error format (RFC 9457)

All /api/* errors return application/problem+json regardless of Accept header.

{
  "type":     "https://www.chorilo.com/api/errors/not-found",
  "title":    "Resource not found",
  "status":   404,
  "detail":   "...",
  "instance": "/api/tickets/events/99999999"
}

Validation errors (422) include an errors object mapping fields to messages.

¿Preguntas?

Para preguntas técnicas sobre la API, contactad con: support@chorilo.com