MAB · API

Documentación API de Agenda / MAB

Integración externa + operaciones administrativas.

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

  1. Introducción
  2. Convenciones básicas
  3. Catastro de funcionalidades
  4. Estrategia de integración externa
  5. Ejercicio guiado paso a paso
  6. Endpoints de integración externa
  7. API administrativa de reservas
  8. Operaciones auxiliares
  9. Auditoría de sesiones y tickets
  10. Preguntas frecuentes

Introducción

La API permite dos familias de uso relacionadas, pero conceptualmente distintas:

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í:

  1. Obtener token y hash del catálogo.
  2. Obtener catálogo completo o filtrado.
  3. Consultar disponibilidad.
  4. Crear reserva.
  5. Confirmar reserva cuando el flujo de negocio lo requiera.
  6. Cancelar reserva cuando corresponda.
  7. Logout.

La confirmación y la cancelación son operaciones posteriores sobre un ticket ya creado e identificado por bookingId.

Convenciones básicas

ConceptoConvención
TransportePOST con cuerpo JSON salvo respuestas de archivo
Content-Typeapplication/json; charset=utf-8
FechaYYYYMMDD, por ejemplo 20251013
HoraHHMM, por ejemplo 1430 → 14:30
Autorizacióntkn, salvo operaciones expresamente públicas/de bootstrap
TicketbookingId; al crear se devuelve dentro de appointmentIds
Trazabilidadt_init / t_end, sellos de tiempo del servidor
CatálogoDefine combinaciones válidas
DisponibilidadDefine cuáles de esas combinaciones están libres en un intervalo
resource_set_id=nullEn 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

ÁreaOperaciónTipo de mensajeSituación respecto del documento anterior
ReservasConsultar reservasget_appointmentsFaltaba
ReservasExportar reservas a Excelget_appointments_as_excelFaltaba
ReservasConfirmar ticketconfirm_appointmentNueva capacidad
ReservasCancelar ticketcancel_appointmentYa documentada
ColoresObtener paletaget_colorsFaltaba
ColoresAsignar color a ticketset_colorFaltaba
VistasConsultar vistasget_reservations_viewsFaltaba
VistasCrear vistacreate_reservations_viewFaltaba
VistasModificar vistaupdate_reservations_viewFaltaba
VistasEliminar vistadelete_reservations_viewFaltaba
FiltrosConsultar filtrosget_reservations_filtersFaltaba
FiltrosCrear filtrocreate_reservations_filterFaltaba
FiltrosModificar filtroupdate_reservations_filterFaltaba
FiltrosEliminar filtrodelete_reservations_filterFaltaba
AuditoríaConsultar sesión/ticketbooking_audit_get_json_messagesYa 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

  1. Hacer login y guardar tkn y catalogo_hash.
  2. Si no existe catálogo local o el hash cambió, volver a solicitar y almacenar el catálogo.
  3. Usar el catálogo para traducir dimensiones y registros a IDs operativos.
  4. Consultar disponibilidad con una selection parcial que represente el filtro de negocio.
  5. Elegir una entrada disponible en disponibilidad[fecha][indice].
  6. Tomar seleccion[indice] y revisar catalogo.agendas para obtener las combinaciones completas que calzan con esa selección.
  7. Elegir la combinación final y crear el ticket con selectionId.
  8. Persistir el bookingId retornado; 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

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:

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

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
}

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:

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:

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:

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ónUso observado
get_userObtención de usuario por DNI dentro del cluster
get_infoInformación contextual; el código revisado contempla client_contact_info y time_zone
get_conditioned_valuesConsulta de valores condicionados de catálogo
get_catalogo_planoVariante plana/técnica del catálogo
Códigos de booking eventsEmisión autenticada de un código de un solo uso para un flujo de eventos
Exchange handoff codeCanje 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

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.