{
  "info": {
    "name": "Hub Log Middleware",
    "description": "API para consulta y análisis de logs de Airflow en la plataforma Fracttal.\n\nVariables de colección requeridas:\n- baseUrl: URL base del servicio (por defecto apunta al entorno develop)\n- token: Bearer token de autenticación\n- dag_id: identificador del DAG\n- run_date: fecha de la ejecución en formato YYYY-MM-DD\n- run_id: identificador de la ejecución\n- phase: fase de la ejecución (extract, transform, load, event)",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://one.fracttal.com/hub/api/v1",
      "type": "string",
      "description": "URL base del servicio. Cambiar según el entorno."
    },
    {
      "key": "token",
      "value": "",
      "type": "string",
      "description": "Bearer token de autenticación. Pegar sin el prefijo 'Bearer'."
    },
    {
      "key": "dag_id",
      "value": "",
      "type": "string",
      "description": "Identificador del DAG."
    },
    {
      "key": "run_date",
      "value": "2026-05-01",
      "type": "string",
      "description": "Fecha de la ejecución en formato YYYY-MM-DD."
    },
    {
      "key": "run_id",
      "value": "",
      "type": "string",
      "description": "Identificador de la ejecución."
    },
    {
      "key": "phase",
      "value": "extract",
      "type": "string",
      "description": "Fase de la ejecución: extract, transform, load o event."
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{token}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "Health",
      "item": [
        {
          "name": "Health check",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/../health",
              "host": ["{{baseUrl}}"],
              "path": ["..", "health"]
            },
            "description": "Verifica que el servicio esté operativo. No requiere autenticación."
          }
        }
      ]
    },
    {
      "name": "DAGs",
      "description": "Listado de DAGs disponibles y estadísticas de ejecución.",
      "item": [
        {
          "name": "List DAGs",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags",
              "host": ["{{baseUrl}}"],
              "path": ["dags"]
            },
            "description": "Devuelve todos los DAGs accesibles para la compañía del token."
          }
        },
        {
          "name": "Run statistics for a DAG",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/stats?start_date=2026-05-01&end_date=2026-05-07",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "stats"],
              "query": [
                {
                  "key": "start_date",
                  "value": "2026-05-01",
                  "description": "Fecha de inicio (YYYY-MM-DD)"
                },
                {
                  "key": "end_date",
                  "value": "2026-05-07",
                  "description": "Fecha de fin (YYYY-MM-DD)"
                }
              ]
            },
            "description": "Estadísticas agregadas de ejecuciones del DAG en el rango de fechas indicado."
          }
        },
        {
          "name": "Run timeline for a DAG",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/timeline?start_date=2026-05-01&end_date=2026-05-07",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "timeline"],
              "query": [
                {
                  "key": "start_date",
                  "value": "2026-05-01",
                  "description": "Fecha de inicio (YYYY-MM-DD)"
                },
                {
                  "key": "end_date",
                  "value": "2026-05-07",
                  "description": "Fecha de fin (YYYY-MM-DD)"
                }
              ]
            },
            "description": "Historial de ejecuciones del DAG ordenado cronológicamente."
          }
        },
        {
          "name": "Search runs for a DAG",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs?start_date=2026-05-01&end_date=2026-05-07&limit=20&offset=0",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs"],
              "query": [
                {
                  "key": "start_date",
                  "value": "2026-05-01",
                  "description": "Fecha de inicio (YYYY-MM-DD). Rango máximo: 7 días."
                },
                {
                  "key": "end_date",
                  "value": "2026-05-07",
                  "description": "Fecha de fin (YYYY-MM-DD). Rango máximo: 7 días."
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Resultados por página (1-100, default 20)"
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "Registros a saltar para paginación"
                }
              ]
            },
            "description": "Búsqueda de ejecuciones de un DAG en un rango de fechas."
          }
        }
      ]
    },
    {
      "name": "Runs",
      "description": "Detalle de una ejecución específica.",
      "item": [
        {
          "name": "Run summary",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}"]
            },
            "description": "Resumen general de la ejecución: estado, duración y recuento de fases."
          }
        },
        {
          "name": "Event payload",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}/event",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}", "event"]
            },
            "description": "Payload del evento que desencadenó la ejecución."
          }
        }
      ]
    },
    {
      "name": "Phases",
      "description": "Información detallada de cada fase de una ejecución (extract, transform, load, event).",
      "item": [
        {
          "name": "Phase metadata",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}/phases/{{phase}}?attempt=1",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}", "phases", "{{phase}}"],
              "query": [
                {
                  "key": "attempt",
                  "value": "1",
                  "description": "Número de intento (1-indexed, default 1)"
                }
              ]
            },
            "description": "Metadatos y recuentos de la fase: estado, duración y número de filas."
          }
        },
        {
          "name": "Phase data rows",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}/phases/{{phase}}/data?attempt=1&page=0&limit=50",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}", "phases", "{{phase}}", "data"],
              "query": [
                {
                  "key": "attempt",
                  "value": "1",
                  "description": "Número de intento (default 1)"
                },
                {
                  "key": "page",
                  "value": "0",
                  "description": "Página (0-indexed, default 0)"
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Filas por página (1-500, default 50)"
                },
                {
                  "key": "keyword",
                  "value": "",
                  "description": "Búsqueda de texto en los datos de la fase",
                  "disabled": true
                }
              ]
            },
            "description": "Filas de datos procesadas por la fase, paginadas."
          }
        },
        {
          "name": "Phase logs",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}/phases/{{phase}}/logs?attempt=1&page=0&limit=50",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}", "phases", "{{phase}}", "logs"],
              "query": [
                {
                  "key": "attempt",
                  "value": "1",
                  "description": "Número de intento (default 1)"
                },
                {
                  "key": "page",
                  "value": "0",
                  "description": "Página (0-indexed, default 0)"
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Logs por página (1-500, default 50)"
                },
                {
                  "key": "level",
                  "value": "ERROR",
                  "description": "Filtrar por nivel: DEBUG, INFO, WARNING, ERROR, CRITICAL",
                  "disabled": true
                },
                {
                  "key": "keyword",
                  "value": "",
                  "description": "Búsqueda de texto en el mensaje del log",
                  "disabled": true
                }
              ]
            },
            "description": "Logs de la fase paginados. Para obtener todos los logs como stream, agregar el header Accept: application/x-ndjson."
          }
        },
        {
          "name": "Phase logs (stream NDJSON)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/x-ndjson",
                "description": "Activa el modo stream. El servidor devuelve cada log como una línea JSON."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}/phases/{{phase}}/logs?attempt=1&level=ERROR",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}", "phases", "{{phase}}", "logs"],
              "query": [
                {
                  "key": "attempt",
                  "value": "1"
                },
                {
                  "key": "level",
                  "value": "ERROR",
                  "description": "Filtrar por nivel de log",
                  "disabled": true
                },
                {
                  "key": "keyword",
                  "value": "",
                  "description": "Búsqueda de texto",
                  "disabled": true
                }
              ]
            },
            "description": "Obtiene todos los logs de la fase como stream sin límite de paginación. Cada línea de respuesta es un objeto JSON independiente (NDJSON)."
          }
        },
        {
          "name": "Phase errors",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}/phases/{{phase}}/errors?attempt=1&page=0&limit=50",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}", "phases", "{{phase}}", "errors"],
              "query": [
                {
                  "key": "attempt",
                  "value": "1",
                  "description": "Número de intento (default 1)"
                },
                {
                  "key": "page",
                  "value": "0",
                  "description": "Página (0-indexed, default 0)"
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Errores por página (1-500, default 50)"
                }
              ]
            },
            "description": "Errores registrados durante la ejecución de la fase."
          }
        }
      ]
    },
    {
      "name": "Artifacts",
      "description": "Artefactos generados por una ejecución.",
      "item": [
        {
          "name": "List artifacts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}/artifacts",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}", "artifacts"]
            },
            "description": "Lista todos los artefactos disponibles para la ejecución."
          }
        },
        {
          "name": "Get artifact presigned URL",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/dags/{{dag_id}}/runs/{{run_date}}/{{run_id}}/artifacts/:artifact_kind",
              "host": ["{{baseUrl}}"],
              "path": ["dags", "{{dag_id}}", "runs", "{{run_date}}", "{{run_id}}", "artifacts", ":artifact_kind"],
              "variable": [
                {
                  "key": "artifact_kind",
                  "value": "",
                  "description": "Tipo de artefacto. Usar el valor devuelto por el endpoint List artifacts."
                }
              ]
            },
            "description": "Devuelve una URL pre-firmada para descargar el artefacto directamente desde S3."
          }
        }
      ]
    }
  ]
}
