Acceso vía API — Documentación
Agenda / MAB — integración externa y API administrativa
Actualización técnica: 23-08-2026
Esta versión amplía la documentación original en dos direcciones: incorpora la operación confirm_appointment y registra las capacidades que ya existen en la API utilizada por el sistema administrativo, pero que no estaban descritas en el documento anterior.
URL de servicio usada en los ejemplos: [url_base]/ws/mab_web_service
Índice rápido
- Introducción
- Convenciones básicas
- Catastro de funcionalidades
- Estrategia de integración externa
- Ejercicio guiado paso a paso
- Endpoints de integración externa
- API administrativa de reservas
- Operaciones auxiliares
- Auditoría de sesiones y tickets
- Preguntas frecuentes
Introducción
La API permite dos familias de uso relacionadas, pero conceptualmente distintas:
- Integración externa de agendamiento: login, catálogo, disponibilidad, creación, confirmación/cancelación y auditoría.
- Operación administrativa: consulta y exportación de reservas, colores operativos, vistas personalizadas y filtros guardados.
El objetivo de esta guía es que un desarrollador pueda integrarse con URL base + usuario + contraseña + esta documentación, y que el sistema administrativo PHP pueda apoyarse en un contrato API explícito en vez de depender de conocimiento implícito del código.
El flujo externo normal queda así:
- Obtener token y hash del catálogo.
- Obtener catálogo completo o filtrado.
- Consultar disponibilidad.
- Crear reserva.
- Confirmar reserva cuando el flujo de negocio lo requiera.
- Cancelar reserva cuando corresponda.
- Logout.
La confirmación y la cancelación son operaciones posteriores sobre un ticket ya creado e identificado por bookingId.
Convenciones básicas
| Concepto | Convención |
|---|---|
| Transporte | POST con cuerpo JSON salvo respuestas de archivo |
| Content-Type | application/json; charset=utf-8 |
| Fecha | YYYYMMDD, por ejemplo 20251013 |
| Hora | HHMM, por ejemplo 1430 → 14:30 |
| Autorización | tkn, salvo operaciones expresamente públicas/de bootstrap |
| Ticket | bookingId; al crear se devuelve dentro de appointmentIds |
| Trazabilidad | t_init / t_end, sellos de tiempo del servidor |
| Catálogo | Define combinaciones válidas |
| Disponibilidad | Define cuáles de esas combinaciones están libres en un intervalo |
resource_set_id=null | En preferencias administrativas representa el juego implícito de todas las dimensiones del cluster cuando no existe un resource set explícito |
Catastro de funcionalidades
La documentación anterior publicaba login, catálogo, disponibilidad, creación, cancelación, logout y auditoría. El servidor actual expone además varias operaciones utilizadas o destinadas al sistema administrativo.
Capacidades operativas que deben quedar documentadas
| Área | Operación | Tipo de mensaje | Situación respecto del documento anterior |
|---|---|---|---|
| Reservas | Consultar reservas | get_appointments | Faltaba |
| Reservas | Exportar reservas a Excel | get_appointments_as_excel | Faltaba |
| Reservas | Confirmar ticket | confirm_appointment | Nueva capacidad |
| Reservas | Cancelar ticket | cancel_appointment | Ya documentada |
| Colores | Obtener paleta | get_colors | Faltaba |
| Colores | Asignar color a ticket | set_color | Faltaba |
| Vistas | Consultar vistas | get_reservations_views | Faltaba |
| Vistas | Crear vista | create_reservations_view | Faltaba |
| Vistas | Modificar vista | update_reservations_view | Faltaba |
| Vistas | Eliminar vista | delete_reservations_view | Faltaba |
| Filtros | Consultar filtros | get_reservations_filters | Faltaba |
| Filtros | Crear filtro | create_reservations_filter | Faltaba |
| Filtros | Modificar filtro | update_reservations_filter | Faltaba |
| Filtros | Eliminar filtro | delete_reservations_filter | Faltaba |
| Auditoría | Consultar sesión/ticket | booking_audit_get_json_messages | Ya documentada |
Superficie auxiliar existente
El servidor también registra operaciones auxiliares como get_user, get_info, get_conditioned_values, get_catalogo_plano y mecanismos de códigos de un solo uso/handoff. Se describen más adelante como superficie auxiliar, porque su existencia técnica no significa automáticamente que deban formar parte del contrato público principal.
Operaciones que no se promueven como contrato público
En la revisión del código hay mensajes que no conviene presentar como funcionalidad pública estable: authenticate actualmente no entrega una respuesta operativa y la obtención de módulos de atención está incompleta en su respuesta. Se dejan fuera del catálogo funcional público hasta que exista un contrato definido.
Estrategia de integración externa
- Hacer login y guardar
tknycatalogo_hash. - Si no existe catálogo local o el hash cambió, volver a solicitar y almacenar el catálogo.
- Usar el catálogo para traducir dimensiones y registros a IDs operativos.
- Consultar disponibilidad con una
selectionparcial que represente el filtro de negocio. - Elegir una entrada disponible en
disponibilidad[fecha][indice]. - Tomar
seleccion[indice]y revisarcatalogo.agendaspara obtener las combinaciones completas que calzan con esa selección. - Elegir la combinación final y crear el ticket con
selectionId. - Persistir el
bookingIdretornado; ese identificador se usa para confirmación, cancelación, color y auditoría.
Punto clave: las agendas siempre son distintas entre sí. En el ejercicio automotriz las diferencias se entienden bien a través del modelo del vehículo, pero en otro sistema podrían diferir por cualquier otra dimensión del catálogo.
Ejercicio guiado paso a paso
Objetivo: crear un ticket para un Mantenimiento en Sucursal Las Condes para un vehículo Citroën, escogiendo un horario realmente disponible y, luego, confirmar el ticket.
Paso 1. Login
curl -X POST -H "Content-Type: application/json" \
-d '{ "type":"login", "user":"[usuario]", "password":"[password]" }' \
[url_base]/ws/mab_web_service
Guardar tkn y catalogo_hash.
Paso 2. Refrescar catálogo solo cuando corresponda
- Si no tienes catálogo almacenado, solicítalo.
- Si el hash cambió, vuelve a solicitarlo.
- Si el hash no cambió, puedes reutilizar la copia local.
Paso 3. Obtener catálogo
curl -X POST --location '[url_base]/ws/mab_web_service' \
--header 'Content-Type: application/json' \
--data '{ "tkn":"<token>", "type":"get_catalogo" }'
Para este ejercicio interesan al menos estos registros:
1048 = MANTENIMIENTO482 = Sucursal Las Condes684 = Citroën
Paso 4. Consultar disponibilidad
curl -X POST --location '[url_base]/ws/mab_web_service' \
--header 'Content-Type: application/json' \
--data '{"tkn":"<token>","selection":[1048,482,684],"yyyymmdd_from":20251020,"yyyymmdd_until":20251024,"includeCatalog":true,"type":"get_availability"}'
Paso 5. Interpretar la disponibilidad
Ejemplo reducido:
{
"disponibilidad": {
"20251020": {
"0": [
{ "a": 830, "b": 845 },
{ "a": 845, "b": 900 }
]
}
},
"seleccion": {
"0": {
"catalogo.agendas": [298,299,311,313,315,316,318,320,322,324,326,328,329],
"seleccion": { "0":1429, "1":1048, "2":482, "3":873, "5":684 }
}
}
}
La selección parcial consultada fue [1048,482,684], pero el sistema devolvió una selección disponible más completa. catalogo.agendas identifica las combinaciones completas del catálogo que contienen esa selección disponible.
Paso 6. Elegir la combinación completa
Tomando los IDs de catalogo.agendas, se revisa qué valor toma la dimensión correspondiente al vehículo/modelo. Supongamos que se elige selectionId = 322, correspondiente a CACTUS.
Paso 7. Elegir el tramo horario
yyyymmdd = 20251020hhmm_from = 830hhmm_until = 845
Paso 8. Crear el ticket
curl -X POST --location '[url_base]/ws/mab_web_service' \
--header 'Content-Type: application/json' \
--data '{
"tkn":"[token]",
"selectionId":322,
"yyyymmdd":20251020,
"hhmm_from":830,
"hhmm_until":845,
"form":{
"contact":{"dni":"[rut]","phones":"[celular 9 digitos]","emails":"[correo valido]","names":"[nombres]","scndnames":"[apellidos]"},
"vehiculo":{"patente":"[patente]","xkilometraje":"[kilometraje]","year":"[año]"},
"mensaje":{"msg":"[mensaje opcional]"}
},
"type":"new_appointment"
}'
Respuesta esperada:
{
"errors": [],
"appointmentIds": [116326],
"errorCode": 0,
"type": "new_appointment.answer",
"tkn": "",
"t_init": 1760288918848,
"t_end": 1760288995068
}
Paso 9. Guardar el ticket
El integrador debe persistir el ID retornado en appointmentIds. En el ejemplo, bookingId = 116326.
Paso 10. Confirmar el ticket, si corresponde
curl -X POST --location '[url_base]/ws/mab_web_service' \
--header 'Content-Type: application/json' \
--data '{
"type":"confirm_appointment",
"tkn":"[token]",
"bookingId":116326
}'
Respuesta exitosa:
{
"errorCode":0,
"type":"confirm_appointment.answer",
"tkn":"",
"t_init":1760290000000,
"t_end":1760290000010
}
La operación es idempotente: si el ticket ya está confirmado, vuelve a responder errorCode: 0 sin ejecutar nuevamente la acción de confirmación. Solo un ticket en estado ingresado/no confirmado puede pasar a confirmado. Un ticket inexistente, de otro cluster, cancelado o en otro estado no confirmable responde errorCode: -1.
Endpoints de integración externa
EP-001 Obtener token — login
Método: POST
curl -X POST -H "Content-Type: application/json" \
-d '{ "type":"login", "user":"[usuario]", "password":"[password]" }' \
[url_base]/ws/mab_web_service
Respuesta exitosa de ejemplo:
{
"type":"login.answer",
"tkn":"BTTrTGbvlkMKOmMAlMxxG1S7uOdq6fWj",
"catalogo_hash":"129978891caec621a7b5a4979d32b7103f2cd64c619aff4dd6ae644a57dc781a",
"t_init":1760123792796,
"t_end":1760123792802
}
EP-002 Obtener catálogo — get_catalogo
Devuelve dimensiones, registros y agendas válidas. Permite proyección con selected_dimensions y filtrado por selection.
{
"type":"get_catalogo",
"tkn":"[token]"
}
EP-003 Consultar disponibilidad — get_availability
La respuesta expone disponibilidad y seleccion. Cada selección puede incluir catalogo.agendas con las combinaciones completas candidatas.
{
"type":"get_availability",
"tkn":"[token]",
"selection":[1048,482,684],
"yyyymmdd_from":20251020,
"yyyymmdd_until":20251024,
"includeCatalog":true
}
EP-004 Crear reserva — new_appointment
La creación usa selectionId y devuelve uno o más IDs en appointmentIds.
EP-005 Confirmar reserva — confirm_appointment
Entrada: tkn, bookingId.
{
"type":"confirm_appointment",
"tkn":"[token]",
"bookingId":116326
}
Semántica:
- Verifica que el ticket exista.
- Verifica que pertenezca al mismo cluster de la sesión autenticada.
- Si ya está confirmado, responde éxito sin repetir la acción.
- Solo permite transición desde ingresado/no confirmado.
errorCode = 0: éxito o ya confirmado.errorCode = -1: ticket inexistente, cluster incorrecto, estado no confirmable o fallo de la operación.
La acción usa el flujo de alto nivel de confirmación del sistema, incluyendo los efectos normales asociados a la confirmación, como las notificaciones configuradas para ese flujo.
EP-006 Cancelar reserva — cancel_appointment
curl -X POST --location '[url_base]/ws/mab_web_service' \
--header 'Content-Type: application/json' \
--data '{ "tkn":"[token]", "bookingId":116327, "type":"cancel_appointment" }'
EP-007 Logout — logout
curl -X POST --location '[url_base]/ws/mab_web_service' \
--header 'Content-Type: application/json' \
--data '{ "tkn":"[token]", "type":"logout" }'
EP-008 Consultar auditoría — booking_audit_get_json_messages
Permite recuperar las comunicaciones auditadas de una sesión buscando por token histórico y/o por appointment_id. Ver Auditoría de sesiones y tickets.
API administrativa de reservas
Estas operaciones corresponden a capacidades ya presentes en la capa API que utiliza el sistema administrativo y que no estaban explicadas en el documento original.
AD-001 Consultar reservas — get_appointments
Permite obtener reservas dentro de una ventana de fechas, filtrar por valores del catálogo, incluir/excluir estados, realizar búsqueda textual y opcionalmente devolver la clasificación de dimensiones/registros necesaria para interpretar la selección histórica.
{
"type":"get_appointments",
"tkn":"[token]",
"selection":[],
"yyyymmdd_from":20260801,
"yyyymmdd_until":20260831,
"includeCatalog":true,
"include_entered":true,
"include_confirmed":true,
"include_cancelled":false,
"search_text":""
}
La respuesta contiene appointments, dimensiones y registros.
La búsqueda textual puede considerar datos visibles de la reserva, como ID, canal/empresa de origen, estado, fecha/hora, valores conceptuales de dimensiones y valores almacenados en associated_data[*].data.
AD-002 Exportar reservas a Excel — get_appointments_as_excel
Usa la misma idea de ventana temporal, selección y estados, pero la respuesta es un archivo XLSX.
{
"type":"get_appointments_as_excel",
"tkn":"[token]",
"selection":[],
"yyyymmdd_from":20260801,
"yyyymmdd_until":20260831,
"include_entered":true,
"include_confirmed":true,
"include_cancelled":false
}
MIME esperado: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.
AD-003 Obtener colores — get_colors
Obtiene la paleta de colores disponible para identificación visual de tickets. En el dispatcher actual esta operación está expresamente permitida sin autenticación.
{
"type":"get_colors"
}
AD-004 Asignar color — set_color
Asigna colorId a bookingId y actualiza tanto persistencia como representación en memoria.
{
"type":"set_color",
"tkn":"[token]",
"bookingId":116326,
"colorId":3
}
Esta operación requiere un token de acceso válido. A diferencia de get_colors, set_color se procesa dentro del flujo autenticado de la API.
AD-005 Vistas de la tabla de reservas
Una vista guarda una preferencia de presentación: qué columnas se muestran, en qué orden y si están habilitadas. No modifica los datos de la reserva.
Operaciones:
get_reservations_viewscreate_reservations_viewupdate_reservations_viewdelete_reservations_view
Consultar vistas
{
"type":"get_reservations_views",
"tkn":"[token]",
"resource_set_id":null
}
La respuesta entrega dos colecciones relacionadas por reservation_view_id: views[] y columns[]. Si no existen vistas, ambas pueden venir vacías y la interfaz puede conservar el comportamiento por defecto mostrando todas las columnas.
Crear vista
En el código más reciente revisado cada elemento de columns contiene el texto literal final de la columna y su estado enabled; la posición del elemento determina idx.
{
"type":"create_reservations_view",
"tkn":"[token]",
"resource_set_id":null,
"code":"taller",
"label":"Taller",
"columns":[
{"column_label":"Reserva","enabled":true},
{"column_label":"Estado","enabled":true},
{"column_label":"Patente","enabled":true},
{"column_label":"Correo","enabled":false}
]
}
column_label es deliberadamente el texto literal producido por el postproceso de columnas, no el nombre físico de una columna SQL.
Modificar vista
{
"type":"update_reservations_view",
"tkn":"[token]",
"reservation_view_id":12,
"code":"taller",
"label":"Taller principal",
"columns":[
{"column_label":"Reserva","enabled":true},
{"column_label":"Patente","enabled":true},
{"column_label":"Estado","enabled":true}
]
}
La lista enviada representa la definición completa deseada. La modificación no mueve la vista a otro resource_set_id.
Eliminar vista
{
"type":"delete_reservations_view",
"tkn":"[token]",
"reservation_view_id":12
}
AD-006 Filtros guardados de reservas
Los filtros son preferencias reutilizables asociadas al cluster y, opcionalmente, a un resource_set_id explícito. Cuando resource_set_id es null, se trabaja con el juego implícito de dimensiones del cluster.
Operaciones:
get_reservations_filterscreate_reservations_filterupdate_reservations_filterdelete_reservations_filter
Consultar filtros
{
"type":"get_reservations_filters",
"tkn":"[token]",
"resource_set_id":null
}
La respuesta separa cabeceras, grupos y condiciones en filters[], groups[] y conditions[].
Crear filtro
{
"type":"create_reservations_filter",
"tkn":"[token]",
"resource_set_id":null,
"code":"mantenciones_las_condes",
"label":"Mantenciones Las Condes",
"groups":[
[1048,482],
[501,482]
]
}
groups es una lista ordenada de grupos; cada grupo contiene IDs x del catálogo. La API valida, entre otras cosas, que exista al menos un grupo, que ningún grupo esté vacío, que no se repita un x dentro del mismo grupo, que no haya dos valores de una misma dimensión dentro del mismo grupo y que cada x pertenezca al catálogo válido del contexto.
Modificar filtro
{
"type":"update_reservations_filter",
"tkn":"[token]",
"reservation_filter_id":8,
"code":"mantenciones_las_condes",
"label":"Mantenciones — Las Condes",
"groups":[
[1048,482]
]
}
La colección groups enviada reemplaza la definición anterior.
Eliminar filtro
{
"type":"delete_reservations_filter",
"tkn":"[token]",
"reservation_filter_id":8
}
Operaciones auxiliares
Estas capacidades existen en el servidor, pero se recomienda mantenerlas separadas del contrato público principal hasta definir qué integradores deben utilizarlas.
| Operación | Uso observado |
|---|---|
get_user | Obtención de usuario por DNI dentro del cluster |
get_info | Información contextual; el código revisado contempla client_contact_info y time_zone |
get_conditioned_values | Consulta de valores condicionados de catálogo |
get_catalogo_plano | Variante plana/técnica del catálogo |
| Códigos de booking events | Emisión autenticada de un código de un solo uso para un flujo de eventos |
| Exchange handoff code | Canje de código de un solo uso por token y contexto de sesión |
La existencia de estas operaciones en el dispatcher demuestra que forman parte de la superficie técnica, pero su exposición a terceros debe decidirse explícitamente.
Auditoría de sesiones y tickets
Operación
- Tipo:
booking_audit_get_json_messages - Método:
POST - URL:
[url_base]/ws/mab_web_service - Autorización:
tkn - Criterios:
search_by_access_tokeny/osearch_by_appointment_id
tkn autoriza la consulta actual. search_by_access_token identifica el token histórico cuya conversación se desea investigar.
Buscar por token
{
"type":"booking_audit_get_json_messages",
"tkn":"[token_que_autoriza_la_consulta]",
"search_by_access_token":"[token_de_la_sesion_auditada]"
}
Buscar por appointment_id
{
"type":"booking_audit_get_json_messages",
"tkn":"[token_que_autoriza_la_consulta]",
"search_by_appointment_id":116326
}
El appointment_id identifica la sesión en que se creó ese ticket y la API devuelve el historial completo del token de esa sesión. Por eso pueden aparecer otros tickets creados con el mismo token.
appointment_id consultado
→ identifica la sesión de creación
→ identifica el token de acceso de esa sesión
→ recupera todas las comunicaciones conocidas de ese token
Si se envían ambos criterios, se combinan con AND. Si no se envía ninguno, la respuesta contiene messages: [].
Cada elemento de messages agrupa request y response, con sus marcas de tiempo, JSON interpretado cuando corresponde, texto bruto cuando no es JSON y eventual exception.
Preguntas frecuentes
1. Si consulto disponibilidad con una selección parcial, ¿por qué devuelve varias agendas?
Porque la selección puede estar contenida en múltiples combinaciones completas. catalogo.agendas enumera esas candidatas.
2. ¿Las agendas en catalogo.agendas son iguales?
No. Son combinaciones distintas que contienen la selección parcial disponible.
3. ¿Cuál es la diferencia entre catálogo y disponibilidad?
El catálogo enumera combinaciones válidas; la disponibilidad indica cuáles están libres en un intervalo concreto.
4. ¿Cuándo debo volver a pedir el catálogo?
Cuando no tengas copia local o cuando cambie catalogo_hash.
5. ¿Para qué sirve selected_dimensions en get_catalogo?
Permite proyectar el catálogo sobre dimensiones específicas.
6. ¿Para qué sirve selection en get_catalogo?
Permite filtrar por registros específicos; puede admitir más de un valor por dimensión.
7. ¿Por qué new_appointment usa selectionId?
Porque el código vigente crea el ticket a partir de la combinación completa identificada por selectionId.
8. ¿Qué debo guardar localmente?
Como mínimo: catálogo, hash, IDs relevantes y los appointmentIds de los tickets creados.
9. ¿Confirmar dos veces un ticket genera dos confirmaciones?
No. confirm_appointment fue definido como operación idempotente: un ticket ya confirmado devuelve éxito sin ejecutar nuevamente la acción de confirmación.
10. ¿Confirmar y cancelar son equivalentes?
No. Son transiciones de estado diferentes y usan acciones de negocio diferentes. Ambas operan sobre bookingId.
11. ¿Por qué una auditoría por appointment_id puede mostrar otros tickets?
Porque el ticket se usa para localizar su sesión de creación y luego se devuelve la conversación completa de esa sesión.
MAB Soluciones y Servicios Informáticos Ltda.
Contacto: contacto@mab.cl
Soporte API: tomas@mab.cl
WhatsApp: +56 9 6540 2720
Ubicación: Las Condes, Santiago, Chile
Sitios: ia.mab.cl · www.mab.cl
Horario: Lunes a Viernes 8:00 AM – 6:00 PM
© MAB. Todos los derechos reservados.