{"success":true,"name":"integracorp-api","version":"1.0.0","description":"API Integracorp unificada: métricas, mensajería, listados y Portal del Paciente (login cédula+clave, historia clínica onboarding).","auth":{"public":"Sin cabeceras. Health, login paciente (cédula + password) y documentación estática (/docs/*).","apiKey":"Header X-API-Key: <INTEGRACORP_API_KEY> (también acepta Authorization: ApiKey <key>).","jwt":"Header Authorization: Bearer <token> obtenido en POST /api/auth/login con nro_identificacion + password."},"conventions":{"pagination":{"param":"page","default":1,"pageSize":10,"note":"El tamaño de página (limit) es fijo en 10; no es configurable por query."},"successShape":"{ success: true, data, ...meta }","errorShape":"{ success: false, error, reason?, details?, requestId? }"},"docs":{"html":"/docs/endpoints.html","portal":"/docs/index.html","openapi":"/docs/openapi.json","catalogJson":"/docs/api-catalog.json"},"count":63,"data":[{"categoria":"Salud","nombre":"Estado de la API","metodo":"GET","ruta":"/api/health","descripcion":"Comprueba que el proceso Node esté activo. Ideal para monitoreo y load balancers.","paginado":false,"calculaEdad":false,"auth":"public"},{"categoria":"Salud","nombre":"Conexión a la base de datos","metodo":"GET","ruta":"/api/health/db","descripcion":"Hace un ping a MySQL y reporta si el pool responde (incluye latencia cuando aplica).","paginado":false,"calculaEdad":false,"auth":"public"},{"categoria":"Documentación","nombre":"Catálogo de endpoints","metodo":"GET","ruta":"/api/endpoints","descripcion":"Lista en JSON todos los endpoints con nombres legibles, categoría, auth y metadatos. Requiere API Key.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Dashboard Venezuela por estado","metodo":"GET","ruta":"/api/metrics/dashboard/venezuela-by-state","descripcion":"KPIs geográficos de Venezuela agrupados por estado para el panel de métricas.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"KPIs agentes de corretaje","metodo":"GET","ruta":"/api/metrics/corretaje/agents","descripcion":"Indicadores agregados de agentes de corretaje.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Agentes activos por estado","metodo":"GET","ruta":"/api/metrics/corretaje/agents/by-state","descripcion":"Distribución de agentes activos por estado geográfico.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Agentes por afiliaciones activas","metodo":"GET","ruta":"/api/metrics/corretaje/agents/by-active-affiliations","descripcion":"Ranking o desglose de agentes según cantidad de afiliaciones activas.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Monto US$ de afiliaciones activas por agente","metodo":"GET","ruta":"/api/metrics/corretaje/agents/by-active-affiliation-amount","descripcion":"Monto en dólares de afiliaciones activas agrupado por agente.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Tendencia de ventas US$ por estado (agentes)","metodo":"GET","ruta":"/api/metrics/corretaje/agents/sales-by-state","descripcion":"Ventas en US$ de agentes desglosadas por estado.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Captación agentes mes actual vs mes pasado","metodo":"GET","ruta":"/api/metrics/corretaje/agents/registration-comparison","descripcion":"Compara altas de agentes del mes actual contra el mes anterior.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"KPIs agencias de corretaje","metodo":"GET","ruta":"/api/metrics/corretaje/agencies","descripcion":"Indicadores agregados de agencias de corretaje.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Captación agencias mes actual vs mes pasado","metodo":"GET","ruta":"/api/metrics/corretaje/agencies/registration-comparison","descripcion":"Compara altas de agencias del mes actual contra el mes anterior.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Agencias activas MASTER/GENERAL por estado","metodo":"GET","ruta":"/api/metrics/corretaje/agencies/by-state","descripcion":"Agencias activas (tipos MASTER/GENERAL) agrupadas por estado.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones activas directas por tipo de agencia","metodo":"GET","ruta":"/api/metrics/corretaje/agencies/by-active-affiliations","descripcion":"Afiliaciones individuales activas directas según tipo de agencia.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Detalle afiliaciones activas por agencia (tipo)","metodo":"GET","ruta":"/api/metrics/corretaje/agencies/by-active-affiliations/by-agency","descripcion":"Detalle por agencia de afiliaciones individuales activas.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones corporativas activas directas por tipo de agencia","metodo":"GET","ruta":"/api/metrics/corretaje/agencies/by-active-corporate-affiliations","descripcion":"Afiliaciones corporativas activas directas según tipo de agencia.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Detalle afiliaciones corporativas activas por agencia (tipo)","metodo":"GET","ruta":"/api/metrics/corretaje/agencies/by-active-corporate-affiliations/by-agency","descripcion":"Detalle por agencia de afiliaciones corporativas activas.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Monto US$ afiliaciones individuales y corporativas por agencia","metodo":"GET","ruta":"/api/metrics/corretaje/agencies/by-active-affiliation-amount","descripcion":"Monto en US$ de afiliaciones (individuales + corporativas) por agencia.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Cotizaciones creadas/ejecutadas/anuladas mes actual vs mes pasado","metodo":"GET","ruta":"/api/metrics/cotizaciones/status-comparison","descripcion":"Compara cotizaciones por estado (creadas, ejecutadas, anuladas) mes vs mes.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Ventas Administración USD/VES mes actual vs mes pasado","metodo":"GET","ruta":"/api/metrics/administracion/sales-comparison","descripcion":"Suma de ventas del mes (USD total_amount y VES pay_amount_ves) vs mes pasado, con serie mensual del año en curso.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Cotizaciones por agente (total vs ejecutadas con afiliación)","metodo":"GET","ruta":"/api/metrics/cotizaciones/by-agent","descripcion":"Cotizaciones totales vs ejecutadas con afiliación, agrupadas por agente.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Cotizaciones por agencia MASTER/GENERAL (total vs ejecutadas con afiliación)","metodo":"GET","ruta":"/api/metrics/cotizaciones/by-agency","descripcion":"Cotizaciones totales vs ejecutadas con afiliación, agrupadas por agencia.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones por estado (comparación)","metodo":"GET","ruta":"/api/metrics/afiliaciones/status-comparison","descripcion":"Compara afiliaciones según su estado (activas, pendientes, etc.).","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones por mes","metodo":"GET","ruta":"/api/metrics/afiliaciones/by-month","descripcion":"Serie temporal de afiliaciones agregadas por mes.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones por día","metodo":"GET","ruta":"/api/metrics/afiliaciones/by-day","descripcion":"Serie temporal de afiliaciones agregadas por día.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones por plan y mes","metodo":"GET","ruta":"/api/metrics/afiliaciones/by-plan-month","descripcion":"Afiliaciones desglosadas por plan de salud y mes.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones por plan y monto","metodo":"GET","ruta":"/api/metrics/afiliaciones/by-plan-amount","descripcion":"Montos asociados a afiliaciones agrupados por plan.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones por plan y monto (combinado)","metodo":"GET","ruta":"/api/metrics/afiliaciones/by-plan-amount-combined","descripcion":"Vista combinada de planes con montos de afiliación.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Métricas","nombre":"Afiliaciones por estado geográfico","metodo":"GET","ruta":"/api/metrics/afiliaciones/by-state","descripcion":"Distribución de afiliaciones por estado de Venezuela.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Correos","nombre":"Envío masivo de correos","metodo":"POST","ruta":"/api/emails/bulk","descripcion":"Campañas por correo (multipart): recipients + copy y/o image. Soporta logo, subject y dry_run.","contentType":"multipart/form-data","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Mensajería","nombre":"Estado WhatsApp (Ultramsg)","metodo":"GET","ruta":"/api/notifications/whatsapp/status","descripcion":"Indica si la instancia Ultramsg está autenticada y el tamaño de la cola interna.","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Mensajería","nombre":"Envío masivo WhatsApp por lote","metodo":"POST","ruta":"/api/notifications/mass/send-batch","descripcion":"Encola hasta 50 teléfonos por solicitud. Responde 202 Accepted y envía con pausa anti-ban.","contentType":"application/json","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Mensajería","nombre":"Envío unitario WhatsApp","metodo":"POST","ruta":"/api/notifications/mass/send","descripcion":"Envía un WhatsApp inmediato a un teléfono (compatibilidad con marketing).","contentType":"application/json","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Mensajería","nombre":"Prueba WhatsApp (cumpleaños / eventos)","metodo":"POST","ruta":"/api/notifications/birthday/test","descripcion":"Envío individual para pruebas de cumpleaños o invitaciones a eventos.","contentType":"application/json","paginado":false,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Recursos","nombre":"Afiliados","metodo":"GET","ruta":"/api/affiliates","tabla":"affiliates","descripcion":"Listado paginado de afiliados. Incluye age calculado desde birth_date (DD/MM/YYYY).","query":{"page":1},"paginado":true,"calculaEdad":true,"campoFechaEdad":"birth_date","formatoFechaEdad":"DD/MM/YYYY","auth":"apiKey"},{"categoria":"Recursos","nombre":"Afiliados corporativos","metodo":"GET","ruta":"/api/affiliate-corporates","tabla":"affiliate_corporates","descripcion":"Listado paginado de afiliados corporativos. Incluye age desde birth_date (DD/MM/YYYY).","query":{"page":1},"paginado":true,"calculaEdad":true,"campoFechaEdad":"birth_date","formatoFechaEdad":"DD/MM/YYYY","auth":"apiKey"},{"categoria":"Recursos","nombre":"Agencias","metodo":"GET","ruta":"/api/agencies","tabla":"agencies","descripcion":"Listado paginado de agencias de corretaje.","query":{"page":1},"paginado":true,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Recursos","nombre":"Agentes","metodo":"GET","ruta":"/api/agents","tabla":"agents","descripcion":"Listado paginado de agentes. Incluye age desde birth_date (YYYY-MM-DD).","query":{"page":1},"paginado":true,"calculaEdad":true,"campoFechaEdad":"birth_date","formatoFechaEdad":"YYYY-MM-DD","auth":"apiKey"},{"categoria":"Recursos","nombre":"Colaboradores RRHH","metodo":"GET","ruta":"/api/rrhh-colaboradores","tabla":"rrhh_colaboradors","descripcion":"Listado paginado de colaboradores. Incluye age desde fechaNacimiento (DD/MM/YYYY).","query":{"page":1},"paginado":true,"calculaEdad":true,"campoFechaEdad":"fechaNacimiento","formatoFechaEdad":"DD/MM/YYYY","auth":"apiKey"},{"categoria":"Recursos","nombre":"Médicos de telemedicina","metodo":"GET","ruta":"/api/telemedicine-doctors","tabla":"telemedicine_doctors","descripcion":"Listado paginado de médicos de telemedicina (incluye datos del proveedor relacionado).","query":{"page":1},"paginado":true,"calculaEdad":false,"notas":"Incluye join con proveedor","auth":"apiKey"},{"categoria":"Recursos","nombre":"Proveedores","metodo":"GET","ruta":"/api/suppliers","tabla":"suppliers","descripcion":"Listado paginado de proveedores.","query":{"page":1},"paginado":true,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Recursos","nombre":"Médicos y enfermeras","metodo":"GET","ruta":"/api/doctor-nurses","tabla":"doctor_nurses","descripcion":"Listado paginado de médicos y enfermeras.","query":{"page":1},"paginado":true,"calculaEdad":false,"auth":"apiKey"},{"categoria":"Recursos","nombre":"Agencias de viajes","metodo":"GET","ruta":"/api/travel-agencies","tabla":"travel_agencies","descripcion":"Listado paginado de agencias de viaje. Incluye age del representante (FechaNacimientoRepresentante, DD/MM/YYYY).","query":{"page":1},"paginado":true,"calculaEdad":true,"campoFechaEdad":"FechaNacimientoRepresentante","formatoFechaEdad":"DD/MM/YYYY","auth":"apiKey"},{"categoria":"Recursos","nombre":"Agentes de viajes","metodo":"GET","ruta":"/api/travel-agents","tabla":"travel_agents","descripcion":"Listado paginado de agentes de viaje. Incluye age desde fechaNacimiento (YYYY-MM-DD).","query":{"page":1},"paginado":true,"calculaEdad":true,"campoFechaEdad":"fechaNacimiento","formatoFechaEdad":"YYYY-MM-DD","auth":"apiKey"},{"categoria":"Portal Paciente · Auth","nombre":"Login paciente","metodo":"POST","ruta":"/api/auth/login","auth":"public","descripcion":"Inicia sesión con cédula (nro_identificacion) y clave del portal (password / patient_portal_password en texto plano). Requiere patient_portal_authorized=1; si no, 403. Devuelve un JWT. Rate limit estricto.","contentType":"application/json","body":{"nro_identificacion":"V-12345678","password":"clave-del-portal"}},{"categoria":"Portal Paciente · Auth","nombre":"Usuario actual","metodo":"GET","ruta":"/api/auth/me","auth":"jwt","descripcion":"Devuelve el paciente asociado al token Bearer actual."},{"categoria":"Portal Paciente · Auth","nombre":"Logout","metodo":"POST","ruta":"/api/auth/logout","auth":"jwt","descripcion":"Confirma el cierre de sesión. El cliente debe borrar el token localmente."},{"categoria":"Portal Paciente · Perfil","nombre":"Mi perfil","metodo":"GET","ruta":"/api/me/profile","auth":"jwt","descripcion":"Datos personales y de afiliación del paciente. Cache-Control privado (~60s)."},{"categoria":"Portal Paciente · Historia clínica","nombre":"Antecedentes","metodo":"GET","ruta":"/api/clinical-history","auth":"jwt","descripcion":"Último registro de antecedentes / historia clínica del paciente."},{"categoria":"Portal Paciente · Historia clínica","nombre":"Registrar historia (onboarding)","metodo":"POST","ruta":"/api/clinical-history","auth":"jwt","descripcion":"Alta inicial de historia clínica desde el wizard del portal. Responde 409 si ya existe un registro. El telemedicine_patient_id se toma del JWT.","contentType":"application/json","body":{"no_allergies":true,"allergies":"Ninguna conocida","history_surgical":"Ninguna","tabaco":false,"alcohol":false}},{"categoria":"Portal Paciente · Historia clínica","nombre":"Descargar PDF","metodo":"GET","ruta":"/api/clinical-history/pdf","auth":"jwt","descripcion":"Descarga el PDF de la historia clínica del paciente autenticado.","notas":"Respuesta binaria (application/pdf)"},{"categoria":"Portal Paciente · Documentos","nombre":"Listado de documentos","metodo":"GET","ruta":"/api/documents","auth":"jwt","descripcion":"Casos, documentos generales y resumen para la pantalla Documentos."},{"categoria":"Portal Paciente · Documentos","nombre":"Lista de casos","metodo":"GET","ruta":"/api/cases","auth":"jwt","descripcion":"Lista liviana de casos (útil para elegir a cuál subir un archivo)."},{"categoria":"Portal Paciente · Documentos","nombre":"Subir documento","metodo":"POST","ruta":"/api/documents","auth":"jwt","descripcion":"Sube un archivo (multipart). Campos: document_file, document_name, upload_reason, telemedicine_case_id (opcional).","contentType":"multipart/form-data"},{"categoria":"Portal Paciente · Documentos","nombre":"Descargar documento","metodo":"GET","ruta":"/api/documents/:source/:id/download","auth":"jwt","descripcion":"Descarga un archivo solo si pertenece al paciente de la sesión.","notas":"Respuesta binaria"},{"categoria":"Portal Paciente · Citas","nombre":"Listar citas operativas","metodo":"GET","ruta":"/api/appointments","auth":"jwt","descripcion":"Citas médicas agendadas por Operaciones TDG (operation_medical_appointments). Solo lectura; filtradas por el paciente del JWT (SCHEDULED / RESCHEDULED).","tabla":"operation_medical_appointments, operation_service_orders, suppliers, telemedicine_cases"},{"categoria":"Portal Paciente · Citas","nombre":"Enviar orden de servicio por WhatsApp","metodo":"POST","ruta":"/api/appointments/:id/service-order/whatsapp","auth":"jwt","descripcion":"Envía por Ultramsg el PDF de la OS de Integracorp. Si falta service_order_pdf_path, lo regenera. Body opcional: { phone }. Sin phone usa el del paciente.","contentType":"application/json","body":{"phone":"04141234567"}},{"categoria":"Portal Paciente · Recordatorios","nombre":"Listar recordatorios","metodo":"GET","ruta":"/api/reminders","auth":"jwt","descripcion":"Lista recordatorios crónicos, específicos, citas e historial de notificaciones."},{"categoria":"Portal Paciente · Recordatorios","nombre":"Crear recordatorio","metodo":"POST","ruta":"/api/reminders","auth":"jwt","descripcion":"Crea un aviso de medicación, tratamiento o cita.","contentType":"application/json"},{"categoria":"Portal Paciente · Recordatorios","nombre":"Actualizar recordatorio","metodo":"PUT","ruta":"/api/reminders/:id","auth":"jwt","descripcion":"Reemplaza los datos de un recordatorio existente.","contentType":"application/json"},{"categoria":"Portal Paciente · Recordatorios","nombre":"Activar/pausar","metodo":"PATCH","ruta":"/api/reminders/:id/toggle","auth":"jwt","descripcion":"Activa o pausa un recordatorio sin eliminarlo."},{"categoria":"Portal Paciente · Recordatorios","nombre":"Eliminar recordatorio","metodo":"DELETE","ruta":"/api/reminders/:id","auth":"jwt","descripcion":"Elimina un recordatorio de forma permanente."},{"categoria":"Portal Paciente · Ayuda","nombre":"Contactos operaciones","metodo":"GET","ruta":"/api/help/contacts","auth":"jwt","descripcion":"Contactos de operaciones y enlaces rápidos a WhatsApp. Caché en memoria (~120s)."}]}