Agenda

Referencia de 36 endpoints generados desde mosend-wb-backend/src/modules/agenda/agenda.controller.ts.

Base path: /organizations/:orgId/agenda·36 endpoints·Source: mosend-wb-backend/src/modules/agenda/agenda.controller.ts
GET/organizations/:orgId/agenda/settings
bearer

Configuración de la agenda de la organización.

Path params

  • orgIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/settings' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
PATCH/organizations/:orgId/agenda/settings
bearer

Actualiza la configuración de la agenda (habilitar requiere la feature de plan `agenda`).

Path params

  • orgIdstringrequerido

Body (JSON)

  • enabledboolean
  • minNoticeMinnumber
  • maxAdvanceDaysnumber
  • reminderTemplateNamestring

    Plantilla aprobada para el recordatorio. Convención de variables: {{1}} = nombre del contacto, {{2}} = fecha y hora local de la cita y, si la plantilla lo tiene, {{3}} = enlace de la reunión.

  • reminderTemplateLangstring
  • confirmTemplateNamestring

    Plantillas para avisar fuera de la ventana de 24 h (confirmación, cambio de hora, cancelación). Mismas variables que el recordatorio. null = sin.

  • confirmTemplateLangstring
  • rescheduleTemplateNamestring
  • rescheduleTemplateLangstring
  • cancelTemplateNamestring
  • cancelTemplateLangstring
  • reminderHoursBeforenumber

    Horas antes de la cita (0 = sin recordatorio, máx 72).

  • reminderPhoneNumberIdstring · uuid
  • bookingFlowIdstring · uuid

    WhatsAppFlow (local) publicado para reserva con date-picker nativo.

  • bloquearFestivosboolean

    Bloquear solos los festivos del país (hoy solo Colombia).

  • paisFestivosstring
    CO
  • paginaPublicaboolean

    Página pública de reservas.

  • paginaSlugstring

    Dirección de la página: app.mosend.dev/reservar/<paginaSlug>.

  • paginaPhoneNumberIdstring · uuid

    Número al que el cliente escribe para confirmar la reserva.

  • paginaMensajestring
  • reminder2HoursBeforenumber

    Recordatorios 2 y 3 (agenda avanzada). 0 o null = apagado.

  • reminder2TemplateNamestring
  • reminder2TemplateLangstring
  • reminder3HoursBeforenumber
  • reminder3TemplateNamestring
  • reminder3TemplateLangstring
  • cancelarHastaHorasnumber

    Hasta cuántas horas antes puede el cliente cancelar o reprogramar solo.

  • noShowAutoHorasnumber

    Horas tras el fin para marcar sola la inasistencia. null = nunca.

  • anticipoMinutosnumber

    Minutos para pagar el anticipo antes de liberar el horario.

  • anticipoTrasInasistenciasnumber

    Pedir anticipo a quien ya faltó tantas veces. null = no.

  • esperaTemplateNamestring

    Plantilla para ofrecer un horario liberado a la lista de espera.

  • esperaTemplateLangstring
  • esperaMinutosnumber

    Minutos que se aparta un horario ofrecido a la lista de espera.

  • encuestaTrasCitaboolean

    Encuesta de satisfacción al marcar la cita como atendida.

  • volverTemplateNamestring

    Plantilla de «agenda tu próxima».

  • volverTemplateLangstring

Respuestas

  • 200
curl -X PATCH 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/settings' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"enabled": true,"minNoticeMin": 0,"maxAdvanceDays": 0,"reminderTemplateName": "<reminderTemplateName>","reminderTemplateLang": "<reminderTemplateLang>","confirmTemplateName": "<confirmTemplateName>","confirmTemplateLang": "<confirmTemplateLang>","rescheduleTemplateName": "<rescheduleTemplateName>","rescheduleTemplateLang": "<rescheduleTemplateLang>","cancelTemplateName": "<cancelTemplateName>","cancelTemplateLang": "<cancelTemplateLang>","reminderHoursBefore": 0,"reminderPhoneNumberId": "00000000-0000-0000-0000-000000000000","bookingFlowId": "00000000-0000-0000-0000-000000000000","bloquearFestivos": true,"paisFestivos": "CO","paginaPublica": true,"paginaSlug": "<paginaSlug>","paginaPhoneNumberId": "00000000-0000-0000-0000-000000000000","paginaMensaje": "<paginaMensaje>","reminder2HoursBefore": 0,"reminder2TemplateName": "<reminder2TemplateName>","reminder2TemplateLang": "<reminder2TemplateLang>","reminder3HoursBefore": 0,"reminder3TemplateName": "<reminder3TemplateName>","reminder3TemplateLang": "<reminder3TemplateLang>","cancelarHastaHoras": 0,"noShowAutoHoras": 0,"anticipoMinutos": 0,"anticipoTrasInasistencias": 0,"esperaTemplateName": "<esperaTemplateName>","esperaTemplateLang": "<esperaTemplateLang>","esperaMinutos": 0,"encuestaTrasCita": true,"volverTemplateName": "<volverTemplateName>","volverTemplateLang": "<volverTemplateLang>"}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/ics
bearer

Estado del feed ICS público (URL de suscripción o deshabilitado).

Path params

  • orgIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/ics' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/ics/rotate
bearer

Genera o rota el token del feed ICS (rotar revoca las suscripciones previas).

Path params

  • orgIdstringrequerido

Respuestas

  • 201
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/ics/rotate' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
DELETE/organizations/:orgId/agenda/ics
bearer

Desactiva el feed ICS (borra el token).

Path params

  • orgIdstringrequerido

Respuestas

  • 200
curl -X DELETE 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/ics' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/types
bearer

Lista los tipos de cita (servicios reservables).

Path params

  • orgIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/types' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/types
bearer

Crea un servicio (duración, márgenes, intervalo, precio, color, modalidad y quiénes lo atienden).

Path params

  • orgIdstringrequerido

Body (JSON)

  • namestringrequerido
  • durationMinnumberrequerido
  • staffUserIdstring · uuid

    Quién atiende (forma anterior a `staffUserIds`, un solo profesional).

  • descriptionstring
  • bufferMinnumber
  • bufferBeforeMinnumber
  • slotIntervalMinnumber
    510152030456090120

    Cada cuánto se ofrece un horario. null = duración + márgenes.

  • pricenumber
  • currencystring

    ISO 4217 (COP, USD…). null = la moneda de la organización.

  • colorstring
  • modalitystring
    PRESENCIALVIRTUALDOMICILIO
  • locationstring
  • meetingUrlstring · uri
  • categorystring
  • sortOrdernumber
  • capacitynumber

    Cupos por horario (1 = una cita a la vez). Más de 1 requiere agenda_avanzada.

  • anticipoTipostring
    PORCENTAJEFIJO

    Anticipo al reservar: PORCENTAJE del precio o valor FIJO (en la moneda del servicio; solo se cobra en COP). null = sin anticipo. Requiere agenda_avanzada.

  • anticipoValornumber
  • preguntasPreguntaDelServicioDto[]

    Formulario del servicio (máximo 8 preguntas). null o [] = sin formulario.

  • volverEnDiasnumber

    «Agenda tu próxima»: invitar a volver a los N días de atendida.

  • recursoIdstring · uuid

    Recurso compartido que ocupa cada cita (sala, silla). null = ninguno.

  • staffUserIdsstring[]

    Quiénes atienden (miembros de la org). Vacío = agenda general. Requiere la función de plan `agenda_avanzada`. Reemplaza la lista completa.

Respuestas

  • 201
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/types' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"name": "<name>","durationMin": 0,"staffUserId": "00000000-0000-0000-0000-000000000000","description": "<description>","bufferMin": 0,"bufferBeforeMin": 0,"slotIntervalMin": 5,"price": 0,"currency": "<currency>","color": "<color>","modality": "PRESENCIAL","location": "<location>","meetingUrl": "https://tu-app.com/endpoint","category": "<category>","sortOrder": 0,"capacity": 0,"anticipoTipo": "PORCENTAJE","anticipoValor": 0,"preguntas": [],"volverEnDias": 0,"recursoId": "00000000-0000-0000-0000-000000000000","staffUserIds": []}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
PATCH/organizations/:orgId/agenda/types/:id
bearer

Actualiza (o desactiva) un tipo de cita.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Body (JSON)

  • namestring
  • durationMinnumber
  • activeboolean
  • staffUserIdstring · uuid

    Quién atiende (forma anterior). `null` lo devuelve a la agenda general.

  • descriptionstring
  • bufferMinnumber
  • bufferBeforeMinnumber
  • slotIntervalMinnumber
    510152030456090120

    Cada cuánto se ofrece un horario. null = duración + márgenes.

  • pricenumber
  • currencystring

    ISO 4217 (COP, USD…). null = la moneda de la organización.

  • colorstring
  • modalitystring
    PRESENCIALVIRTUALDOMICILIO
  • locationstring
  • meetingUrlstring · uri
  • categorystring
  • sortOrdernumber
  • capacitynumber

    Cupos por horario (1 = una cita a la vez). Más de 1 requiere agenda_avanzada.

  • anticipoTipostring
    PORCENTAJEFIJO

    Anticipo al reservar: PORCENTAJE del precio o valor FIJO (en la moneda del servicio; solo se cobra en COP). null = sin anticipo. Requiere agenda_avanzada.

  • anticipoValornumber
  • preguntasPreguntaDelServicioDto[]

    Formulario del servicio (máximo 8 preguntas). null o [] = sin formulario.

  • volverEnDiasnumber

    «Agenda tu próxima»: invitar a volver a los N días de atendida.

  • recursoIdstring · uuid

    Recurso compartido que ocupa cada cita (sala, silla). null = ninguno.

  • staffUserIdsstring[]

    Quiénes atienden (miembros de la org). Vacío = agenda general. Requiere la función de plan `agenda_avanzada`. Reemplaza la lista completa.

Respuestas

  • 200
curl -X PATCH 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/types/00000000-0000-0000-0000-000000000000' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"name": "<name>","durationMin": 0,"active": true,"staffUserId": "00000000-0000-0000-0000-000000000000","description": "<description>","bufferMin": 0,"bufferBeforeMin": 0,"slotIntervalMin": 5,"price": 0,"currency": "<currency>","color": "<color>","modality": "PRESENCIAL","location": "<location>","meetingUrl": "https://tu-app.com/endpoint","category": "<category>","sortOrder": 0,"capacity": 0,"anticipoTipo": "PORCENTAJE","anticipoValor": 0,"preguntas": [],"volverEnDias": 0,"recursoId": "00000000-0000-0000-0000-000000000000","staffUserIds": []}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/contacts/:contactId/resumen
bearer

Historial resumido de citas de un contacto: atendidas, inasistencias, canceladas y la próxima.

Path params

  • orgIdstringrequerido
  • contactIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/contacts/00000000-0000-0000-0000-000000000000/resumen' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/recursos
bearer

Recursos compartidos (salas, sillas, equipos).

Path params

  • orgIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/recursos' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/recursos
bearer

Crea un recurso compartido: las citas que lo usan no pasan de su cantidad a la vez.

Path params

  • orgIdstringrequerido

Body (JSON)

  • nombrestringrequerido
  • cantidadnumber

Respuestas

  • 201
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/recursos' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"nombre": "<nombre>","cantidad": 0}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
PATCH/organizations/:orgId/agenda/recursos/:id
bearer

Cambia el nombre o la cantidad de un recurso.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Body (JSON)

  • nombrestring
  • cantidadnumber

Respuestas

  • 200
curl -X PATCH 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/recursos/00000000-0000-0000-0000-000000000000' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"nombre": "<nombre>","cantidad": 0}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
DELETE/organizations/:orgId/agenda/recursos/:id
bearer

Elimina un recurso (los servicios que lo usaban quedan sin recurso).

Path params

  • orgIdstringrequerido
  • idstringrequerido

Respuestas

  • 200
curl -X DELETE 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/recursos/00000000-0000-0000-0000-000000000000' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/paquetes
bearer

Paquetes de sesiones (de un contacto con ?contactId).

Path params

  • orgIdstringrequerido

Query params

  • contactIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/paquetes' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/paquetes
bearer

Carga un paquete de sesiones a un cliente. Sus citas lo usan solas y cada atendida (o no asistida) gasta una sesión.

Path params

  • orgIdstringrequerido

Body (JSON)

  • contactIdstring · uuidrequerido
  • appointmentTypeIdstring · uuid

    Para qué servicio sirve. Vacío = cualquiera.

  • nombrestringrequerido
  • sesionesnumberrequerido
  • usadasnumber

    Sesiones que ya usó (al cargar un paquete que venía de antes).

  • venceAtstring

Respuestas

  • 201
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/paquetes' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"contactId": "00000000-0000-0000-0000-000000000000","appointmentTypeId": "00000000-0000-0000-0000-000000000000","nombre": "<nombre>","sesiones": 0,"usadas": 0,"venceAt": "<venceAt>"}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
DELETE/organizations/:orgId/agenda/paquetes/:id
bearer

Anula un paquete de sesiones.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Respuestas

  • 200
curl -X DELETE 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/paquetes/00000000-0000-0000-0000-000000000000' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/reporte
bearer

Resumen de la agenda en un rango (por defecto, los últimos 30 días): citas, inasistencias, ingresos estimados, anticipos, origen, clientes nuevos y ocupación por profesional.

Path params

  • orgIdstringrequerido

Query params

  • desdestring
  • hastastring

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/reporte' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/lista-de-espera
bearer

Lista de espera (por defecto, esperando u ofrecida).

Path params

  • orgIdstringrequerido

Query params

  • estadostring
    ESPERANDOOFRECIDAAGENDADACANCELADAVENCIDA
  • contactIdstring

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/lista-de-espera' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/lista-de-espera
bearer

Anota a un cliente en la lista de espera de un servicio: si se libera un horario en ese rango, se le ofrece.

Path params

  • orgIdstringrequerido

Body (JSON)

  • contactIdstring · uuidrequerido
  • typeIdstring · uuidrequerido
  • staffUserIdstring · uuid

    Persona pedida. Vacío = con quien esté libre.

  • desdestringrequerido

    Rango de fechas en el que le sirve la cita.

  • hastastringrequerido
  • notasstring
  • conversationIdstring · uuid
  • phoneNumberIdstring · uuid

Respuestas

  • 201
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/lista-de-espera' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"contactId": "00000000-0000-0000-0000-000000000000","typeId": "00000000-0000-0000-0000-000000000000","staffUserId": "00000000-0000-0000-0000-000000000000","desde": "<desde>","hasta": "<hasta>","notas": "<notas>","conversationId": "00000000-0000-0000-0000-000000000000","phoneNumberId": "00000000-0000-0000-0000-000000000000"}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "Clientes activos",
    "description": "Contactos con interacción últimos 30 días"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
DELETE/organizations/:orgId/agenda/lista-de-espera/:id
bearer

Saca a alguien de la lista de espera.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Respuestas

  • 200
curl -X DELETE 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/lista-de-espera/00000000-0000-0000-0000-000000000000' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/preset
bearer

Configura la agenda con el ejemplo de un tipo de negocio (servicios, horario, festivos). No pisa lo existente.

Path params

  • orgIdstringrequerido

Body (JSON)

  • tipostringrequerido
    salonspaconsultorioasesoriaclases

Respuestas

  • 201
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/preset' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"tipo": "salon"}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/staff
bearer

Profesionales de la org (para agenda por profesional) + si ya tienen disponibilidad.

Path params

  • orgIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/staff' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/availability
bearer

Reglas semanales de disponibilidad (weekday + minutos locales de la org). `staffUserId` para agenda por profesional.

Path params

  • orgIdstringrequerido

Query params

  • staffUserIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/availability' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
PUT/organizations/:orgId/agenda/availability
bearer

Reemplaza el set completo de reglas semanales.

Path params

  • orgIdstringrequerido

Query params

  • staffUserIdstringrequerido

Body (JSON)

  • rulesAvailabilityRuleDto[]requerido

    Reemplaza TODAS las reglas de la agenda general (staffUserId null).

Respuestas

  • 200
curl -X PUT 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/availability' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"rules": []}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/exceptions
bearer

Días bloqueados (festivos, vacaciones).

Path params

  • orgIdstringrequerido

Query params

  • staffUserIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/exceptions' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/exceptions
bearer

Bloquea un día completo (YYYY-MM-DD local).

Path params

  • orgIdstringrequerido

Query params

  • staffUserIdstringrequerido

Body (JSON)

  • datestringrequerido

    Día local de la org, formato YYYY-MM-DD.

  • dateTostring

    Último día de un rango (vacaciones), inclusive. Vacío = solo `date`.

  • startMinutenumber

    Franja bloqueada en minutos locales (almuerzo 13:00-14:00 = 780-840). Sin ellos se bloquea el día completo.

  • endMinutenumber
  • reasonstring

Respuestas

  • 201
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/exceptions' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"date": "<date>","dateTo": "<dateTo>","startMinute": 0,"endMinute": 0,"reason": "<reason>"}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
DELETE/organizations/:orgId/agenda/exceptions/:id
bearer

Desbloquea un día.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Respuestas

  • 204
curl -X DELETE 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/exceptions/00000000-0000-0000-0000-000000000000' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/slots
bearer

Slots disponibles para un tipo de cita (TZ de la org; respeta antelación, excepciones y citas existentes).

Path params

  • orgIdstringrequerido

Query params

  • typeIdstringrequerido
  • fromstring

    Fecha/hora ISO desde la que buscar (default: ahora).

  • daysnumber

    Cuántos días explorar (default 7, tope maxAdvanceDays del settings).

  • staffUserIdstring

    Profesional cuya disponibilidad consultar. Vacío = agenda general.

  • seatsnumber

    Personas de la reserva (servicios con cupos). Default 1.

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/slots' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/appointments
bearer

Lista citas con filtros (rango, estado, contacto).

Path params

  • orgIdstringrequerido

Query params

  • fromstring
  • tostring
  • statusstring
    CONFIRMEDCANCELLEDNO_SHOWCOMPLETED
  • contactIdstring
  • staffUserIdstring

    Filtra por profesional. `general` = agenda general (staffUserId null).

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/appointments' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "createdAt": "2026-05-01T03:42:18.123Z"
    }
  ],
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/appointments
bearer

Reserva un slot exacto (de GET slots) para un contacto. 409 si el horario ya no está disponible.

Path params

  • orgIdstringrequerido

Body (JSON)

  • typeIdstring · uuidrequerido
  • contactIdstring · uuidrequerido
  • startAtstringrequerido

    Inicio exacto de un slot devuelto por GET slots (ISO).

  • conversationIdstring · uuid
  • phoneNumberIdstring · uuid
  • notesstring
  • staffUserIdstring · uuid

    Profesional con el que se reserva. Vacío = agenda general.

  • seatsnumber

    Personas de la reserva (servicios con cupos). Default 1.

  • cobrarAnticipoboolean

    Cobrar el anticipo del servicio (desde el panel hay que pedirlo; el bot y la página lo cobran solos cuando el servicio lo tiene).

  • respuestasobject

    Respuestas al formulario del servicio, por id de pregunta.

  • direccionstring

    Dirección del cliente (servicios a domicilio).

  • sinPaqueteboolean

    No usar el paquete de sesiones del cliente aunque tenga uno vigente.

  • repetirany

    Cita recurrente: cada `cadaDias` días, `veces` citas en total.

  • meetingUrlstring · uri

    Enlace de la reunión (Meet, Zoom, Teams…), pegado a mano.

  • inviteEmailstring · email

    Correo del cliente para mandarle la invitación.

  • pedirCorreoboolean

    Sin correo: pedírselo al cliente por el chat para mandarle la invitación.

Respuestas

  • 201
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/appointments' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"typeId": "00000000-0000-0000-0000-000000000000","contactId": "00000000-0000-0000-0000-000000000000","startAt": "<startAt>","conversationId": "00000000-0000-0000-0000-000000000000","phoneNumberId": "00000000-0000-0000-0000-000000000000","notes": "<notes>","staffUserId": "00000000-0000-0000-0000-000000000000","seats": 0,"cobrarAnticipo": true,"respuestas": {},"direccion": "<direccion>","sinPaquete": true,"repetir": "<repetir>","meetingUrl": "https://tu-app.com/endpoint","inviteEmail": "persona@empresa.com","pedirCorreo": true}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
PATCH/organizations/:orgId/agenda/appointments/:id/cancel
bearer

Cancela una cita confirmada.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Body (JSON)

  • reasonstring
  • serieboolean

    Cancelar también las que siguen de la serie (citas recurrentes).

Respuestas

  • 200
curl -X PATCH 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/appointments/00000000-0000-0000-0000-000000000000/cancel' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"reason": "<reason>","serie": true}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
PATCH/organizations/:orgId/agenda/appointments/:id/reschedule
bearer

Reprograma una cita confirmada a un nuevo horario disponible.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Body (JSON)

  • startAtstringrequerido

    Nuevo inicio (ISO); debe ser un slot disponible del mismo tipo de cita.

Respuestas

  • 200
curl -X PATCH 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/appointments/00000000-0000-0000-0000-000000000000/reschedule' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"startAt": "<startAt>"}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
PATCH/organizations/:orgId/agenda/appointments/:id
bearer

Completa una cita: enlace de la reunión, correo de la invitación o notas. Si cambia el enlace o el correo, se le reenvía la invitación al cliente.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Body (JSON)

  • meetingUrlstring · uri

    Enlace de la reunión. Cadena vacía = quitarlo.

  • inviteEmailstring · email

    Correo de la invitación. Cadena vacía = quitarlo.

  • notesstring

Respuestas

  • 200
curl -X PATCH 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/appointments/00000000-0000-0000-0000-000000000000' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"meetingUrl": "https://tu-app.com/endpoint","inviteEmail": "persona@empresa.com","notes": "<notes>"}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
POST/organizations/:orgId/agenda/appointments/:id/pedir-correo
bearer

Le pide al cliente por WhatsApp el correo para mandarle la invitación. El correo que escriba se guarda solo en la cita.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Respuestas

  • 200
curl -X POST 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/appointments/00000000-0000-0000-0000-000000000000/pedir-correo' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
GET/organizations/:orgId/agenda/counts
bearer

Contador de la agenda: citas agendadas que no han terminado, cuántas son hoy y la próxima.

Path params

  • orgIdstringrequerido

Respuestas

  • 200
curl -X GET 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/counts' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "createdAt": "2026-05-01T03:42:18.123Z"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}
PATCH/organizations/:orgId/agenda/appointments/:id/status
bearer

Marca una cita como COMPLETED o NO_SHOW.

Path params

  • orgIdstringrequerido
  • idstringrequerido

Body (JSON)

  • statusstringrequerido
    NO_SHOWCOMPLETED

Respuestas

  • 200
curl -X PATCH 'https://api.mosend.dev/organizations/a1b2c3d4-1234-5678-9abc-def012345678/agenda/appointments/00000000-0000-0000-0000-000000000000/status' \
  -H 'X-Api-Key: mk_live_<prefix>.<secret>' \
  -H 'Content-Type: application/json' \
  -d '{"status": "NO_SHOW"}'
Response · 200
{
  "data": {
    "id": "00000000-0000-0000-0000-000000000000",
    "name": "string",
    "description": "string"
  },
  "timestamp": "2026-05-01T03:42:18.123Z"
}