{
  "info": {
    "_postman_id": "783822f7-e030-4ff4-9c11-0a4d47b35890",
    "name": "API Extractor DIAN - Piloto Pleia",
    "description": "Extraccion de documentos electronicos desde el catalogo de la DIAN.\nPreparado por Agil Factura para la prueba piloto.\n\nDOS PASOS, CON REQUISITOS DISTINTOS:\n\n  1. Listar documentos  -> NO requiere certificado digital.\n     Entrega los datos: emisor, folio, fechas, totales e impuestos.\n     Es el paso del piloto.\n\n  2. Descargar el XML   -> SI requiere el certificado (.p12) de la\n     empresa. Entrega el archivo original firmado.\n\nSi el requerimiento se cubre con los datos, el paso 1 basta y no hay\nque custodiar certificados.\n\nANTES DE EMPEZAR - un solo paso:\n  Variables > url_token > pegar el enlace AuthToken de la DIAN.\n  La URL del servicio y la clave ya vienen configuradas.\n\nAbrir la consola con View > Show Postman Console para ver la salida.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "1 - Listar documentos del catalogo (sin certificado)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "const r = pm.response.json();",
              "pm.test('Respuesta correcta', () => pm.expect(r.success).to.be.true);",
              "",
              "if (r.data && r.data.length) {",
              "    console.log('Documentos encontrados: ' + r.total);",
              "    console.log('');",
              "    console.log('======================================================');",
              "    console.log('CAMPOS QUE ENTREGA CADA DOCUMENTO (ejemplo real)');",
              "    console.log('======================================================');",
              "    console.log(JSON.stringify(r.data[0], null, 2));",
              "    console.log('');",
              "    console.log('Campos disponibles: ' + Object.keys(r.data[0]).join(', '));",
              "    console.log('');",
              "    console.log('======================================================');",
              "    console.log('LISTADO');",
              "    console.log('======================================================');",
              "    r.data.slice(0, 25).forEach((d, i) => {",
              "        console.log((i + 1) + '. ' + d.folio + '  ' + d.nombreEmisor +",
              "                    '  ' + d.valor + '  [' + d.estado + ']');",
              "    });",
              "    if (r.total > 25) console.log('... y ' + (r.total - 25) + ' mas.');",
              "} else {",
              "    console.log('Sin documentos en el rango indicado.');",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "X-Api-Key",
            "value": "{{api_key}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/api/cufes",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "api",
            "cufes"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"tipo\": \"Received\",\n  \"fechaDesde\": \"2026-08-24\",\n  \"fechaHasta\": \"2026-08-31\",\n  \"url\": \"{{url_token}}\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "description": "PASO 1 DEL PILOTO - no requiere certificado digital.\n\nDevuelve el listado de documentos del catalogo de la DIAN para un rango de\nfechas. Por cada documento entrega: CUFE, tipo, prefijo y folio, fechas de\nemision y recepcion, NIT y nombre del emisor y del receptor, estado, estado\nRADIAN, valor total y el desglose de impuestos (IVA, ICA, IPC, IVA 5%,\nIVA 19% y detalle).\n\nEs una sola llamada para todo el rango, y tarda segundos.\n\nQUE EDITAR EN EL CUERPO:\n  tipo         Received = compras (recibidas)  |  Sent = ventas (emitidas)\n  fechaDesde   formato YYYY-MM-DD\n  fechaHasta   formato YYYY-MM-DD\n\nViene con UNA SEMANA de rango a proposito: es suficiente para revisar los\ncampos y responde en menos de un minuto. Para un mes completo, ampliarlo\n(tarda 1 a 2 minutos y devuelve unos 140 documentos).\n  (el enlace AuthToken NO se toca aqui: va en la variable url_token)\n\nLO UNICO QUE HAY QUE CONFIGURAR - el enlace AuthToken:\nPestana de la coleccion > Variables > url_token > pegar el enlace COMPLETO,\ntal como llega, y Guardar.\n\nLa DIAN lo envia por correo al representante legal de cada empresa. Es la\ncredencial de acceso al catalogo de ese NIT.\n\nLa consola (View > Show Postman Console) imprime el primer documento\ncompleto, para revisar si los campos cubren el requerimiento."
      }
    },
    {
      "name": "2 - Descargar el XML original (requiere certificado)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "const r = pm.response.json();",
              "pm.test('XML obtenido', () => pm.expect(r.ok).to.be.above(0));",
              "",
              "console.log('solicitados: ' + r.total + ' | obtenidos: ' + r.ok);",
              "",
              "(r.data || []).forEach((d, i) => {",
              "    if (d.xmlBase64) {",
              "        const xml = Buffer.from(d.xmlBase64, 'base64').toString('utf8');",
              "        console.log('======================================================');",
              "        console.log('XML ' + (i + 1) + ' - firmado por la DIAN (' +",
              "                    xml.length + ' caracteres)');",
              "        console.log('======================================================');",
              "        console.log(xml.slice(0, 800));",
              "        console.log('...');",
              "    } else {",
              "        console.log('CUFE ' + d.cufe + ' sin XML: ' + d.error);",
              "    }",
              "});"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "X-Api-Key",
            "value": "{{api_key}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/api/ubl2.1/xml/by-cufes",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "api",
            "ubl2.1",
            "xml",
            "by-cufes"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"certificate\": \"{{cert_b64}}\",\n  \"password\": \"{{cert_pass}}\",\n  \"ambiente\": 1,\n  \"cufes\": [\n    \"PEGA_AQUI_UN_CUFE_DEL_PASO_1\"\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "description": "PASO 2 - REQUIERE CERTIFICADO DIGITAL (.p12) de la empresa.\n\nDevuelve el XML ORIGINAL FIRMADO de cada CUFE, en base64. Es el archivo tal\ncomo quedo en la DIAN.\n\nNo forma parte del piloto: se incluye para que se vea el alcance completo\ndel servicio.\n\nCUANTOS POR LLAMADA:\n  Maximo admitido:  500 CUFEs\n  Recomendado:      100 a 150\n\nCada XML exige una consulta firmada a la DIAN (1 a 2 segundos por documento)\ny pesa unos 25 KB en base64. Un lote de 150 devuelve cerca de 4 MB y tarda\nentre 3 y 6 minutos. Lotes mayores se acercan al tiempo maximo de espera y\nse pierde la peticion completa, por eso conviene encadenar lotes moderados.\n\nQUE EDITAR EN EL CUERPO:\n  cufes      los CUFEs obtenidos en el paso 1\n  ambiente   1 = produccion  |  2 = habilitacion\n\nEN VARIABLES: cert_b64 y cert_pass (una sola vez).\n\nEl script decodifica el XML y lo imprime en la consola."
      }
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.tra-di.site"
    },
    {
      "key": "url_token",
      "value": "PEGA_AQUI_EL_ENLACE_AuthToken_DE_LA_DIAN"
    },
    {
      "key": "api_key",
      "value": "b2aa9aa53c318d392a7539807ec28c4ccd4d3427e0788c13"
    },
    {
      "key": "cert_b64",
      "value": "SOLO_PARA_EL_PASO_2"
    },
    {
      "key": "cert_pass",
      "value": "SOLO_PARA_EL_PASO_2"
    }
  ]
}