{
  "info": {
    "_postman_id": "32ff4965-adfa-4599-b71c-9f858602fb70",
    "name": "AndinoPay API v1",
    "description": "Colección oficial de AndinoPay para comercios que integran la API directamente en su propio backend. Alineada con el Manual de Integración (.docx) y con la documentación Swagger (api.andinopay.com/docs) — los 4 endpoints principales (crear/consultar transacción, crear/consultar sesión de checkout) más 2 endpoints de soporte de solo lectura (consultar canales y bancos disponibles).\n\n## Configurar antes de usar\n\nEn **Variables de colección** ajusta:\n- `base_url` — URL del API (default: `https://api.andinopay.com/api`, producción: `https://api.andinopay.com/api`)\n- `api_key` — tu API Key pública (`pk_live_xxxxx` / `pk_test_xxxxx`)\n- `api_secret` — tu API Secret (opcional; activa auto-firma `X-Signature`)\n\nTodas las rutas de esta colección usan `Authorization: Bearer {{api_key}}` (se envía automáticamente) — sin excepciones, ningún endpoint de esta colección es público.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Auto-genera X-Signature si api_secret está configurado (GET incluido: se firma con body vacío)",
          "const secret = pm.collectionVariables.get('api_secret');",
          "if (secret) {",
          "    const rawBody = (pm.request.body && pm.request.body.raw) ? pm.request.body.raw : '';",
          "    const firma = 'sha256=' + CryptoJS.HmacSHA256(rawBody, secret).toString();",
          "    pm.request.headers.upsert({ key: 'X-Signature', value: firma });",
          "}"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.andinopay.com/api",
      "type": "string"
    },
    {
      "key": "api_key",
      "value": "pk_test_qyNu58wqSrIFeGYr0EiLwJBKFI8fZjwJ",
      "type": "string"
    },
    {
      "key": "api_secret",
      "value": "",
      "type": "string",
      "description": "Opcional — activa auto-firma X-Signature"
    },
    {
      "key": "session_uuid",
      "value": "",
      "type": "string"
    },
    {
      "key": "transaction_uuid",
      "value": "",
      "type": "string"
    },
    {
      "key": "transaction_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "checkout_token",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Transacciones",
      "description": "POST /v1/transactions — crear. GET /v1/transactions/{id} — consultar.",
      "item": [
        {
          "name": "1. Crear transacción",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('TX creada', () => {",
                  "    pm.response.to.have.status(201);",
                  "    const j = pm.response.json();",
                  "    pm.expect(j.redirect_url).to.be.a('string');",
                  "    pm.collectionVariables.set('transaction_uuid', j.uuid);",
                  "    pm.collectionVariables.set('transaction_id', String(j.transaction_id));",
                  "    console.log('transaction_id:', j.transaction_id);",
                  "    console.log('Redirigir al banco:', j.redirect_url);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"monto\": 150000,\n  \"moneda\": \"COP\",\n  \"canal_pago_id\": 10,\n  \"referencia_externa\": \"ORD-2026-001\",\n  \"redirect_url\": \"https://tu-tienda.com/orden/ORD-2026-001/resultado\",\n  \"webhook_url\": \"https://tu-tienda.com/webhooks/pago\",\n  \"processor\": \"pse_sandbox\",\n  \"payer\": {\n    \"nombre\": \"Juan\",\n    \"apellido\": \"García\",\n    \"email\": \"juan@ejemplo.com\",\n    \"tipo_documento\": \"CC\",\n    \"documento\": \"123456789\",\n    \"telefono\": \"3001234567\",\n    \"tipo_persona\": \"natural\",\n    \"banco_pse\": \"1023\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/transactions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "transactions"
              ]
            },
            "description": "El comercio crea la TX directamente. La API llama al adaptador PSE y devuelve la `redirect_url` del banco.\n\n**`referencia_externa` es obligatorio** — identifica el pedido en el sistema del comercio.\n\n**`canal_pago_id` es OPCIONAL desde el 20/08/2026.** Si se omite, la API lo resuelve sola: busca el canal `metodo=pse` activo y asignado a este comercio en el ambiente de la API key usada (sandbox/producción). Si se envía explícito (como en este ejemplo, `10`), se respeta tal cual — útil para forzar un canal específico o si el comercio tiene más de uno habilitado. Sin ningún canal PSE asignado y activo → `422 canal_not_found`.\n\n**`redirect_url` es OBLIGATORIO para PSE** (y cualquier procesador que requiera redirect). Sin él → `422 redirect_url_required`. TDC no lo requiere (cargo directo, sin redirect).\n\n**`moneda`** — opcional, solo acepta `COP` actualmente. Si no se envía, default `COP`. `USD` devuelve `422 currency_not_supported`.\n\n**Idempotencia:** misma `referencia_externa` con TX activa → `200` con `message`, `code: duplicate_reference` y `redirect_url` real del banco.\n\n**Sandbox:** `redirect_url` apunta al banco simulado. En producción apunta al banco real.\n\n**Requiere:** `Authorization: Bearer {api_key}`"
          },
          "response": [
            {
              "name": "201 — TX pendiente, redirect al banco",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"transaction_id\": 43,\n  \"uuid\": \"660e8400-e29b-41d4-a716-446655440001\",\n  \"estado\": \"pendiente\",\n  \"ambiente\": \"sandbox\",\n  \"monto\": 150000.0,\n  \"moneda\": \"COP\",\n  \"comision\": 4900.0,\n  \"porcentaje_aplicado\": 3.2,\n  \"fija_aplicada\": 100.0,\n  \"neto\": 129169.0,\n  \"canal_pago\": \"PSE TEST\",\n  \"referencia_externa\": \"ORD-2026-001\",\n  \"redirect_url\": \"http://localhost:8003/sandbox/pse/660e8400-e29b-41d4-a716-446655440001\",\n  \"created_at\": \"2026-05-11T07:00:00-05:00\"\n}"
            },
            {
              "name": "200 — Idempotente (misma referencia, TX activa)",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"message\": \"Ya existe una transacción en curso con esta referencia. Se retorna la transacción existente.\",\n  \"code\": \"duplicate_reference\",\n  \"transaction_id\": 43,\n  \"uuid\": \"660e8400-e29b-41d4-a716-446655440001\",\n  \"estado\": \"pendiente\",\n  \"ambiente\": \"sandbox\",\n  \"monto\": 150000.0,\n  \"comision\": 4900.0,\n  \"porcentaje_aplicado\": 3.2,\n  \"fija_aplicada\": 100.0,\n  \"neto\": 129169.0,\n  \"referencia_externa\": \"ORD-2026-001\",\n  \"redirect_url\": \"http://localhost:8003/sandbox/pse/660e8400-e29b-41d4-a716-446655440001\",\n  \"idempotent\": true,\n  \"created_at\": \"2026-05-11T07:00:00-05:00\"\n}"
            },
            {
              "name": "422 — Ya pagada",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Este pedido ya fue pagado.\",\n  \"code\": \"already_paid\",\n  \"transaction_id\": 43,\n  \"uuid\": \"660e8400-e29b-41d4-a716-446655440001\"\n}"
            },
            {
              "name": "422 — redirect_url requerida (PSE sin redirect_url)",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"El campo redirect_url es obligatorio para este medio de pago.\",\n  \"code\": \"redirect_url_required\"\n}"
            },
            {
              "name": "422 — Moneda no soportada",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Moneda no soportada. Por el momento solo aceptamos pagos en COP.\",\n  \"code\": \"currency_not_supported\"\n}"
            }
          ]
        },
        {
          "name": "1b. Crear transacción — sin canal_pago_id (auto-resuelto)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('TX creada', () => {",
                  "    pm.response.to.have.status(201);",
                  "    const j = pm.response.json();",
                  "    pm.expect(j.redirect_url).to.be.a('string');",
                  "    pm.collectionVariables.set('transaction_uuid', j.uuid);",
                  "    pm.collectionVariables.set('transaction_id', String(j.transaction_id));",
                  "    console.log('transaction_id:', j.transaction_id);",
                  "    console.log('Redirigir al banco:', j.redirect_url);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"monto\": 150000,\n  \"moneda\": \"COP\",\n  \"referencia_externa\": \"ORD-2026-002\",\n  \"redirect_url\": \"https://tu-tienda.com/orden/ORD-2026-001/resultado\",\n  \"webhook_url\": \"https://tu-tienda.com/webhooks/pago\",\n  \"processor\": \"pse_sandbox\",\n  \"payer\": {\n    \"nombre\": \"Juan\",\n    \"apellido\": \"García\",\n    \"email\": \"juan@ejemplo.com\",\n    \"tipo_documento\": \"CC\",\n    \"documento\": \"123456789\",\n    \"telefono\": \"3001234567\",\n    \"tipo_persona\": \"natural\",\n    \"banco_pse\": \"1023\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/transactions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "transactions"
              ]
            },
            "description": "Mismo endpoint que el ejemplo anterior, pero **sin `canal_pago_id`** — demuestra la resolución automática agregada el 20/08/2026: la API busca el canal `metodo=pse` activo y asignado a este comercio en el ambiente de la API key usada, sin que el caller necesite conocer ningún ID interno."
          },
          "response": []
        },
        {
          "name": "2. Consultar transacción",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('TX encontrada', () => {",
                  "    pm.response.to.have.status(200);",
                  "    const j = pm.response.json();",
                  "    pm.expect(j.id).to.be.a('number');",
                  "    pm.expect(j.estado).to.be.a('string');",
                  "    console.log('ID:', j.id, '| Estado:', j.estado, '| Origen:', j.origen);",
                  "    console.log('Webhook:', j.webhook_status, '| Intentos:', j.webhook_attempts);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/transactions/{{transaction_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "transactions",
                "{{transaction_id}}"
              ]
            },
            "description": "Devuelve el detalle completo de una transacción. Solo devuelve transacciones del comercio autenticado (scoped por `comercio_id` del Bearer token).\n\n**Campos clave:**\n- `origen` → cómo se creó: `api_direct`, `webcheckout`, `payment_link`\n- `ambiente` → `sandbox` o `produccion`\n- `processor_reference` → referencia del banco procesador\n- `webhook_status` → `null` / `pending` / `sent` / `failed`\n- `webhook_attempts` → número de intentos de entrega del webhook\n\n**Requiere:** `Authorization: Bearer {api_key}`"
          },
          "response": [
            {
              "name": "200 — Detalle completo",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 43,\n  \"uuid\": \"660e8400-e29b-41d4-a716-446655440001\",\n  \"estado\": \"aprobada\",\n  \"ambiente\": \"sandbox\",\n  \"origen\": \"api_direct\",\n  \"canal_pago\": \"PSE\",\n  \"monto\": 200000.0,\n  \"comision\": 6000.0,\n  \"porcentaje_aplicado\": 3.0,\n  \"fija_aplicada\": 0.0,\n  \"impuesto\": 0.0,\n  \"neto\": 194000.0,\n  \"referencia_externa\": \"ORDER-PSE-001\",\n  \"processor_reference\": \"PSE-TXN-123456\",\n  \"webhook_url\": \"https://tu-tienda.com/webhooks/pago\",\n  \"webhook_status\": \"sent\",\n  \"webhook_attempts\": 1,\n  \"created_at\": \"2026-04-24T18:00:00+00:00\",\n  \"updated_at\": \"2026-04-24T18:05:30+00:00\"\n}"
            },
            {
              "name": "404 — No encontrada (o de otro comercio)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Transacción no encontrada.\",\n  \"code\": \"not_found\"\n}"
            }
          ]
        },
        {
          "name": "3. Consultar canales de pago disponibles",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Listado de canales', () => {",
                  "    pm.response.to.have.status(200);",
                  "    const j = pm.response.json();",
                  "    pm.expect(j).to.be.an('array');",
                  "    if (j.length) {",
                  "        pm.expect(j[0]).to.have.property('id');",
                  "        pm.expect(j[0]).to.have.property('ambiente');",
                  "        pm.expect(j[0]).to.not.have.property('procesador');",
                  "    }",
                  "    console.log('Canales:', j.length);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/channels",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "channels"
              ]
            },
            "description": "Devuelve solo los canales de pago que TU comercio tiene asignados y activos, filtrados por el ambiente de tu API Key (`comercio_canal_pagos`) — nunca canales de otro comercio ni de otro ambiente. Útil para conocer tu `canal_pago_id` real antes de forzarlo en `POST /v1/transactions`.\n\n**Nunca incluye `procesador`** (ej. \"OpenPay\") — es un detalle interno que el comercio no debe ver.\n\n**Requiere:** `Authorization: Bearer {api_key}`"
          },
          "response": [
            {
              "name": "200 — Canales asignados al comercio",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "[\n  {\n    \"id\": 3,\n    \"nombre\": \"PSE\",\n    \"metodo\": \"pse\",\n    \"ambiente\": \"produccion\"\n  }\n]"
            },
            {
              "name": "404 — Sin canales para este ambiente",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"No tiene canales de pago disponibles para este ambiente. Por favor contacte a soporte AndinoPay.\",\n  \"code\": \"no_channels_available\"\n}"
            }
          ]
        },
        {
          "name": "4. Consultar bancos PSE disponibles",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Listado de bancos', () => {",
                  "    pm.response.to.have.status(200);",
                  "    const j = pm.response.json();",
                  "    pm.expect(j).to.be.an('array');",
                  "    if (j.length) {",
                  "        pm.expect(j[0]).to.have.property('bankCode');",
                  "        pm.expect(j[0]).to.have.property('bankName');",
                  "    }",
                  "    console.log('Bancos:', j.length);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/pse/banks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pse",
                "banks"
              ],
              "query": [
                {
                  "key": "canal_pago_id",
                  "value": "",
                  "disabled": true,
                  "description": "Forzar un canal específico (debe pertenecer a tu comercio). Opcional."
                }
              ]
            },
            "description": "Requiere Bearer. Devuelve los bancos del canal PSE que TU comercio tiene asignado y activo para el ambiente de tu API Key — una key de Sandbox siempre trae bancos de Sandbox, una de Producción siempre trae bancos de Producción, sin importar qué se pida. El `bankCode` de cada banco es el valor que va en `payer.banco_pse` al crear una transacción Direct PSE (POST /v1/transactions).\n\n404 `no_channels_available` si tu comercio no tiene ningún canal PSE asignado y activo para este ambiente."
          },
          "response": [
            {
              "name": "200 — Bancos disponibles",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "[\n  {\n    \"bankCode\": \"007\",\n    \"bankName\": \"Bancolombia\"\n  },\n  {\n    \"bankCode\": \"051\",\n    \"bankName\": \"Davivienda\"\n  }\n]"
            },
            {
              "name": "404 — Sin canales para este ambiente",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"No tiene canales de pago disponibles para este ambiente. Por favor contacte a soporte AndinoPay.\",\n  \"code\": \"no_channels_available\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Checkout Sessions",
      "description": "POST /v1/checkout/sessions — crear. GET /v1/checkout/sessions/{uuid} — consultar. El comprador completa el pago en el WebCheckout hospedado por AndinoPay; el comercio nunca llama los endpoints internos que usa esa página (no forman parte de esta colección).",
      "item": [
        {
          "name": "1. Crear sesión de checkout",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Sesión creada', () => {",
                  "    pm.response.to.have.status(201);",
                  "    const j = pm.response.json();",
                  "    pm.expect(j.session_id).to.be.a('string');",
                  "    pm.expect(j.checkout_url).to.be.a('string');",
                  "    pm.expect(j.order_id).to.eql('ORDER-001');",
                  "    pm.collectionVariables.set('session_uuid', j.session_id);",
                  "",
                  "    // Extraer checkout_token del checkout_url (?ct=...)",
                  "    const url = new URL(j.checkout_url);",
                  "    const ct = url.searchParams.get('ct');",
                  "    pm.expect(ct).to.be.a('string');",
                  "    pm.collectionVariables.set('checkout_token', ct);",
                  "",
                  "    console.log('session_uuid guardado:', j.session_id);",
                  "    console.log('checkout_token guardado:', ct);",
                  "    console.log('Redirigir cliente a:', j.checkout_url);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"monto\": 250000,\n  \"moneda\": \"COP\",\n  \"order_id\": \"ORDER-001\",\n  \"redirect_url\": \"https://tu-tienda.com/orden/ORDER-001/resultado\",\n  \"webhook_url\": \"https://tu-tienda.com/webhooks/pago\",\n  \"metadata\": {\n    \"customer_id\": \"USR-789\"\n  },\n  \"payer\": {\n    \"nombre\": \"María\",\n    \"apellido\": \"López\",\n    \"email\": \"maria@ejemplo.com\",\n    \"tipo_documento\": \"CC\",\n    \"documento\": \"9876543210\",\n    \"telefono\": \"3001234567\",\n    \"direccion\": \"Calle 123 # 45-67\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/checkout/sessions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions"
              ]
            },
            "description": "El comercio crea la sesión desde su backend. Recibe `checkout_url` y redirige al cliente allí.\n\nLa sesión expira en **1 hora**. El ambiente lo define la API Key usada (sandbox o produccion).\n\n**Requiere:** `Authorization: Bearer {api_key}`"
          },
          "response": [
            {
              "name": "201 — Sesión creada",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"session_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"checkout_url\": \"http://localhost:8004/cs/550e8400-e29b-41d4-a716-446655440000\",\n  \"estado\": \"pendiente\",\n  \"monto\": 250000.0,\n  \"moneda\": \"COP\",\n  \"expires_at\": \"2026-04-24T23:00:00+00:00\"\n}"
            }
          ]
        },
        {
          "name": "2. Consultar sesión de checkout",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Sesión encontrada', () => {",
                  "    pm.response.to.have.status(200);",
                  "    const j = pm.response.json();",
                  "    pm.expect(j.session_id).to.be.a('string');",
                  "    console.log('Estado sesión:', j.estado);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/checkout/sessions/{{session_uuid}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions",
                "{{session_uuid}}"
              ]
            },
            "description": "El comercio usa este endpoint para verificar si la sesión fue pagada. Solo devuelve sesiones del comercio autenticado.\n\nEstados posibles: `pendiente`, `en_proceso`, `completada`, `expirada`.\n\n**Requiere:** `Authorization: Bearer {api_key}`"
          },
          "response": [
            {
              "name": "200 — Sesión completada",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": ""
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"session_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"estado\": \"completada\",\n  \"monto\": 250000.0,\n  \"moneda\": \"COP\",\n  \"checkout_url\": \"http://localhost:8004/cs/550e8400-e29b-41d4-a716-446655440000\",\n  \"redirect_url\": \"https://tu-tienda.com/orden/ORDER-001/resultado\",\n  \"expires_at\": \"2026-04-24T23:00:00+00:00\",\n  \"created_at\": \"2026-04-24T22:00:00+00:00\",\n  \"transacciones\": [\n    {\n      \"uuid\": \"660e8400-e29b-41d4-a716-446655440001\",\n      \"estado\": \"aprobada\",\n      \"monto\": 250000.0,\n      \"neto\": 242500.0,\n      \"origen\": \"webcheckout\",\n      \"created_at\": \"2026-04-24T22:02:00+00:00\"\n    }\n  ]\n}"
            }
          ]
        }
      ]
    }
  ]
}
