Skip to main content

Paginación

Los endpoints de lista devuelven hasta 25 elementos por página, del más reciente al más antiguo. Envíe limit para pedir entre 1 y 100 elementos.
Los filtros de lista, como status, starts_after, starts_before y contact_id en GET /appointments, se combinan entre sí y con la paginación. Para obtener la página siguiente, envíe la misma solicitud, filtros incluidos, con cursor igual a next_cursor. En la última página, next_cursor es null y has_more es false. Trate el cursor como una cadena opaca; su formato puede cambiar.
GET /services, GET /staff, GET /availability y GET /webhooks devuelven todos los elementos en una sola página.

Filtre las listas

Algunos endpoints de lista aceptan filtros como parámetros de consulta. Los filtros se combinan entre sí y con cursor. Para listar las llamadas de ayer de un negocio en Toronto:
Codifique para URL el + de un desfase como +01:00, es decir, %2B01:00.

Reintente con seguridad con Idempotency-Key

Un error de red puede dejarle sin saber si una solicitud funcionó. Envíe un encabezado Idempotency-Key en las solicitudes que crean algo y reintente con la misma clave:
  • POST /contacts
  • POST /appointments
  • POST /knowledge
  • POST /webhooks
LobbyStack recuerda cada clave durante 24 horas, por clave de API y por operación. El servidor MCP comparte estas claves: book_appointment, create_contact y add_knowledge cuentan como POST /appointments, POST /contacts y POST /knowledge.
  • Un reintento con el mismo cuerpo vuelve a recibir la primera respuesta, con el encabezado Idempotent-Replayed: true. La API no crea una segunda cita. LobbyStack compara los valores JSON, así que el orden de las claves y los espacios no importan.
  • La misma clave con un cuerpo distinto devuelve 422 con el código idempotency_key_reused.
  • Un reintento que llega mientras la primera solicitud sigue en curso espera a que termine y luego recibe su respuesta.
  • LobbyStack guarda la clave y el cambio al mismo tiempo. Si la primera solicitud falló con un error, no se guardó nada, así que su reintento se ejecuta de nuevo.
Use un valor único por operación, como un UUID o su propio ID de pedido.

Errores

Los errores siempre tienen la misma forma:
details solo aparece en los errores de validación. Base su lógica en code; la redacción de message puede cambiar.

Reservas a través de la API

La API sigue las mismas reglas que la recepcionista con IA:
  • POST /appointments y POST /appointments/{appointment_id}/reschedule solo funcionan cuando el booking_mode del negocio es instant. Consúltelo con GET /business.
  • La hora solicitada debe estar dentro del horario de atención, evitar los cierres y otras citas, y estar libre en un Google Calendar conectado. Cuando LobbyStack no puede confirmar que el calendario esté al día, considera la hora como ocupada.
  • Las nuevas reservas se sincronizan con el calendario conectado y ponen en cola los SMS habituales de confirmación y recordatorio. LobbyStack solo los envía a los contactos que aceptaron recibir SMS. Envíe "sms_consent": true cuando el cliente haya aceptado al reservar.
  • Para reservar con una persona concreta, envíe staff_id. Sin él, LobbyStack elige a un miembro del personal disponible que ofrezca el servicio.
  • La cancelación funciona en cualquier modo de reserva. Cancelar una cita que ya está cancelada la devuelve sin cambios.
Las claves de API actúan en nombre del negocio, así que la API omite la verificación de la persona que llama que la recepcionista usa por teléfono.

Personal

GET /staff lista a todas las personas que atienden citas, con active y los service_ids para los que se puede reservar a cada una. Un servicio sin personal asignado en el panel está abierto a todos los miembros activos del personal. Un negocio que nunca configuró su personal tiene igualmente un miembro activo del personal, con el nombre del negocio. Las reservas se asignan a esa persona, así que GET /staff la devuelve como a cualquier otro miembro del personal, y puede enviar su id como staff_id. Envíe staff_id a:
  • GET /availability, para listar solo las horas en que esa persona está libre.
  • POST /appointments, para reservar con esa persona.
  • POST /appointments/{appointment_id}/reschedule, para pasar la cita a esa persona. Sin él, la cita conserva su miembro del personal.
Un staff_id que no sea un miembro activo del personal del negocio, o que no ofrezca el servicio, devuelve 400 con el código invalid_request. Pasar una cita a otro miembro del personal devuelve 409 conflict cuando cualquiera de las dos personas tiene su propio calendario conectado; en ese caso, cancele la cita y reserve una nueva.