PANA Login API

Documentación completa para consumir la API de PANA Login. Esta API permite automatizar el proceso de login y obtener el PHPSESSID necesario para mantener sesiones activas en el sistema PANA.

Bienvenido a PANA Login API

Esta API permite automatizar el proceso de login en el sistema PANA y obtener información de usuarios. Utiliza Puppeteer para automatizar el navegador y mantener sesiones activas.

Navega por los endpoints en el menú lateral izquierdo o usa el roadmap en el lado derecho para acceder rápidamente a cada sección.

📊 Endpoints de Información

Endpoints para consultar, leer y obtener datos del sistema.

GET /api/phpsessid GET /api/logs GET /api/status GET /api/browser/status GET /api/captcha/status POST /api/username POST /api/cita-medica POST /api/cita-odontologica POST /api/citas-agendadas GET /api/screenshot

⚙️ Endpoints de Sistemas

Endpoints para realizar acciones, operaciones y gestionar el sistema.

POST /api/login GET /api/login DELETE /api/phpsessid POST /api/browser/close POST /api/captcha POST /api/cancelar-cita
Volver al inicio

POST /api/login

POST /api/login

Realiza el proceso de login automatizado en PANA y obtiene el PHPSESSID. El proceso utiliza Puppeteer para automatizar el navegador, realizar el login con las credenciales proporcionadas, y extraer la cookie de sesión. El navegador permanece abierto después del login exitoso para permitir operaciones posteriores.

Request
POST /api/login
Content-Type: application/json

{
  "username": "sc366368",
  "password": "12345678Sa.",
  "headless": true
}
Response (Success)
{
  "success": true,
  "phpsessid": "abc123def456...",
  "message": "Login exitoso",
  "logs": [...]
}

Probar Endpoint

Response
Volver al inicio

GET /api/login

GET /api/login

Versión simplificada del endpoint de login que utiliza credenciales por defecto. Útil para pruebas rápidas sin necesidad de especificar usuario y contraseña en cada request.

Request
GET /api/login
Response (Success)
{
  "success": true,
  "phpsessid": "abc123def456...",
  "message": "Login exitoso",
  "logs": [...]
}

Probar Endpoint

Response
Volver al inicio

GET /api/phpsessid

GET /api/phpsessid

Obtiene el PHPSESSID guardado del último login exitoso. El PHPSESSID se almacena automáticamente después de cada login exitoso y puede ser consultado en cualquier momento sin necesidad de realizar un nuevo login.

Request
GET /api/phpsessid
Response (Success)
{
  "success": true,
  "phpsessid": "abc123def456...",
  "timestamp": "2026-02-09T16:00:00.000Z",
  "username": "sc366368",
  "message": "PHPSESSID encontrado"
}
Response (Not Found)
{
  "success": false,
  "message": "No hay PHPSESSID guardado...",
  "phpsessid": null
}

Probar Endpoint

Response
Volver al inicio

DELETE /api/phpsessid

DELETE /api/phpsessid

Elimina el PHPSESSID guardado del sistema.

Request
DELETE /api/phpsessid
Response (Success)
{
  "success": true,
  "message": "PHPSESSID eliminado correctamente"
}

Probar Endpoint

Response
Volver al inicio

GET /api/screenshot

GET /api/screenshot

Toma una captura de pantalla del navegador para ver el estado actual de la sesión.

Request
GET /api/screenshot
Response (Success)
{
  "success": true,
  "screenshot": "data:image/png;base64,...",
  "currentUrl": "https://10.150.201.61/pana/index.php",
  "pageTitle": "PANA",
  "timestamp": "2026-02-09T16:00:00.000Z"
}

Probar Endpoint

Response
Volver al inicio

GET /api/browser/status

GET /api/browser/status

Obtiene el estado actual del navegador (abierto/cerrado, número de páginas, URLs).

Request
GET /api/browser/status
Response (Success)
{
  "browserOpen": true,
  "pagesCount": 1,
  "pages": [
    {
      "index": 0,
      "url": "https://10.150.201.61/pana/index.php"
    }
  ]
}

Probar Endpoint

Response
Volver al inicio

POST /api/browser/close

POST /api/browser/close

Cierra el navegador manualmente.

Request
POST /api/browser/close
Response (Success)
{
  "success": true,
  "message": "Navegador cerrado correctamente"
}

Probar Endpoint

Response
Volver al inicio

GET /api/logs

GET /api/logs

Obtiene los logs del último proceso de login o screenshot.

Request
GET /api/logs
Response (Success)
{
  "logs": [
    {
      "timestamp": "2026-02-09T16:00:00.000Z",
      "type": "info",
      "message": "🚀 Iniciando automatización de PANA..."
    }
  ]
}

Probar Endpoint

Response
Volver al inicio

POST /api/captcha

POST /api/captcha

Envía el valor del captcha cuando aparece durante el proceso de login. El sistema detecta automáticamente cuando aparece un captcha, toma un screenshot automáticamente y espera a que se envíe el valor a través de este endpoint. El navegador ingresará automáticamente el captcha en el formulario. Usa GET /api/captcha/status para ver el screenshot del captcha.

Request
POST /api/captcha
Content-Type: application/json

{
  "captcha": "ABC123"
}
Response (Success)
{
  "success": true,
  "message": "Captcha enviado correctamente",
  "captcha": "ABC123"
}
Response (Error)
{
  "success": false,
  "error": "No hay un proceso de login esperando captcha",
  "message": "No hay un proceso de login esperando captcha"
}

Probar Endpoint

Response
Volver al inicio

GET /api/captcha/status

GET /api/captcha/status

Verifica si el sistema está esperando un captcha durante el proceso de login. Cuando se detecta un captcha, automáticamente se toma un screenshot que se muestra aquí para que puedas verlo y escribir el valor.

Request
GET /api/captcha/status
Response (con captcha esperando)
{
  "waiting": true,
  "hasScreenshot": true,
  "screenshot": "iVBORw0KGgoAAAANSUhEUgAA...",
  "message": "El sistema está esperando un captcha..."
}
Response (sin captcha)
{
  "waiting": false,
  "hasScreenshot": false,
  "message": "No hay proceso esperando captcha"
}

Probar Endpoint

Response
Volver al inicio

POST /api/username

POST /api/username

Obtiene la información completa de un usuario a partir de su cédula. Utiliza el PHPSESSID guardado o uno proporcionado para realizar la consulta al sistema PANA. La respuesta del servidor (script JavaScript) se parsea automáticamente y se devuelve como JSON estructurado.

Request
POST /api/username
Content-Type: application/json

{
  "cedula": "1234567890",
  "phpsessid": "abc123def456..." // Opcional, usa el guardado si no se proporciona
}
Response (Success)
{
  "success": true,
  "cedula": "1234567890",
  "datacodigo": "SC366368",
    "cedula": "1001031330",
    "nombreCompleto": "BRAYAN STYVEN USUGA BARTOLO",
    "nombre1": "BRAYAN STYVEN",
    "apellido1": "USUGA",
    "apellido2": "BARTOLO",
    "telefono": "3043840089",
    "celular": "3043840089",
    "direccion": "L 9 SURB 79C 115",
    "fechaNacimiento": "2000-07-14",
    "nombrePlan": "CONTRIBUTIVO",
    "nombreSede": "SALUD DARIEN IPS SA APARTADO",
    "raw": { /* Todos los campos originales */ }
  },
  "statusCode": 200,
  "message": "Información de usuario obtenida exitosamente"
}
Response (Error - Usuario no encontrado)
{
  "success": false,
  "cedula": "1234567890",
  "error": "Usuario no encontrado",
  "message": "No se encontró información del usuario...",
  "data": { /* Datos parseados (nombreCompleto vacío) */ },
  "statusCode": 404
}
Response (Error - Sin PHPSESSID)
{
  "success": false,
  "error": "No hay PHPSESSID disponible",
  "message": "Debes realizar un login primero..."
}

Probar Endpoint

Response
Volver al inicio

POST /api/cita-medica

POST /api/cita-medica

Consulta las fechas disponibles de citas médicas para un usuario. Primero obtiene la información del usuario (incluyendo su sede) y luego consulta las citas disponibles en un rango de fechas (desde la fecha proporcionada hasta un mes después).

Request
POST /api/cita-medica
Content-Type: application/json

{
  "cedula": "1001025341",
  "fecha": "2026-02-01",
  "phpsessid": "abc123def456..." // Opcional, usa el guardado si no se proporciona
}
Response (Success)
{
  "success": true,
  "cedula": "1001025341",
  "phpsessid": "abc123...",
  "fecha": "2026-02-01",
  "fechaEnd": "2026-03-01",
  "codigoSede": "366",
  "nombreSede": "SALUD DARIEN IPS SA APARTADO",
  "citas": { /* JSON con fechas disponibles */ },
  "statusCode": 200,
  "message": "Citas consultadas exitosamente"
}
Response (Error - Sin PHPSESSID)
{
  "success": false,
  "cedula": "1001025341",
  "fecha": "2026-02-01",
  "phpsessid": null,
  "error": "No hay PHPSESSID disponible",
  "message": "Debes realizar un login primero..."
}
Response (Error - Sede no encontrada)
{
  "success": false,
  "cedula": "1001025341",
  "fecha": "2026-02-01",
  "phpsessid": "abc123...",
  "error": "Sede no encontrada",
  "message": "No se pudo encontrar el código de sede...",
  "nombreSede": "Nombre de la sede del usuario"
}

Probar Endpoint

Response
Volver al inicio

POST /api/cita-odontologica

POST /api/cita-odontologica

Consulta las fechas disponibles de citas odontológicas para un usuario. Primero obtiene la información del usuario (incluyendo su sede) y luego consulta las citas odontológicas disponibles en un rango de fechas (desde la fecha proporcionada hasta un mes después).

Request
POST /api/cita-odontologica
Content-Type: application/json

{
  "cedula": "1001025341",
  "fecha": "2026-02-01",
  "phpsessid": "abc123def456..." // Opcional, usa el guardado si no se proporciona
}
Response (Success)
{
  "success": true,
  "cedula": "1001025341",
  "phpsessid": "abc123...",
  "fecha": "2026-02-01",
  "fechaEnd": "2026-03-01",
  "codigoSede": "366",
  "nombreSede": "SALUD DARIEN IPS SA APARTADO",
  "citas": { /* JSON con fechas disponibles */ },
  "statusCode": 200,
  "message": "Citas odontológicas consultadas exitosamente"
}
Response (Error - Sin PHPSESSID)
{
  "success": false,
  "cedula": "1001025341",
  "fecha": "2026-02-01",
  "phpsessid": null,
  "error": "No hay PHPSESSID disponible",
  "message": "Debes realizar un login primero..."
}
Response (Error - Sede no encontrada)
{
  "success": false,
  "cedula": "1001025341",
  "fecha": "2026-02-01",
  "phpsessid": "abc123...",
  "error": "Sede no encontrada",
  "message": "No se pudo encontrar el código de sede...",
  "nombreSede": "Nombre de la sede del usuario"
}

Probar Endpoint

Response
Volver al inicio

POST /api/citas-agendadas

POST /api/citas-agendadas

Consulta las citas agendadas de un usuario. Primero obtiene el código de usuario (ccodigo_usr) mediante el endpoint de username, y luego consulta todas las citas agendadas. El endpoint filtra automáticamente las citas para mostrar solo aquellas que tienen fecha futura (comparando con la hora actual de Bogotá, UTC-5) y que tienen estado "AUTORIZADO".

Request
POST /api/citas-agendadas
Content-Type: application/json

{
  "cedula": "1001025341",
  "phpsessid": "abc123def456..." // Opcional, usa el guardado si no se proporciona
}
Response (Success)
{
  "success": true,
  "cedula": "1001025341",
  "phpsessid": "abc123...",
  "ccodigo_usr": "12345",
  "totalCitas": 20,
  "citasFuturasAutorizadas": 3,
  "citas": [
    {
      "codcit": "7128979233",
      "pacien": "1001025341 - LUIS FELIPE TERAN MERCADO",
      "med": "PAULA ESTER ESPINOSA RIVERA",
      "esp": "ODONTOLOGIA",
      "purp": "Consulta/Procedimiento Odontologia",
      "fecha": "2026-02-23 12:00:00",
      "cons": "3333",
      "est": "AUTORIZADO",
      "btns": "<button...>...</button>"
    }
  ],
  "statusCode": 200,
  "message": "Citas agendadas consultadas exitosamente"
}
Response (Error - Sin PHPSESSID)
{
  "success": false,
  "cedula": "1001025341",
  "phpsessid": null,
  "error": "No hay PHPSESSID disponible",
  "message": "Debes realizar un login primero o proporcionar un PHPSESSID válido"
}
Parámetros
Parámetro Tipo Requerido Descripción
cedula string Cédula del usuario para consultar sus citas agendadas
phpsessid string No Cookie de sesión PHPSESSID. Si no se proporciona, se usa la guardada en la API
Notas
  • El endpoint filtra automáticamente las citas para mostrar solo las que tienen fecha futura (comparando con la hora actual de Bogotá, UTC-5)
  • Solo se muestran las citas con estado "AUTORIZADO"
  • El campo totalCitas muestra el total de citas encontradas (sin filtrar)
  • El campo citasFuturasAutorizadas muestra cuántas citas cumplen los criterios de filtrado

Probar Endpoint

Response
Volver al inicio

POST /api/cancelar-cita

POST /api/cancelar-cita

Cancela una cita agendada utilizando su código de cita (codcit). El endpoint realiza la cancelación en el sistema PANA y retorna el resultado de la operación. La justificación de cancelación incluye automáticamente la fecha y hora actual de Bogotá (UTC-5).

Request
POST /api/cancelar-cita
Content-Type: application/json

{
  "codcit": "7128979233",
  "phpsessid": "abc123def456..." // Opcional, usa el guardado si no se proporciona
}
Response (Success)
{
  "success": true,
  "codcit": "7128979233",
  "phpsessid": "abc123...",
  "fechaCancelacion": "2026-02-09 19:30:45",
  "mensaje": "Se canceló correctamente la cita. Código de cancelación: 7020727729.",
  "codigoCancelacion": "7020727729",
  "data": {
    "data": true,
    "msj": "Se canceló correctamente la cita. Código de cancelación: 7020727729."
  },
  "statusCode": 200,
  "message": "Cita cancelada exitosamente"
}
Response (Error - No se pudo procesar)
{
  "success": false,
  "codcit": "7128979233",
  "phpsessid": "abc123...",
  "fechaCancelacion": "2026-02-09 19:30:45",
  "error": "No se pudo procesar la solicitud",
  "mensaje": "No se pudo procesar la solicitud. Intente nuevamente.",
  "data": {
    "data": false,
    "msj": "..."
  },
  "statusCode": 400,
  "message": "No se pudo cancelar la cita"
}
Parámetros
Parámetro Tipo Requerido Descripción
codcit string Código de la cita a cancelar (obtenido del endpoint de citas agendadas)
phpsessid string No Cookie de sesión PHPSESSID. Si no se proporciona, se usa la guardada en la API
Notas
  • La justificación de cancelación se genera automáticamente con el formato: "CANCELADA AGENTE VIRTUAL DARY BOT [fecha y hora actual]"
  • La fecha y hora se calculan en la zona horaria de Bogotá (UTC-5)
  • El código de cancelación se extrae automáticamente del mensaje de respuesta cuando está disponible
  • Si data es false en la respuesta, significa que no se pudo procesar la solicitud

Probar Endpoint

Response
Volver al inicio

GET /api/status

GET /api/status

Obtiene el estado del servicio y lista todos los endpoints disponibles.

Request
GET /api/status
Response (Success)
{
  "status": "online",
  "service": "PANA Login API",
  "version": "1.0.0",
  "endpoints": {...}
}

Probar Endpoint

Response