Avistadocs
Guías de Integración

Pruebas en Sandbox

¿Qué es el Sandbox?

El sandbox es un modo de prueba de su cuenta — no un entorno separado. Utiliza la misma API, misma URL base y mismos endpoints que producción. La diferencia es que su cuenta sandbox está conectada a un proveedor bancario simulado: las transacciones se procesan instantáneamente, sin transferencia real de fondos y sin PIX enviado al BACEN.

Sandbox y producción son cuentas separadas, cada una con sus propias credenciales (certificado, clientId, clientSecret). Su certificado puede ser compartido entre ambas cuentas dependiendo de la configuración — consulte con su gerente de cuenta.

Su código no cambia entre sandbox y producción. Cuando esté listo para salir a producción, simplemente cambie a las credenciales de su cuenta de producción. Sin cambios de endpoints, sin cambios de código.

Sandbox vs Producción

SandboxProducción
URL BaseMisma (https://api.avista.global)Misma
CuentaCuenta sandbox dedicadaCuenta producción dedicada
CredencialesCertificado + clientId/clientSecret propiosCertificado + clientId/clientSecret propios
SaldoSimulado (ficticio)Fondos reales
TransaccionesSimuladas (persistidas — consultables vía API)PIX real vía BACEN
WebhooksSimulados (~1s entrega), misma estructura de payloadReales, entrega depende del proveedor
X-Sandbox-ScenarioSoportado (controle el resultado de los webhooks)Retorna 400 Bad Request
DocumentaciónMisma que producción — todas las páginas de API Reference aplicanMisma

Comenzando con el Sandbox

Contacte a su gerente de cuenta o suporte@avista.global para solicitar una cuenta sandbox.

Recibirá un certificado y credenciales OAuth (clientId + clientSecret) para la cuenta sandbox.

Registre su URL de webhook vía POST /api/webhooks para recibir los eventos de webhook simulados.

En el dashboard, acceda a Configuración para confirmar que su cuenta está en modo sandbox.

Autentíquese, haga llamadas a la API y use el encabezado X-Sandbox-Scenario para simular diferentes resultados.


Descripción General

El encabezado X-Sandbox-Scenario le permite controlar el resultado del webhook para cualquier transacción. Sin él, el sandbox siempre retorna webhooks de éxito. Úselo para probar manejo de errores, retrasos y casos extremos.

Sin el encabezado X-Sandbox-Scenario, el sandbox siempre retorna webhooks de éxito. Para probar escenarios de error (saldo insuficiente, clave inválida, etc.), usted debe enviar el encabezado explícitamente en cada solicitud.

Esta funcionalidad opera solo en sandbox. En producción, el encabezado es ignorado y el comportamiento está determinado por el resultado real de la transacción.

Cómo Funciona

El X-Sandbox-Scenario no altera la respuesta HTTP -- la API siempre retorna 201 Created con status: "PENDING". El escenario simulado afecta únicamente al webhook asíncrono que llega a su URL de callback.

┌─────────────┐         ┌──────────────┐         ┌─────────────────┐
│   Su App    │──POST──▶│   API Avista  │──────▶  │  Proveedor Mock │
│             │◀──201───│              │         │                 │
│             │         │              │         │  Procesa el     │
│             │         │              │         │  escenario del  │
│             │         │              │         │  encabezado     │
│             │◀────────│──webhook─────│◀────────│                 │
│             │         │              │         │  ~1s después    │
└─────────────┘         └──────────────┘         └─────────────────┘
      │                                                  │
      │              Respuesta HTTP: siempre 201         │
      │              Webhook: éxito O error              │
      │              (depende del encabezado)             │
SolicitudRespuesta HTTPWebhook recibido
Sin X-Sandbox-Scenario201 PENDINGCONFIRMED (éxito)
Con X-Sandbox-Scenario: success201 PENDINGCONFIRMED (éxito)
Con X-Sandbox-Scenario: error:insufficient-funds201 PENDINGERROR con errorCode
Con X-Sandbox-Scenario: delayed:5s201 PENDINGCONFIRMED después de 5s extras

Cómo Usar

Agregue el encabezado X-Sandbox-Scenario a cualquier solicitud de Cash-In, Cash-Out o Refund:

curl -X POST https://api.avista.global/api/pix/cash-out \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Sandbox-Scenario: error:insufficient-funds" \
  -H "Content-Type: application/json" \
  -d '{
    "value": 150.00,
    "details": {
      "key": "recipient@email.com",
      "keyType": "EMAIL",
      "name": "Recipient Name",
      "document": "39284918812"
    },
    "externalId": "test-error-001"
  }'
const response = await axios.post(
  'https://api.avista.global/api/pix/cash-out',
  {
    value: 150.00,
    details: {
      key: 'recipient@email.com',
      keyType: 'EMAIL',
      name: 'Recipient Name',
      document: '39284918812',
    },
    externalId: 'test-error-001',
  },
  {
    headers: {
      Authorization: `Bearer ${token}`,
      'X-Sandbox-Scenario': 'error:insufficient-funds',
    },
  }
);
response = requests.post(
    "https://api.avista.global/api/pix/cash-out",
    json={
        "value": 150.00,
        "details": {
            "key": "recipient@email.com",
            "keyType": "EMAIL",
            "name": "Recipient Name",
            "document": "39284918812",
        },
        "externalId": "test-error-001",
    },
    headers={
        "Authorization": f"Bearer {token}",
        "X-Sandbox-Scenario": "error:insufficient-funds",
    },
)

Escenarios Disponibles

Escenarios de Error

Simule diferentes tipos de fallos en webhooks:

Valor del EncabezadoDescripciónEstado del Webhook
error:insufficient-fundsCuenta sin saldo suficienteERROR
error:invalid-pix-keyLa clave PIX no existe en DICTERROR
error:document-mismatchEl documento no coincide con el titular de la claveERROR
error:account-blockedCuenta de destino bloqueada o cerradaERROR
error:duplicate-idID de envío duplicadoERROR

Escenario de Éxito

Valor del EncabezadoDescripciónEstado del Webhook
successFuerza éxito (comportamiento predeterminado)CONFIRMED
(sin encabezado)Comportamiento predeterminado del sandboxCONFIRMED

Escenarios de Retraso

Simule procesamiento lento para probar timeouts y reintentos:

Valor del EncabezadoDescripciónEstado del Webhook
delayed:5sÉxito después de 5 segundos adicionalesCONFIRMED
delayed:30sÉxito después de 30 segundos adicionalesCONFIRMED
delayed:60sÉxito después de 60 segundos adicionalesCONFIRMED

El retraso máximo permitido es de 120 segundos. Los valores superiores serán limitados automáticamente.

Ejemplos de Webhooks Recibidos

Webhook de Éxito (predeterminado)

{
  "event": "CashOut",
  "status": "CONFIRMED",
  "transactionType": "PIX",
  "movementType": "DEBIT",
  "transactionId": "12345",
  "externalId": "test-success-001",
  "endToEndId": "E17745159XI4QA0EGFU",
  "feeAmount": 0.50,
  "originalAmount": 150.00,
  "finalAmount": 150.50,
  "processingDate": "2026-03-26T10:00:00.000Z",
  "errorCode": null,
  "errorMessage": null,
  "counterpart": {
    "name": "Recipient Name",
    "document": "*.284.918-**",
    "bank": {}
  },
  "metadata": {}
}

Webhook de Error (error:insufficient-funds)

{
  "event": "CashOut",
  "status": "ERROR",
  "transactionType": "PIX",
  "movementType": "DEBIT",
  "transactionId": "12345",
  "externalId": "test-error-001",
  "endToEndId": null,
  "feeAmount": 0.50,
  "originalAmount": 150.00,
  "finalAmount": 150.50,
  "processingDate": "2026-03-26T10:00:00.000Z",
  "errorCode": "INSUFFICIENT_FUNDS",
  "errorMessage": "Conta sem saldo",
  "counterpart": {
    "name": null,
    "document": null,
    "bank": {}
  },
  "metadata": {}
}

Cuando el estado es ERROR, el campo endToEndId será null (ya que el PIX nunca fue confirmado por el Banco Central) y los campos errorCode y errorMessage describen la razón del fallo.

Endpoints Compatibles

El encabezado X-Sandbox-Scenario funciona con todos los endpoints transaccionales:

EndpointMétodoDescripción
/api/pix/cash-inPOSTGenerar cobro PIX (QR Code)
/api/pix/cash-outPOSTPago PIX por clave
/api/pix/cash-out/qrcodePOSTPago PIX por QR Code
/api/pix/refund-inPOSTSolicitud de devolución

Escenarios MED

El módulo MED (Mecanismo Especial de Devolución) no se puede probar directamente vía X-Sandbox-Scenario. Los MEDs dependen de la integración con BACEN y con el proveedor PIX configurado (Woovi, Hyperwallet, etc.), por lo que no pueden ser simulados por el proveedor mock del sandbox.

Para validar su integración con webhooks MED (MedCreated, MedAccepted, MedRejected):

Use POST /api/webhooks/{id}/resend para reenviar un webhook MED existente de su cuenta a la URL configurada. Útil para depurar el handler localmente tras modificaciones.

Use GET /api/med para listar los MEDs asociados a la cuenta, filtrar por estado y conciliarlos con sus transacciones locales.

Si necesita simular un flujo MED de punta a punta (apertura, análisis, aprobación/rechazo), contacte a suporte@avista.global para solicitar acceso al ambiente de homologación.

Los webhooks MED usan la misma estructura de autenticación (Basic Auth) y reintentos que los demás eventos. El payload completo está documentado en MedCreated, MedAccepted y MedRejected.

Comportamiento

La API procesa la solicitud normalmente y retorna 201 Created con estado PENDING. El encabezado no altera la respuesta inmediata -- solo el webhook posterior.

Después de ~1 segundo (o más, si usa delayed:), el webhook se envía a la URL configurada con el escenario simulado.

Su sistema recibe el webhook con el estado correspondiente al escenario (CONFIRMED o ERROR) y debe procesarlo acorde.

Importante: El encabezado X-Sandbox-Scenario controla solo el webhook. La respuesta HTTP del endpoint siempre retorna éxito (201 Created) con status: "PENDING", independientemente del escenario elegido. El resultado final (éxito o error) llega vía webhook.

Restricciones

El encabezado X-Sandbox-Scenario funciona exclusivamente con cuentas configuradas en modo sandbox. Si su cuenta está configurada con un proveedor de producción y envía el encabezado, la API retornará un error:

{
  "statusCode": 400,
  "message": "X-Sandbox-Scenario header is only supported in sandbox mode. This account is not configured with a sandbox provider."
}

Asegúrese de que su cuenta esté en modo sandbox antes de usar esta funcionalidad. Si recibe este error, contacte a suporte@avista.global para verificar la configuración de su cuenta.

Mejores Prácticas

Pruebe todos los escenarios

Implemente manejo para cada estado de webhook (CONFIRMED, PENDING, ERROR) antes de ir a producción.

Valide los campos de error

Cuando status es ERROR, use errorCode y errorMessage para determinar la acción apropiada (reintentar, notificar al usuario, etc.).

Pruebe con retraso

Use escenarios delayed: para verificar que su sistema maneje correctamente webhooks que tardan más en llegar.

Idempotencia

Use transactionId como clave de idempotencia. El mismo webhook puede ser reenviado en caso de fallo en la entrega.

En esta página