Referencia: asistentes e informes
El listado de personas de tu organización y el informe de recaudación, con el corte por canal ya calculado.
Última actualización: 23 de agosto de 2026
Asistentes
Las personas que han comprado, con su historial acumulado.
Informes
Recaudación de una sala, con comparativa y serie por día.
Asistentes
/attendeesLas personas que han comprado en tu organización, con sus datos de contacto.
Necesita el permiso customers:read.
| Parámetro | Valores |
|---|---|
email | Email exacto. Para buscar a una persona concreta |
updatedSince | Fecha ISO 8601, para sincronización incremental |
limit | 1–100, por defecto 25 |
cursor | El nextCursor de la página anterior |
{
"data": [
{
"id": "6a7400cc33dd44ee55ff6600",
"email": "ana@ejemplo.com",
"name": "Ana Ruiz",
"phone": "600123456",
"marketingConsent": true,
"orderCount": 4,
"totalSpent": { "amount": 14200, "currency": "EUR" },
"createdAt": "2025-11-03T21:14:02.000Z",
"updatedAt": "2026-08-23T18:02:11.000Z"
}
],
"hasMore": false,
"nextCursor": null
}
Son por organización, no por sala
Quien compra en dos salas de tu organización es una sola persona, con un historial y un total gastado que suman las dos. Trocearlo por sala daría una foto falsa, así que los asistentes viven en la organización.
Ésa es también la razón de que necesite su propio permiso, customers:read, en vez de heredarlo de orders:read: un integrador que solo consulta ventas de una sala no debería recibir de regalo el fichero de compradores completo.
Si tu clave está acotada a una sala, piénsatelo dos veces antes de darle este permiso.
marketingConsent
marketingConsent refleja si esa persona aceptó recibir comunicaciones comerciales. Filtra por él antes de meter a nadie en una lista de envíos. Que alguien te haya comprado una entrada no te autoriza a mandarle publicidad, y la responsabilidad de cumplirlo es de quien manda el email.
const suscribibles = asistentes.filter((a) => a.marketingConsent)
Sincronizar con tu CRM
updatedSince es lo que hace viable una sincronización periódica. La receta entera, con el patrón que no pierde registros, está en sincronizar ventas con tu CRM.
Lo que no está aquí
No se pueden crear, editar ni borrar asistentes por API. Se crean solos con cada venta. Si necesitas corregir un dato, se hace desde el panel.
Informe de ventas
/reports/salesRecaudación de una sala en un periodo, con comparativa y serie temporal.
Necesita el permiso reports:read.
| Parámetro | Obligatorio | Valores |
|---|---|---|
venueId | Sí | Id de sala |
preset | No | 30d (por defecto) · 90d · year · custom |
start | Con custom | Fecha AAAA-MM-DD |
end | Con custom | Fecha AAAA-MM-DD, inclusive |
preset | Periodo |
|---|---|
30d | Últimos 30 días. Es el valor por defecto |
90d | Últimos 90 días |
year | Año en curso, desde el 1 de enero |
custom | El rango que le des en start y end |
Si mandas start y end sin preset=custom, se ignoran en silencio y recibirás los últimos 30 días. Es el error más fácil de cometer con este endpoint y no da ningún aviso: comprueba siempre el period que viene en la respuesta.
Los días se cuentan en la zona horaria de la sala, y end es inclusive. Un rango inválido —fechas mal formadas, o start posterior a end— cae también a los últimos 30 días.
La recaudación se calcula por sala, porque cada una tiene su zona horaria. Un total agregado sobre husos distintos no significa nada: «las ventas del martes» no es lo mismo si una sala está en Madrid y otra en Canarias. Si quieres el total de la organización, pide cada sala y suma tú, sabiendo lo que estás sumando.
curl -G https://app.tickeep.com/api/v1/reports/sales \
-H "Authorization: Bearer $TICKEEP_API_KEY" \
--data-urlencode "venueId=$VENUE" \
--data-urlencode "preset=custom" \
--data-urlencode "start=2026-08-01" \
--data-urlencode "end=2026-08-31"
{
"venueId": "6a42356a296cb2dfe6ba1c7f",
"timezone": "Europe/Madrid",
"currency": "EUR",
"period": {
"start": "2026-08-01",
"end": "2026-08-31",
"label": "Periodo personalizado"
},
"summary": {
"orders": 412,
"tickets": 968,
"ticketRevenue": { "amount": 1642000, "currency": "EUR" },
"vat": { "amount": 344820, "currency": "EUR" },
"serviceFees": { "amount": 82400, "currency": "EUR" },
"total": { "amount": 1724400, "currency": "EUR" },
"averageOrder": { "amount": 4186, "currency": "EUR" },
"byChannel": {
"online": { "orders": 380, "tickets": 890, "total": { "amount": 1601000, "currency": "EUR" } },
"boxOffice": { "orders": 24, "tickets": 58, "total": { "amount": 98400, "currency": "EUR" } },
"api": { "orders": 8, "tickets": 20, "total": { "amount": 25000, "currency": "EUR" } }
}
},
"previousSummary": { "…": "el mismo bloque, para el periodo anterior" },
"timeline": [
{ "date": "2026-08-01", "…": "el mismo bloque, para ese día" }
]
}
Las tres partes
| Bloque | Qué es |
|---|---|
summary | El total del periodo pedido |
previousSummary | El mismo bloque para el periodo inmediatamente anterior, de la misma duración. Sirve para el «+12 % respecto al mes pasado» sin hacer dos llamadas |
timeline | Un resumen por día, para pintar una gráfica |
El corte por canal viene calculado
byChannel te da el reparto entre online (la web de venta de la sala), boxOffice (mostrador) y api (tu integración).
Viene ya calculado a propósito. Podríamos dar solo los totales y dejar que cada cliente dedujera lo online restando los otros dos — y funcionaría, hasta el día que apareciera un canal nuevo y todas esas restas empezaran a dar de menos sin que nadie se enterara.
El informe es el mismo que el del panel
Usa el mismo motor que pinta el informe de ventas del panel. Si tu cuadro de mando y la pantalla de la sala dieran cifras distintas, la sala dejaría de creerse las dos.
timezone y currency
Vienen en la respuesta para que sepas cómo interpretar los datos. Los días de timeline están calculados en la zona horaria de la sala, no en UTC: una venta a las 00:30 de Madrid cuenta en ese día, no en el anterior.
Lo que no está aquí
Ventas por evento, por tarifa o por zona no están expuestas todavía. Si las necesitas, se pueden reconstruir recorriendo /orders con updatedSince y agregando por lines[].eventId, o escríbenos y nos ayudas a priorizarlo.
Seguir por aquí
Llevar pedidos y asistentes a tu CRM, tu cuadro de mando o tu contabilidad, sin perder registros ni releerlo todo cada vez.
El flujo de venta en dos tiempos: reservar, cobrar y emitir. Con los cuatro endpoints que lo componen y qué hace cada uno.