Referencia: salas y catálogo
Salas, eventos, fechas y disponibilidad. Los endpoints de lectura con los que se construye una cartelera.
Última actualización: 23 de agosto de 2026
Todo lo de esta página necesita el permiso catalog:read, que también viene incluido en orders:write.
Ninguno de estos endpoints devuelve datos personales, lo cual los hace seguros para alimentar tu web pública desde tu backend.
Salas
El punto de entrada: de aquí salen los identificadores de sala.
Catálogo
Eventos, fechas concretas y qué se puede vender ahora mismo.
Salas
/venuesSalas a las que alcanza la clave. Sin paginación ni filtros.
Es el punto de entrada: sin él no sabes qué venueId usar en el resto de llamadas.
{
"data": [
{
"id": "6a42356a296cb2dfe6ba1c7f",
"name": "Sala Tempo",
"slug": "tempo",
"host": "entradas.salatempo.com",
"timezone": "Europe/Madrid"
}
]
}
Si la clave está acotada a unas salas concretas, aquí solo verás esas. Guarda el host y el timezone: el primero lo necesitas para las imágenes, el segundo para formatear horas.
Eventos
/eventsCatálogo de eventos, del más reciente al más antiguo.
| Parámetro | Valores |
|---|---|
venueId | Id de sala |
status | draft · published |
updatedSince | Fecha ISO 8601 |
limit | 1–100, por defecto 25 |
cursor | El nextCursor de la página anterior |
curl -G https://app.tickeep.com/api/v1/events \
-H "Authorization: Bearer $TICKEEP_API_KEY" \
--data-urlencode "venueId=$VENUE" \
--data-urlencode "status=published"
Sin status=published te llegan también los borradores, que son eventos que la sala todavía está preparando. Publicarlos por accidente en tu web es el fallo clásico de la primera integración.
/events/{id}Un evento concreto.
Responde 404 si no existe o si pertenece a una sala fuera del ámbito de tu clave.
Campos que conviene mirar
| Campo | Para qué |
|---|---|
type | single, multiPerformance o recurring. Decide cómo lo pintas |
nextPerformanceAt | Próxima fecha con venta abierta. null si ya pasaron todas |
performanceCount | Cuántas fechas tiene |
priceFrom | El «desde X €» del cartel, ya calculado |
ticketing.mode | internal, external o free |
ticketing.externalUrl | A dónde mandar al comprador si la venta es externa |
ticketing.maxPerOrder | Tope de entradas por pedido |
minimumAge | Texto ya resuelto ("18", "Todos los públicos"…) |
Si vale external, esa sala no vende ese evento a través de Tickeep: la venta ocurre en externalUrl. Un botón de compra que llame a POST /orders con ese evento fallará. Enlaza a externalUrl y ya está.
El objeto completo está en objetos y tipos.
Imágenes
Los eventos devuelven imageId y posterImageId, no una URL. La URL se compone con el host de la sala:
https://{venue.host}/api/public/media/{imageId}
function urlImagen(host: string, imageId: string, size?: 'thumbnail' | 'card' | 'hero') {
const base = `https://${host}/api/public/media/${imageId}`
return size ? `${base}?size=${size}` : base
}
size | Para qué |
|---|---|
thumbnail | Listados compactos |
card | Tarjetas de cartelera |
hero | Cabeceras a ancho completo |
Sin size obtienes el original.
Por qué un id y no una URL. Cada sala tiene su propio dominio. Devolver la URL completa obligaría a resolver el host de la sala en cada elemento de cada listado, y un listado de 100 eventos son 100 resoluciones para un dato que ya tienes desde /venues. Componerlo tú es una línea.
Fechas
Lo que el panel llama «sesión» y la API llama performance es la fecha concreta que se vende. Un evento puede tener una o cincuenta.
/performancesFechas, en orden cronológico ascendente.
| Parámetro | Valores |
|---|---|
eventId | Id de evento |
venueId | Id de sala |
from | Fecha ISO. Desde esa hora de inicio, inclusive |
to | Fecha ISO. Hasta esa hora de inicio, inclusive |
limit | 1–100, por defecto 25 |
cursor | El nextCursor de la página anterior |
# Lo que se puede ver este mes
curl -G https://app.tickeep.com/api/v1/performances \
-H "Authorization: Bearer $TICKEEP_API_KEY" \
--data-urlencode "venueId=$VENUE" \
--data-urlencode "from=2026-09-01T00:00:00Z" \
--data-urlencode "to=2026-09-30T23:59:59Z"
/performances/{id}Una fecha concreta.
Campos que conviene mirar
| Campo | Nota |
|---|---|
status | active o cancelled. Filtra las canceladas antes de pintar |
startsAt | Hora de inicio, UTC |
doorsAt | Apertura de puertas. null si la sala no la define |
capacity | Aforo. null significa sin tope más allá del stock de cada tarifa |
sold | Entradas ya vendidas |
available | Plazas libres. null cuando capacity es null |
Cuando la fecha no tiene aforo definido, available es null porque «quedan infinitas» no es un número. Si tu código hace available > 0 sin comprobar el null antes, ocultarás una fecha que sí se vende.
Disponibilidad
/performances/{id}/availabilityQué se puede vender ahora mismo en esa fecha, con precio y unidades libres.
Es la llamada previa a una venta.
{
"performanceId": "6a72089e1f4c8b0d3e5a9c11",
"capacity": 300,
"sold": 128,
"available": 172,
"ticketTypes": [
{
"id": "6a7209f2c3d4e5f60718293a",
"eventId": "6a7207c4b8e1a2f5c9d04e33",
"performanceId": "6a72089e1f4c8b0d3e5a9c11",
"scope": "performance",
"name": "Entrada general",
"description": null,
"price": { "amount": 1800, "currency": "EUR" },
"status": "active",
"channel": "online",
"zone": { "key": "pista", "name": "Pista" },
"maxPerOrder": 6,
"availableFrom": null,
"availableUntil": null,
"includes": [{ "key": "copa", "name": "Consumición", "quantity": 1 }]
}
],
"availability": [
{
"ticketTypeId": "6a7209f2c3d4e5f60718293a",
"name": "Entrada general",
"price": { "amount": 1800, "currency": "EUR" },
"available": 172,
"onSale": true
}
]
}
Dos listas, dos usos: ticketTypes trae el objeto completo de cada tarifa —zona, descripción, límites, qué incluye— y availability trae el dato operativo, que es cuántas quedan y si está a la venta ahora mismo. Casi siempre querrás cruzarlas por ticketTypeId.
onSale
Es true cuando la tarifa está dentro de su ventana de venta y quedan unidades. Si es false, no la ofrezcas: la venta fallará con 422.
Solo tarifas de canal online
Este endpoint devuelve únicamente las tarifas vendibles por internet. Las marcadas «solo taquilla» son para el mostrador de la sala y no aparecen aquí — no debe poder comprarlas nadie desde tu web.
El aforo topa por encima del stock
available de cada tarifa ya viene con el aforo de la fecha aplicado. Si quedan 3 plazas de aforo pero la tarifa tiene 50 unidades de stock, verás available: 3. No tienes que calcularlo tú.
La disponibilidad es una foto del momento y puede caducar entre que la lees y vendes. La verdad la fija POST /orders, que es atómico: por eso una venta puede responder sold_out aunque aquí saliera disponible. Úsala para pintar tu selector y topar las cantidades, no como una garantía.
Abonos
Un abono es una tarifa con scope: "pass". Da acceso a varias fechas, no a una:
- Su
performanceIdesnully las fechas que cubre están enperformanceIds. - No aparece en la disponibilidad de una fecha concreta, precisamente porque no pertenece a una sola.
Los verás en el catálogo. Si tu integración solo vende entradas sueltas, fíltralos por scope.
Lo que no está aquí
Estos endpoints son solo de lectura. No hay POST /events, ni forma de editar tarifas, cambiar precios o publicar un evento por API. Se hace en el panel, y es una decisión, no una carencia — el porqué está en la introducción.
Seguir por aquí
Pintar los eventos de tu sala en tu propia web, con tu diseño, a partir del catálogo de Tickeep.
Todos los objetos que devuelve la API, campo a campo, con sus tipos y sus valores posibles.
El flujo de venta en dos tiempos: reservar, cobrar y emitir. Con los cuatro endpoints que lo componen y qué hace cada uno.