Resumen
Una cita (en la API, booking) ocupa un hueco en el calendario del equipo. Su kind indica de dónde viene:
service_booking: reservada para un servicio reservable, por la IA, un cliente o alguien del equipo.serviceindica el servicio.calendar_event: un evento del calendario conectado del equipo.external_import: sincronizada desde un sistema de citas externo, o leída del correo electrónico que envía un portal externo.
status es scheduled, rescheduled, cancelled, postponed, attended, no_show o team_no_show. Solo las personas registran la asistencia. source indica quién la reservó: ai, customer u operator. meeting_type es online, in_person o phone. Los pagos no se exportan.
Una reprogramación aparece de una de dos formas. Se actualiza la misma cita cuando alguien del equipo la mueve en Totem, cuando la IA mueve una cita de un sistema de citas externo como Koibox, cuando ese sistema informa de un cambio o cuando lo hace el correo de un portal de citas: starts_at y ends_at indican la nueva hora, y la hora anterior no se exporta. Su status pasa a rescheduled, aunque un cambio que informa un sistema de citas externo puede dejar el estado como estaba. Cuando la IA reprograma cualquier otra cita, crea una nueva: la antigua queda en cancelled, con rescheduled_to apuntando a la nueva, y la nueva apunta a la antigua con rescheduled_from. Durante unos segundos tras este tipo de reprogramación, la cita antigua puede seguir indicando scheduled. Un cambio hecho directamente en Google Calendar u Outlook puede no llegar a la cita de Totem. Una cita reprogramada antes de que Totem empezara a registrar estos enlaces puede no tener ninguno de los dos, como explica Cobertura de los datos.
Un servicio reservable es algo que los clientes pueden reservar con el equipo, como una primera consulta. GET /v1/booking_services devuelve todos los servicios del equipo, cada uno con su meeting_type, en una sola respuesta que no admite limit ni cursor. Los servicios no están en el feed de cambios: lee la lista cuando empieces a sincronizar un equipo, cuando una cita indique un servicio que no conoces y al menos una vez al día. Un servicio borrado sale de la lista, pero sus citas siguen indicando su identificador: no vuelvas a leer la lista por un identificador que no resolvió la última vez y, si muestras nombres de servicio en citas anteriores, conserva el de una lectura anterior. Los servicios desactivados siguen en la lista, sin nada que indique que lo están.
Usa GET /v1/bookings y GET /v1/bookings/{id} para consultar citas; GET /v1/bookings?lead= lista las citas de un lead. Para mantener una copia, sigue el feed de cambios: lo explica Sincroniza una copia.
GET /
Devuelve una página de citas del equipo: citas para un servicio reservable, eventos del calendario conectado y citas importadas de otros sistemas, cada una con su estado y su horario. Envía lead para obtener las citas de un lead.
Parámetros de consulta
limitinteger Rango 1–100 Por defecto25Elementos por página, de 1 a 100. Por defecto, 25.
cursorstring 1–512 caracteresEl
next_cursorde la página anterior. Omítelo en la primera página.leadstring Prefijo del idlead_…Solo las citas vinculadas a este lead: el
leadde cada elemento es este identificador. Un lead de otro equipo, o que no existe, no coincide con nada.
Cabeceras
Totem-Teamstring Condicional Prefijo del idteam_…El equipo que se lee, como identificador
team_…. Omítelo si la clave lee un solo equipo; es obligatorio si lee varios (400 team_required). Si lo envías, debe indicar un equipo que la clave lee: un identificador mal formado recibe400 invalid_request, y un equipo fuera de la clave,404 team_not_accessible, igual que una petición sin la cabecera cuando la clave ya no lee ningún equipo.
Respuesta
Devuelve una lista de objetos Booking.
objectstringSiempre
list.dataArray<Booking>Los elementos de esta página.
has_morebooleantruesi hay otra página: pídela connext_cursor, aunque esta traiga menos elementos quelimit.next_cursorstring Puede ser nullCursor opaco de la página siguiente, o null en la última. No lo interpretes.
Errores
- 400
team_requiredFalta el equipo - 403
team_state_restrictedEquipo restringido - 403
sector_restrictedSector restringido - 404
team_not_accessibleEquipo no accesible - 409
capture_not_readyLos datos del equipo aún se están preparando - 429
quota_exceededCuota diaria superada
curl 'https://api.totemstudio.ai/v1/bookings?limit=25' \
-H "Authorization: Bearer $TOTEM_API_KEY" \
-H "Totem-Team: $TOTEM_TEAM_ID"{
"object": "list",
"data": [
{
"id": "bkg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3ttMKHRR9ADk3N7Cr3NSuY0",
"object": "booking",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"kind": "service_booking",
"service": "svc_h42kgwwJGPzsm2Zoy1A1RBv1KIrX5",
"status": "scheduled",
"starts_at": "2026-10-06T15:00:00.000Z",
"ends_at": "2026-10-06T15:30:00.000Z",
"meeting_type": "in_person",
"source": "ai",
"rescheduled_from": null,
"rescheduled_to": null,
"created_at": "2026-10-01T09:01:00.000Z",
"version": 1,
"updated_at": "2026-10-01T09:01:02.000Z"
}
],
"has_more": false,
"next_cursor": null
}GET /
Devuelve una cita por su identificador. Una cita que esta clave no puede leer, o que se eliminó, responde 404 resource_missing.
Parámetros de ruta
idstring Obligatorio Prefijo del idbkg_…El identificador público de la cita.
Respuesta
Devuelve un objeto Booking.
idstring Prefijo del idbkg_…Identificador público del registro.
objectstringSiempre
booking.livemodebooleantrueen datos reales;falseen los datos de ejemplo.teamstring Prefijo del idteam_…El equipo al que pertenece este registro.
leadstring Puede ser null Prefijo del idlead_…El lead al que pertenece la cita, o null si la cita no tiene lead o el lead ya no existe. El nombre y los datos de contacto solo aparecen en el lead.
kindstringservice_booking(una cita de un servicio reservable, creada por la IA, un cliente o una persona),calendar_event(un evento del calendario conectado) oexternal_import(sincronizada desde un sistema de citas externo o leída de un correo electrónico de un portal). Una cita de un origen que esta versión no conoce aparece comocalendar_event.Valores posiblesservice_bookingcalendar_eventexternal_import
servicestring Puede ser null Prefijo del idsvc_…El servicio de la cita (ver
/booking_services) en unaservice_booking; null en otro caso.statusstring Puede ser nullscheduled,rescheduled,cancelled,postponed,attended,no_showoteam_no_show(la asistencia solo la registran personas); null si es un valor que esta versión no conoce.rescheduledsignifica que la cita se movió sin cambiar de registro y sus horas son las nuevas; una cita que la IA sustituyó por otra queda encancelled, conrescheduled_to.Valores posiblesscheduledrescheduledcancelledpostponedattendedno_showteam_no_show
starts_atstring Puede ser null Formatodate-timeCuándo empieza la cita (UTC).
ends_atstring Puede ser null Formatodate-timeCuándo termina la cita (UTC).
meeting_typestring Puede ser nullonline,in_personophone; null si no está guardado.Valores posiblesonlinein_personphone
sourcestring Puede ser nullQuién creó la cita:
ai,customeruoperator; null si no está registrado.Valores posiblesaicustomeroperator
rescheduled_fromstring Puede ser null Prefijo del idbkg_…La cita a la que esta sustituyó al reprogramar, o null. Durante unos segundos la cita sustituida puede seguir en
scheduled; las citas reprogramadas antes de que Totem empezara a registrar este enlace pueden no tenerlo.rescheduled_tostring Puede ser null Prefijo del idbkg_…La cita que sustituyó a esta al reprogramar, o null. Cuando está indicada, esta cita queda en
cancelled.created_atstring Puede ser null Formatodate-timeCuándo se registró la cita en Totem (UTC).
versioninteger Rango ≥ 1Aumenta cada vez que cambia alguno de los campos exportados del registro. Aplica un cambio solo si su versión es mayor que la que guardas.
updated_atstring Formatodate-timeCuándo registró Totem esta versión (UTC). No es la hora en que ocurrió el hecho.
Errores
- 403
team_state_restrictedEquipo restringido - 403
sector_restrictedSector restringido - 404
resource_missingRecurso no encontrado - 409
capture_not_readyLos datos del equipo aún se están preparando
curl 'https://api.totemstudio.ai/v1/bookings/bkg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3ttMKHRR9ADk3N7Cr3NSuY0' \
-H "Authorization: Bearer $TOTEM_API_KEY"{
"id": "bkg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3ttMKHRR9ADk3N7Cr3NSuY0",
"object": "booking",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"kind": "service_booking",
"service": "svc_h42kgwwJGPzsm2Zoy1A1RBv1KIrX5",
"status": "scheduled",
"starts_at": "2026-10-06T15:00:00.000Z",
"ends_at": "2026-10-06T15:30:00.000Z",
"meeting_type": "in_person",
"source": "ai",
"rescheduled_from": null,
"rescheduled_to": null,
"created_at": "2026-10-01T09:01:00.000Z",
"version": 1,
"updated_at": "2026-10-01T09:01:02.000Z"
}GET /
Lista todos los servicios reservables del equipo en una sola respuesta, que nunca se pagina y no admite limit ni cursor. Los servicios reservables no llegan por el feed de cambios: lee esta lista al empezar a sincronizar un equipo, de nuevo cuando una cita indique un servicio que no conoces y, como mínimo, una vez al día. Un servicio borrado sale de la lista, pero sus citas siguen indicando su identificador, así que conserva de una lectura anterior el nombre de servicio que necesites.
Cabeceras
Totem-Teamstring Condicional Prefijo del idteam_…El equipo que se lee, como identificador
team_…. Omítelo si la clave lee un solo equipo; es obligatorio si lee varios (400 team_required). Si lo envías, debe indicar un equipo que la clave lee: un identificador mal formado recibe400 invalid_request, y un equipo fuera de la clave,404 team_not_accessible, igual que una petición sin la cabecera cuando la clave ya no lee ningún equipo.
Respuesta
Devuelve una lista de objetos BookingService.
objectstringSiempre
list.dataArray<BookingService>Todos los servicios reservables del equipo.
has_morebooleanSiempre
false: esta lista nunca se pagina.next_cursornull Puede ser nullSiempre
null: no hay página siguiente.
Errores
- 400
team_requiredFalta el equipo - 403
team_state_restrictedEquipo restringido - 403
sector_restrictedSector restringido - 404
team_not_accessibleEquipo no accesible - 409
capture_not_readyLos datos del equipo aún se están preparando - 429
quota_exceededCuota diaria superada
curl 'https://api.totemstudio.ai/v1/booking_services' \
-H "Authorization: Bearer $TOTEM_API_KEY" \
-H "Totem-Team: $TOTEM_TEAM_ID"{
"object": "list",
"data": [
{
"id": "svc_h42kgwwJGPzsm2Zoy1A1RBv1KIrX5",
"object": "booking_service",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"name": "First visit",
"meeting_type": "in_person"
}
],
"has_more": false,
"next_cursor": null
}Una cita y su tipo (kind): para un servicio reservable, un evento del calendario conectado o una cita importada de otro sistema.
Atributos
idstring Prefijo del idbkg_…Identificador público del registro.
objectstringSiempre
booking.livemodebooleantrueen datos reales;falseen los datos de ejemplo.teamstring Prefijo del idteam_…El equipo al que pertenece este registro.
leadstring Puede ser null Prefijo del idlead_…El lead al que pertenece la cita, o null si la cita no tiene lead o el lead ya no existe. El nombre y los datos de contacto solo aparecen en el lead.
kindstringservice_booking(una cita de un servicio reservable, creada por la IA, un cliente o una persona),calendar_event(un evento del calendario conectado) oexternal_import(sincronizada desde un sistema de citas externo o leída de un correo electrónico de un portal). Una cita de un origen que esta versión no conoce aparece comocalendar_event.Valores posiblesservice_bookingcalendar_eventexternal_import
servicestring Puede ser null Prefijo del idsvc_…El servicio de la cita (ver
/booking_services) en unaservice_booking; null en otro caso.statusstring Puede ser nullscheduled,rescheduled,cancelled,postponed,attended,no_showoteam_no_show(la asistencia solo la registran personas); null si es un valor que esta versión no conoce.rescheduledsignifica que la cita se movió sin cambiar de registro y sus horas son las nuevas; una cita que la IA sustituyó por otra queda encancelled, conrescheduled_to.Valores posiblesscheduledrescheduledcancelledpostponedattendedno_showteam_no_show
starts_atstring Puede ser null Formatodate-timeCuándo empieza la cita (UTC).
ends_atstring Puede ser null Formatodate-timeCuándo termina la cita (UTC).
meeting_typestring Puede ser nullonline,in_personophone; null si no está guardado.Valores posiblesonlinein_personphone
sourcestring Puede ser nullQuién creó la cita:
ai,customeruoperator; null si no está registrado.Valores posiblesaicustomeroperator
rescheduled_fromstring Puede ser null Prefijo del idbkg_…La cita a la que esta sustituyó al reprogramar, o null. Durante unos segundos la cita sustituida puede seguir en
scheduled; las citas reprogramadas antes de que Totem empezara a registrar este enlace pueden no tenerlo.rescheduled_tostring Puede ser null Prefijo del idbkg_…La cita que sustituyó a esta al reprogramar, o null. Cuando está indicada, esta cita queda en
cancelled.created_atstring Puede ser null Formatodate-timeCuándo se registró la cita en Totem (UTC).
versioninteger Rango ≥ 1Aumenta cada vez que cambia alguno de los campos exportados del registro. Aplica un cambio solo si su versión es mayor que la que guardas.
updated_atstring Formatodate-timeCuándo registró Totem esta versión (UTC). No es la hora en que ocurrió el hecho.
{
"id": "bkg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3ttMKHRR9ADk3N7Cr3NSuY0",
"object": "booking",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"kind": "service_booking",
"service": "svc_h42kgwwJGPzsm2Zoy1A1RBv1KIrX5",
"status": "scheduled",
"starts_at": "2026-10-06T15:00:00.000Z",
"ends_at": "2026-10-06T15:30:00.000Z",
"meeting_type": "in_person",
"source": "ai",
"rescheduled_from": null,
"rescheduled_to": null,
"created_at": "2026-10-01T09:01:00.000Z",
"version": 1,
"updated_at": "2026-10-01T09:01:02.000Z"
}Un servicio que los clientes pueden reservar, con su tipo de reunión.
Atributos
idstring Prefijo del idsvc_…Identificador público del registro.
objectstringSiempre
booking_service.livemodebooleantrueen datos reales;falseen los datos de ejemplo.teamstring Prefijo del idteam_…El equipo al que pertenece este registro.
namestring Puede ser null ≥ 1 caracteresEl nombre del servicio, o null si no hay ninguno guardado.
meeting_typestringCómo se presta el servicio:
online(el valor por defecto si no hay ninguno guardado),in_personophone.Valores posiblesonlinein_personphone
{
"id": "svc_h42kgwwJGPzsm2Zoy1A1RBv1KIrX5",
"object": "booking_service",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"name": "First visit",
"meeting_type": "in_person"
}