{
  "info": {
    "name": "Vexorpay API",
    "_postman_id": "vexorpay-api-v1",
    "description": "Colección de la API pública de Vexorpay (v1) con todos los endpoints ya configurados.\n\n## Cómo usarla\n\n1. Descargá esta colección y abrí Postman (escritorio o web).\n2. Import → elegí este archivo (o arrastralo a Postman).\n3. En las Variables de la colección, completá apiKey con tu clave real (vxp_u_...). Las claves se crean en el dashboard → Desarrolladores. baseUrl ya apunta a producción (https://api.vexorpay.com/api/v1).\n\nTodos los requests usan Authorization: Bearer {{apiKey}} (heredado de la colección). Los POST idempotentes (payment-links y checkout) aceptan el header Idempotency-Key para evitar duplicados. Los endpoints de lectura aceptan el parámetro sandbox (true = modo prueba); en payment-links, charges, subscriptions y payouts, omitirlo devuelve ambos entornos.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "type": "string",
      "value": "https://api.vexorpay.com/api/v1",
      "description": "Base de la API pública (producción): https://api.vexorpay.com/api/v1"
    },
    {
      "key": "apiKey",
      "type": "string",
      "value": "vxp_u_tu_clave_aqui",
      "description": "Tu API key (vxp_u_...). Se crea en el dashboard → Desarrolladores."
    },
    {
      "key": "linkId",
      "type": "string",
      "value": "",
      "description": "ID de un payment link (ej: id de la respuesta de POST /payment-links)."
    },
    {
      "key": "chargeId",
      "type": "string",
      "value": "",
      "description": "ID de un cobro (ej: charge.id de POST /payment-links/{id}/checkout)."
    },
    {
      "key": "subscriptionId",
      "type": "string",
      "value": "",
      "description": "ID de una suscripción (ej: id de GET /subscriptions)."
    },
    {
      "key": "payoutId",
      "type": "string",
      "value": "",
      "description": "ID de un retiro (payout)."
    },
    {
      "key": "eventId",
      "type": "string",
      "value": "",
      "description": "ID de un evento (evt_...)."
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "General",
      "item": [
        {
          "name": "Health",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/health",
              "host": ["{{baseUrl}}"],
              "path": ["health"]
            },
            "description": "Verifica que la API esté arriba (sin autenticación)."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Payment Links",
      "item": [
        {
          "name": "Crear link de pago",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "description": "Opcional: protege contra duplicados si repetís la misma petición."
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 19,\n  \"title\": \"Ebook UX en 30 días\",\n  \"description\": \"Acceso inmediato al PDF.\",\n  \"reference\": \"CATALOGO-UX\",\n  \"metadata\": {\n    \"sku\": \"UX-30\"\n  }\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/payment-links",
              "host": ["{{baseUrl}}"],
              "path": ["payment-links"]
            },
            "description": "Crea un link de pago reutilizable. Mínimo USD 4. La referencia es opcional pero útil para identificar la venta. Agregá \"sandbox\": true para crear un link de prueba."
          },
          "response": []
        },
        {
          "name": "Crear link recurrente (suscripción)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "description": "Opcional: protege contra duplicados si repetís la misma petición."
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"recurring\",\n  \"title\": \"Membresía mensual\",\n  \"description\": \"Acceso mensual a la comunidad.\",\n  \"reference\": \"MEMBRESIA\",\n  \"prices\": [\n    {\n      \"amount\": 9,\n      \"interval\": \"month\",\n      \"interval_count\": 1,\n      \"trial_period_days\": 7,\n      \"description\": \"Plan mensual\"\n    }\n  ]\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/payment-links",
              "host": ["{{baseUrl}}"],
              "path": ["payment-links"]
            },
            "description": "Crea un link de pago recurrente (suscripción). Cada precio tiene mínimo USD 4; interval: day | week | month | year. Este link no genera checkoutUrl por API: la suscripción se inicia desde su url pública (/p/{slug})."
          },
          "response": []
        },
        {
          "name": "Listar links",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payment-links?limit=10",
              "host": ["{{baseUrl}}"],
              "path": ["payment-links"],
              "query": [
                { "key": "status", "value": "", "description": "Filtro: active | canceled | archived" },
                { "key": "type", "value": "", "description": "Filtro: one_time | recurring" },
                { "key": "sandbox", "value": "", "description": "true (prueba) | false (producción). Sin valor muestra ambos." },
                { "key": "limit", "value": "10", "description": "Máx 100 (default 10)" },
                { "key": "starting_after", "value": "", "description": "Cursor de paginación" },
                { "key": "ending_before", "value": "", "description": "Cursor de paginación" }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Obtener link",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payment-links/{{linkId}}?sandbox=false",
              "host": ["{{baseUrl}}"],
              "path": ["payment-links", "{{linkId}}"],
              "query": [
                { "key": "sandbox", "value": "false", "description": "true para leer un link de prueba" }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Actualizar link",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 24,\n  \"title\": \"Ebook UX en 30 días (v2)\",\n  \"reference\": \"CATALOGO-UX\",\n  \"status\": \"active\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/payment-links/{{linkId}}?sandbox=false",
              "host": ["{{baseUrl}}"],
              "path": ["payment-links", "{{linkId}}"],
              "query": [
                { "key": "sandbox", "value": "false", "description": "true para actualizar un link de prueba" }
              ]
            },
            "description": "Actualiza campos parciales: amount, title, description, reference, status e image_file_id. El type y los prices no son editables."
          },
          "response": []
        },
        {
          "name": "Cancelar link",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payment-links/{{linkId}}?sandbox=false",
              "host": ["{{baseUrl}}"],
              "path": ["payment-links", "{{linkId}}"],
              "query": [
                { "key": "sandbox", "value": "false", "description": "true para cancelar un link de prueba" }
              ]
            },
            "description": "Cancela (soft) el link. No borra pagos ya realizados. Idempotente."
          },
          "response": []
        },
        {
          "name": "Crear checkout",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "description": "Opcional: si la repetís con la misma referencia, reusa la misma compra."
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reference\": \"ORD-1001\",\n  \"customer_email\": \"cliente@ejemplo.com\",\n  \"metadata\": {\n    \"sku\": \"UX-30\"\n  }\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/payment-links/{{linkId}}/checkout",
              "host": ["{{baseUrl}}"],
              "path": ["payment-links", "{{linkId}}", "checkout"]
            },
            "description": "Genera un pago único (Charge) sobre un link activo y devuelve la URL de Stripe para redirigir al cliente. Sin reference, usa la del link."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Charges",
      "item": [
        {
          "name": "Listar cobros",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/charges?limit=10",
              "host": ["{{baseUrl}}"],
              "path": ["charges"],
              "query": [
                { "key": "payment_link_id", "value": "", "description": "Filtro por link" },
                { "key": "status", "value": "", "description": "pending | paid | failed | refunded | disputed" },
                { "key": "reference", "value": "", "description": "Filtro por referencia (ej: ORD-1001)" },
                { "key": "sandbox", "value": "", "description": "true (prueba) | false (producción). Sin valor muestra ambos." },
                { "key": "limit", "value": "10", "description": "Máx 100 (default 10)" },
                { "key": "starting_after", "value": "", "description": "Cursor de paginación" },
                { "key": "ending_before", "value": "", "description": "Cursor de paginación" }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Obtener cobro",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/charges/{{chargeId}}?sandbox=false",
              "host": ["{{baseUrl}}"],
              "path": ["charges", "{{chargeId}}"],
              "query": [
                { "key": "sandbox", "value": "false", "description": "true para leer un cobro de prueba" }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Descargar comprobante (PDF)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/charges/{{chargeId}}/receipt?sandbox=false",
              "host": ["{{baseUrl}}"],
              "path": ["charges", "{{chargeId}}", "receipt"],
              "query": [
                { "key": "sandbox", "value": "false", "description": "true para un cobro de prueba" }
              ]
            },
            "description": "Devuelve el comprobante en PDF. Solo para cobros pagados."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Subscriptions",
      "item": [
        {
          "name": "Listar suscripciones",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/subscriptions?limit=10",
              "host": ["{{baseUrl}}"],
              "path": ["subscriptions"],
              "query": [
                { "key": "status", "value": "", "description": "active | trialing | past_due | canceled | unpaid | pending | incomplete" },
                { "key": "payment_link_id", "value": "", "description": "Filtro por link recurrente" },
                { "key": "sandbox", "value": "", "description": "true (prueba) | false (producción). Sin valor muestra ambos." },
                { "key": "limit", "value": "10", "description": "Máx 100 (default 10)" },
                { "key": "starting_after", "value": "", "description": "Cursor de paginación" },
                { "key": "ending_before", "value": "", "description": "Cursor de paginación" }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Obtener suscripción",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/subscriptions/{{subscriptionId}}?sandbox=false",
              "host": ["{{baseUrl}}"],
              "path": ["subscriptions", "{{subscriptionId}}"],
              "query": [
                { "key": "sandbox", "value": "false", "description": "true para una suscripción de prueba" }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Cancelar suscripción",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sandbox\": false\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/subscriptions/{{subscriptionId}}/cancel",
              "host": ["{{baseUrl}}"],
              "path": ["subscriptions", "{{subscriptionId}}", "cancel"]
            },
            "description": "Programa la cancelación al final del período actual (cancel_at_period_end). Idempotente."
          },
          "response": []
        },
        {
          "name": "Abrir portal de facturación",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sandbox\": false\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/subscriptions/{{subscriptionId}}/portal",
              "host": ["{{baseUrl}}"],
              "path": ["subscriptions", "{{subscriptionId}}", "portal"]
            },
            "description": "Devuelve { url } del Customer Portal de Stripe del suscriptor para gestionar su método de pago."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Balance",
      "item": [
        {
          "name": "Obtener balance",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/balance?sandbox=false",
              "host": ["{{baseUrl}}"],
              "path": ["balance"],
              "query": [
                { "key": "sandbox", "value": "false", "description": "true para el saldo de la cuenta de prueba" }
              ]
            },
            "description": "Saldo disponible y pendiente de tu cuenta, más el estado de reembolsos/disputas (refunds)."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Payouts",
      "item": [
        {
          "name": "Listar retiros",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payouts?limit=10",
              "host": ["{{baseUrl}}"],
              "path": ["payouts"],
              "query": [
                { "key": "sandbox", "value": "", "description": "true (prueba) | false (producción). Sin valor muestra ambos." },
                { "key": "limit", "value": "10", "description": "Máx 100 (default 10)" },
                { "key": "starting_after", "value": "", "description": "Cursor de paginación" },
                { "key": "ending_before", "value": "", "description": "Cursor de paginación" }
              ]
            },
            "description": "Lista los RETIROS MANUALES (payouts po_) que hiciste desde el dashboard, en ARS (moneda de liquidación de tu cuenta Stripe Express). Las acreditaciones de cobros (transfers tr_, en USD con su conversión) se listan en /acreditaciones."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Acreditaciones",
      "item": [
        {
          "name": "Listar acreditaciones",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/acreditaciones?limit=10",
              "host": ["{{baseUrl}}"],
              "path": ["acreditaciones"],
              "query": [
                { "key": "sandbox", "value": "false", "description": "true para acreditaciones de la cuenta de prueba" },
                { "key": "limit", "value": "10", "description": "Máx 100 (default 10)" },
                { "key": "starting_after", "value": "", "description": "Cursor de paginación" },
                { "key": "ending_before", "value": "", "description": "Cursor de paginación" }
              ]
            },
            "description": "Lista los cobros que se van acreditando en tu cuenta Stripe Express (transfers tr_): moneda original (USD), neto en tu moneda de liquidación (ARS), tasa de conversión de Stripe y estado (acreditada / pendiente / reversed)."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Events",
      "item": [
        {
          "name": "Listar eventos",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/events?limit=10",
              "host": ["{{baseUrl}}"],
              "path": ["events"],
              "query": [
                { "key": "type", "value": "", "description": "payment.completed | payment.failed | payment.refunded | payment.disputed | dispute.resolved | payout.paid | subscription.* (los subscription.* y dispute.resolved solo llegan por webhook)" },
                { "key": "created[gte]", "value": "", "description": "ISO 8601" },
                { "key": "created[lte]", "value": "", "description": "ISO 8601" },
                { "key": "sandbox", "value": "", "description": "true (prueba) | false (producción). Sin valor muestra solo producción." },
                { "key": "limit", "value": "10", "description": "Máx 100 (default 10)" },
                { "key": "starting_after", "value": "", "description": "Cursor por id de evento" },
                { "key": "ending_before", "value": "", "description": "Cursor por id de evento" }
              ]
            },
            "description": "Historial de eventos de negocio (mismos evt_... que se firman en los webhooks) para conciliar."
          },
          "response": []
        }
      ]
    }
  ]
}