API REST
BookingMeeting expone una API REST de solo lectura que te permite extraer citas, trabajadores, servicios y métricas de tu propia empresa para integrarlas en tu web, intranet o herramientas internas. Pensada para integraciones server-to- server: autenticación por Bearer token, JSON, CORS abierto.
Empezar en 1 minuto
- Inicia sesión en tu panel de administración → API y crea una key. La verás una sola vez — cópiala.
- Llama a cualquier endpoint pasando la key como Bearer:
curl https://bookingmeeting.com/api/v1/me \
-H "Authorization: Bearer bm_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Autenticación
Todas las peticiones requieren la cabecera Authorization: Bearer <tu_api_key>. Las keys empiezan por bm_ seguido de 32 caracteres alfanuméricos. Cada key pertenece a una empresa concreta — solo verás los datos de esa empresa.
Si la key falta, está mal escrita o ha sido revocada, la respuesta es 401 con { "error": "missing_or_invalid_api_key" }.
Límites de uso
- 60 peticiones por minuto y por key. Si lo superas recibes
429con cabeceraRetry-Afterindicando los segundos a esperar. - Cada respuesta incluye
X-RateLimit-Limit,X-RateLimit-RemainingyX-RateLimit-Reset(epoch en segundos) para que ajustes tu cadencia. - No hay límite mensual de peticiones — solo el cap por minuto. Si necesitas más, escríbenos.
Formato de respuesta
Todas las respuestas correctas tienen forma { "data": ..., "meta": { "generatedAt": "..." } }. El campo data es el payload concreto del endpoint (objeto o array). meta.generatedAt es el timestamp ISO del servidor en el momento de la respuesta.
Los errores tienen forma { "error": "<código>", "message": "<descripción>" }. Códigos posibles:
401 missing_or_invalid_api_key— la key no es válida.429 rate_limit_exceeded— has superado las 60 req/min.500 internal_error— error del servidor; reintenta en unos segundos.
CORS
CORS está abierto a todos los orígenes (Access-Control-Allow-Origin: *). En la práctica no recomendamos llamar a la API desde el navegador de tus clientes porque expondría tu key. Úsala siempre desde tu backend.
Endpoints
GET/me
Información de tu empresa
Devuelve los datos públicos de la empresa propietaria de la API key.
Ejemplo
curl "https://bookingmeeting.com/api/v1/me" \
-H "Authorization: Bearer bm_..."Respuesta
{
"data": {
"id": "AbCd1234",
"name": "ACME Consulting",
"slug": "acme-consulting",
"branding": {
"logoUrl": "https://...",
"primaryColor": "#006BFF",
"secondaryColor": "#0050CC"
},
"contact": { "email": "info@acme.com", "phone": null },
"settings": {
"timezone": "Europe/Madrid",
"defaultBufferBefore": 0,
"defaultBufferAfter": 15,
"defaultMinimumNoticeHours": 12
},
"metrics": {
"totalAppointments": 421,
"totalActiveStaff": 5,
"appointmentsThisMonth": 38
},
"createdAt": "2025-12-04T09:11:22.331Z"
},
"meta": { "generatedAt": "2026-05-13T12:00:00.000Z" }
}GET/staff
Lista de trabajadores
Devuelve todos los trabajadores de tu empresa. Por defecto solo los activos.
Parámetros de query
status(string) — Filtra por estado del trabajador. Valores: "active" (default), "pending", "rejected", "suspended".
Ejemplo
curl "https://bookingmeeting.com/api/v1/staff" \
-H "Authorization: Bearer bm_..."Respuesta
{
"data": [
{
"id": "uid-abc",
"displayName": "Laura García",
"email": "laura@acme.com",
"photoURL": "https://...",
"title": "Consultora senior",
"slug": "laura-garcia",
"timezone": "Europe/Madrid",
"googleCalendarConnected": true,
"acceptedServiceIds": ["srv-1", "srv-2"],
"metrics": { "appointmentsThisMonth": 12 }
}
],
"meta": { "generatedAt": "2026-05-13T12:00:00.000Z" }
}GET/services
Lista de servicios
Devuelve los servicios configurados en tu empresa. Por defecto solo activos.
Parámetros de query
active(boolean) — Por defecto "true". Pásalo como "false" para incluir también servicios desactivados.
Ejemplo
curl "https://bookingmeeting.com/api/v1/services" \
-H "Authorization: Bearer bm_..."Respuesta
{
"data": [
{
"id": "srv-1",
"name": "Consulta inicial",
"description": "Primera sesión de 30 minutos.",
"duration": 30,
"type": "video",
"bufferBefore": 0,
"bufferAfter": 15,
"minimumNoticeHours": 12,
"maxAdvanceDays": 60,
"assignedStaffIds": ["uid-abc"],
"color": "#006BFF",
"isActive": true,
"createdAt": "2025-12-04T09:11:22.331Z"
}
],
"meta": { "generatedAt": "2026-05-13T12:00:00.000Z" }
}GET/appointments
Lista de citas
Devuelve hasta 200 citas ordenadas por fecha descendente. Soporta filtrado por rango, trabajador y estado.
Parámetros de query
from(string (ISO 8601)) — Fecha mínima de inicio de cita. Ej.: "2026-05-01T00:00:00Z".to(string (ISO 8601)) — Fecha máxima de inicio de cita.staffId(string) — UID del trabajador. Filtra a sus citas únicamente.status(string) — Estado. Valores: "confirmed", "completed", "cancelled", "no_show".limit(number) — Entre 1 y 200. Por defecto 50.
Ejemplo
curl "https://bookingmeeting.com/api/v1/appointments" \
-H "Authorization: Bearer bm_..."Respuesta
{
"data": [
{
"id": "appt-xyz",
"staffId": "uid-abc",
"serviceId": "srv-1",
"serviceName": "Consulta inicial",
"serviceDuration": 30,
"clientEmail": "cliente@example.com",
"clientName": "Jorge García",
"clientPhone": null,
"startAt": "2026-05-15T10:00:00.000Z",
"endAt": "2026-05-15T10:30:00.000Z",
"timezone": "Europe/Madrid",
"status": "confirmed",
"meetingType": "video",
"meetLink": "https://meet.google.com/abc-defg-hij",
"source": "landing",
"createdAt": "2026-05-13T08:22:11.123Z"
}
],
"meta": { "generatedAt": "2026-05-13T12:00:00.000Z" }
}GET/analytics
Métricas agregadas
Resumen de tu empresa: totales, distribución horaria, ranking de servicios y de trabajadores, timeline diaria.
Parámetros de query
days(number) — Ventana en días. Entre 1 y 365. Por defecto 30.
Ejemplo
curl "https://bookingmeeting.com/api/v1/analytics" \
-H "Authorization: Bearer bm_..."Respuesta
{
"data": {
"range": { "days": 30 },
"totals": {
"bookings": 142,
"cancellations": 8,
"completed": 121,
"upcoming": 13
},
"byHour": [{ "hour": 10, "count": 22 }, { "hour": 11, "count": 31 }],
"byDayOfWeek": [{ "dow": 1, "count": 18 }],
"byService": [{ "serviceId": "srv-1", "count": 84 }],
"byStaff": [{ "staffId": "uid-abc", "count": 76 }],
"timeline": [{ "day": "2026-04-13", "count": 4 }]
},
"meta": { "generatedAt": "2026-05-13T12:00:00.000Z" }
}Versionado
La versión actual es v1. Mientras existan clientes activos sobre v1 no haremos cambios incompatibles: añadiremos nuevos campos opcionales y nuevos endpoints, pero no eliminaremos ni cambiaremos el tipo de los existentes. Una hipotética v2 coexistiría con v1 durante un periodo de migración.
Soporte
¿Necesitas ayuda integrando, un endpoint nuevo, o un caso de uso específico? Escríbenos a support@bookingmeeting.com.