Saldo
Lee tu saldo disponible y retirable.
El saldo de sandbox es virtual. Los pagos de sandbox pasan de inmediato a available_amount, sin esperar a una fecha valor, así que puedes probar los retiros enseguida.
El saldo de producción procede de cobros reales. Un pago espera en pending_settlement_amount hasta su fecha valor y luego pasa a available_amount.
Obtener el saldo
Respuesta · 200
Resumen del saldo.
Balance
Respuesta · Ejemplo
{
"currency_code": "USD",
"available_amount": "48200.00",
"pending_settlement_amount": "250.00",
"environment": "live"
}
Errores posibles
GET/api/v3/balance/withdrawableObtener el saldo retirable
Respuesta · 200
Resumen del saldo retirable.
WithdrawableBalance
Respuesta · Ejemplo
{
"currency_code": "USD",
"withdrawable_amount": "48200.00",
"can_withdraw": true,
"environment": "live"
}
Errores posibles
Reembolsos
Solicita un reembolso o anulación y haz su seguimiento.
En producción, HTTP 202 significa que se ha recibido la solicitud, no que el reembolso esté hecho. Sigue el resultado mediante los endpoints de estado: requested, luego awaiting_provider_manual, luego completed; o rejected / cancelled.
En sandbox, una solicitud se resuelve de inmediato (completed por defecto). Envía X-CAV-Sandbox-Scenario: rejected para probar un reembolso rechazado.
Las solicitudes de producción se revisan. Sigue la reversión hasta completed, rejected o cancelled. Solo un refund completado envía payment.refunded; sigue un void con GET.
POST/api/v3/refundsRequiere Idempotency-KeySolicitar un reembolso o una anulación
Parámetros
Cuerpo de la solicitud
Cuerpo de la solicitud · Ejemplo
{
"payment_code": "ab34cdef",
"operation_type": "refund",
"reason": "Customer cancelled the order."
}
Respuesta · 202
Reversión solicitada. Se revisa y se envía al proveedor de forma manual. Con una clave de sandbox se devuelve el resultado simulado (environment sandbox); una repetición idempotente también devuelve 202.
Reversal
Respuesta · Ejemplo
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"operation": "refund",
"status": "requested",
"amount": "250.00",
"currency": "USD",
"reason": "Customer cancelled the order.",
"provider_reference": "string",
"provider_refunded_at": "2026-09-26T09:00:00.000Z",
"created_at": "2026-09-26T09:00:00.000Z",
"updated_at": "2026-09-26T09:00:00.000Z",
"payment_code": "ab34cdef",
"environment": "live"
}
Errores posibles
Listar reembolsos
Parámetros
Respuesta · 200
Reembolsos paginados.
Respuesta · Ejemplo
{
"data": [
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"operation": "refund",
"status": "requested",
"amount": "250.00",
"currency": "USD",
"reason": "Customer cancelled the order.",
"provider_reference": "string",
"provider_refunded_at": "2026-09-26T09:00:00.000Z",
"created_at": "2026-09-26T09:00:00.000Z",
"updated_at": "2026-09-26T09:00:00.000Z",
"payment_code": "ab34cdef",
"environment": "live"
}
],
"meta": {
"page": 1,
"per_page": 20,
"total": 1,
"total_pages": 1
}
}
Errores posibles
Obtener el estado de un reembolso
Parámetros
Respuesta · 200
La reversión.
Objeto: Reversal (campos en Solicitar un reembolso o una anulación).
Respuesta · Ejemplo
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"operation": "refund",
"status": "requested",
"amount": "250.00",
"currency": "USD",
"reason": "Customer cancelled the order.",
"provider_reference": "string",
"provider_refunded_at": "2026-09-26T09:00:00.000Z",
"created_at": "2026-09-26T09:00:00.000Z",
"updated_at": "2026-09-26T09:00:00.000Z",
"payment_code": "ab34cdef",
"environment": "live"
}
Errores posibles
Notificación
Cuando se completa un reembolso, se envía una notificación payment.refunded firmada a la URL de webhook del pago. Las cabeceras, la firma y los reintentos son los mismos que en Webhooks. Un void no envía notificación.
Notificación payment.refunded firmada a la URL del comercio
Cuerpo de la solicitud
Cuerpo de la solicitud · Ejemplo
{
"event_id": "B5D4E456-EFC1-4EC2-A613-D64A16E45BD5",
"event_type": "payment.refunded",
"environment": "sandbox",
"occurred_at": "2026-09-28T12:00:00.000Z",
"refund": {
"public_id": "A1B2C3D4-E5F6-4789-8ABC-DEF012345678",
"status": "completed",
"amount": "100.00",
"currency_code": "USD",
"completed_at": "2026-09-28T12:00:00.000Z"
},
"payment": {
"public_id": "11111111-2222-4333-8444-555555555555",
"code": "ab34cdef",
"merchant_reference": "SIP-2026-0001"
},
"order": {
"public_id": "66666666-7777-4888-8999-AAAAAAAAAAAA"
}
}
Retiros
Solicita un retiro de USDT (TRC20) y haz su seguimiento.
En producción, HTTP 201 significa que la solicitud se ha aceptado y el importe queda retenido, no que se haya enviado USDT. Comprueba status y tx_hash y revisa dos veces la dirección: una transferencia en la cadena no se puede deshacer.
Un retiro de sandbox descuenta del saldo virtual y nunca envía nada a la cadena. Sigue las mismas reglas que en producción, incluidos el mínimo, el tope diario y el tipo de conversión. Envía X-CAV-Sandbox-Scenario: rejected para probar un rechazo. En sandbox se acepta la dirección cero de TRON como destino; en producción se rechazan las direcciones de quema con 1000030.
El mínimo y el tope diario los fija Manuell para cada cuenta; por debajo del mínimo la API devuelve 9000019 y por encima del tope, 9000021. En producción, un operador de Manuell envía los USDT y registra tx_hash (sent), o rechaza la solicitud indicando el motivo (rejected) y el importe vuelve a tu saldo.
POST/api/v3/withdrawalsRequiere Idempotency-KeySolicitar un retiro de USDT
Parámetros
Cuerpo de la solicitud
Cuerpo de la solicitud · Ejemplo
{
"amount": "250.00",
"address": "REPLACE_WITH_YOUR_TRON_ADDRESS",
"address_acknowledged": true
}
Respuesta · 201
Retiro solicitado. El saldo queda retenido; el envío en la cadena se realiza manualmente. Con una clave de sandbox se devuelve el resultado simulado (environment sandbox); una repetición idempotente también devuelve 201.
Withdrawal
Respuesta · Ejemplo
{
"id": "7F0C2A94-3B1E-4D58-9A6F-1C2D3E4F5A6B",
"status": "requested",
"amount": "250.00",
"currency": "USD",
"asset": "USDT",
"network": "TRC20",
"address": "REPLACE_WITH_YOUR_TRON_ADDRESS",
"usdt_amount": "249.000000",
"tx_hash": null,
"rejection_reason": null,
"requested_at": "2026-09-26T09:30:00.000Z",
"processed_at": null,
"created_at": "2026-09-26T09:30:00.000Z",
"environment": "live"
}
Errores posibles
Listar retiros
Parámetros
Respuesta · 200
Retiros paginados.
Respuesta · Ejemplo
{
"data": [
{
"id": "7F0C2A94-3B1E-4D58-9A6F-1C2D3E4F5A6B",
"status": "requested",
"amount": "250.00",
"currency": "USD",
"asset": "USDT",
"network": "TRC20",
"address": "REPLACE_WITH_YOUR_TRON_ADDRESS",
"usdt_amount": "249.000000",
"tx_hash": null,
"rejection_reason": null,
"requested_at": "2026-09-26T09:30:00.000Z",
"processed_at": null,
"created_at": "2026-09-26T09:30:00.000Z",
"environment": "live"
}
],
"meta": {
"page": 1,
"per_page": 20,
"total": 1,
"total_pages": 1
}
}
Errores posibles
GET/api/v3/withdrawals/{id}Obtener el estado de un retiro
Parámetros
Respuesta · 200
El retiro.
Objeto: Withdrawal (campos en Solicitar un retiro de USDT).
Respuesta · Ejemplo
{
"id": "7F0C2A94-3B1E-4D58-9A6F-1C2D3E4F5A6B",
"status": "requested",
"amount": "250.00",
"currency": "USD",
"asset": "USDT",
"network": "TRC20",
"address": "REPLACE_WITH_YOUR_TRON_ADDRESS",
"usdt_amount": "249.000000",
"tx_hash": null,
"rejection_reason": null,
"requested_at": "2026-09-26T09:30:00.000Z",
"processed_at": null,
"created_at": "2026-09-26T09:30:00.000Z",
"environment": "live"
}
Errores posibles
Disputas
Lista las disputas y envía tus pruebas.
Las disputas vienen de las redes de tarjetas, así que en sandbox creas tú mismo una disputa de prueba con POST /api/v3/sandbox/disputes. Consulta Probar las operaciones de la cuenta.
Manuell registra una disputa cuando el banco se lo notifica. El importe en disputa se descuenta de tu saldo (el saldo puede quedar en negativo y can_withdraw pasa a false) y se restituye si ganas. Envía tus pruebas antes de evidence_due_at; una Idempotency-Key nueva sustituye tu nota anterior mientras la disputa siga abierta.
Listar disputas
Parámetros
Respuesta · 200
Disputas paginadas.
Dispute
Respuesta · Ejemplo
{
"data": [
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"service": "api",
"amount": "250.00",
"currency": "USD",
"status": "open",
"reason": "fraud",
"reason_note": "string",
"occurred_on": "2026-09-26",
"evidence_due_at": "2026-09-26T09:00:00.000Z",
"evidence_submitted_at": "2026-09-26T09:00:00.000Z",
"merchant_evidence_note": "string",
"merchant_evidence_submitted_at": "2026-09-26T09:00:00.000Z",
"resolved_at": "2026-09-26T09:00:00.000Z",
"created_at": "2026-09-26T09:00:00.000Z",
"payment_code": "ab34cdef",
"environment": "live"
}
],
"meta": {
"page": 1,
"per_page": 20,
"total": 1,
"total_pages": 1
}
}
Errores posibles
Obtener una disputa
Parámetros
Respuesta · 200
La disputa.
Objeto: Dispute (campos en Listar disputas).
Respuesta · Ejemplo
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"service": "api",
"amount": "250.00",
"currency": "USD",
"status": "open",
"reason": "fraud",
"reason_note": "string",
"occurred_on": "2026-09-26",
"evidence_due_at": "2026-09-26T09:00:00.000Z",
"evidence_submitted_at": "2026-09-26T09:00:00.000Z",
"merchant_evidence_note": "string",
"merchant_evidence_submitted_at": "2026-09-26T09:00:00.000Z",
"resolved_at": "2026-09-26T09:00:00.000Z",
"created_at": "2026-09-26T09:00:00.000Z",
"payment_code": "ab34cdef",
"environment": "live"
}
Errores posibles
POST/api/v3/disputes/{id}/evidenceRequiere Idempotency-KeyEnviar pruebas de la disputa
Parámetros
Cuerpo de la solicitud
Cuerpo de la solicitud · Ejemplo
{
"note": "Order 4821 was delivered on 2026-09-25. Carrier reference ABC123."
}
Respuesta · 200
Pruebas registradas; el estado de la disputa no cambia. Una repetición idempotente idéntica devuelve el cuerpo de la respuesta original.
Objeto: Dispute (campos en Listar disputas).
Respuesta · Ejemplo
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"service": "api",
"amount": "250.00",
"currency": "USD",
"status": "open",
"reason": "fraud",
"reason_note": "string",
"occurred_on": "2026-09-26",
"evidence_due_at": "2026-09-26T09:00:00.000Z",
"evidence_submitted_at": "2026-09-26T09:00:00.000Z",
"merchant_evidence_note": "string",
"merchant_evidence_submitted_at": "2026-09-26T09:00:00.000Z",
"resolved_at": "2026-09-26T09:00:00.000Z",
"created_at": "2026-09-26T09:00:00.000Z",
"payment_code": "ab34cdef",
"environment": "live"
}
Errores posibles
Gestionar entregas
Inspecciona las entregas de webhook y reintenta las fallidas.
La dirección que recibe las notificaciones se define por entorno en “API Key e Integración”. Los endpoints de abajo listan las entregas y vuelven a poner en cola las fallidas.
GET/api/v3/webhooks/deliveriesListar entregas de webhook
Parámetros
Respuesta · 200
Entregas paginadas.
WebhookDelivery
Respuesta · Ejemplo
{
"data": [
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"event": "payment.paid",
"status": "pending",
"payment_code": null,
"attempt_count": 1,
"last_status_code": null,
"last_error": null,
"last_error_code": null,
"last_error_message": null,
"next_attempt_at": null,
"delivered_at": null,
"created_at": "2026-09-26T09:00:00.000Z"
}
],
"meta": {
"page": 1,
"per_page": 20,
"total": 1,
"total_pages": 1
}
}
Errores posibles
GET/api/v3/webhooks/deliveries/{id}Obtener una entrega de webhook
Parámetros
Respuesta · 200
La entrega, incluidos la URL y el payload.
WebhookDeliveryDetail
Respuesta · Ejemplo
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"event": "payment.paid",
"status": "pending",
"payment_code": null,
"attempt_count": 1,
"last_status_code": null,
"last_error": null,
"last_error_code": null,
"last_error_message": null,
"next_attempt_at": null,
"delivered_at": null,
"created_at": "2026-09-26T09:00:00.000Z",
"url": "string",
"payload": null
}
Errores posibles
POST/api/v3/webhooks/deliveries/{id}/retryRequiere Idempotency-KeyReintentar una entrega fallida
Parámetros
Respuesta · 200
Entrega fallida vuelta a encolar. Una repetición idempotente idéntica devuelve la respuesta original de encolado sin un nuevo reintento.
Objeto: WebhookDeliveryDetail (campos en Obtener una entrega de webhook).
Respuesta · Ejemplo
{
"id": "9B2E6F3A-0C1D-4E5F-8A7B-000000000001",
"event": "payment.paid",
"status": "pending",
"payment_code": null,
"attempt_count": 1,
"last_status_code": null,
"last_error": null,
"last_error_code": null,
"last_error_message": null,
"next_attempt_at": null,
"delivered_at": null,
"created_at": "2026-09-26T09:00:00.000Z",
"url": "string",
"payload": null
}
Errores posibles
Errores de entrega
last_error es un campo heredado; usa last_error_code en integraciones nuevas.
Estado del servicio y mantenimiento
Algunos servicios pueden ponerse en mantenimiento de forma temporal. Solo se ven afectadas las operaciones nuevas; esta sección explica qué se detiene, qué sigue funcionando y cómo consultar el estado.
GET/api/v3/service-statusPúblicoObtener el estado del servicio
Respuesta · 200
Servicios en mantenimiento (la lista puede estar vacía).
ServiceStatusItem
Respuesta · Ejemplo
{
"data": [
{
"service": "api_collection",
"until": "2026-10-01T12:00:00Z",
"note": "Planned maintenance."
}
]
}
Otras respuestas
429Se superó el límite de solicitudes.
Errores posibles
Probar las operaciones de la cuenta
El saldo, los reembolsos, los retiros y las disputas funcionan en sandbox con los mismos endpoints, cuerpos y códigos de error que en producción.
- Los pagos de sandbox pasan de inmediato a
available_amount, sin esperar a una fecha valor. - Las solicitudes de reembolso y de retiro se resuelven de inmediato. La cabecera
X-CAV-Sandbox-Scenario elige el resultado. - Las disputas vienen del banco, así que en sandbox creas una con
POST /api/v3/sandbox/disputes.
Revisa las pruebas de reembolsos, retiros y disputas en “Operaciones Sandbox”.
Elegir el resultado
Las solicitudes de reembolso y de retiro usan los mismos endpoints y cuerpos que en producción. Para elegir el resultado, añade la cabecera opcional X-CAV-Sandbox-Scenario. No forma parte de la firma. Con una clave de producción la cabecera se rechaza con 422 (1000001), de modo que una prueba nunca pueda convertirse en una solicitud real.
X-CAV-Sandbox-Scenario
X-CAV-Sandbox-Scenario: rejected
Disputa de prueba
Las disputas proceden de las redes de tarjetas y no se pueden iniciar desde tu lado en producción. Es el único endpoint exclusivo de sandbox: crea una disputa de prueba para un pago de sandbox ya cobrado y devuelve el mismo objeto Dispute que en producción.
POST/api/v3/sandbox/disputesRequiere Idempotency-KeyCrear una disputa de sandbox para un pago de sandbox pagado
Cuerpo de la solicitud
Cuerpo de la solicitud · Ejemplo
{
"payment_code": "ab34cdef",
"scenario": "open",
"reason": "fraud"
}
Respuesta · 201
Disputa registrada; una repetición idempotente devuelve la misma disputa.
Objeto: Dispute (campos en Listar disputas).
Respuesta · Ejemplo
{
"id": "B5D4E456-EFC1-4EC2-A613-D64A16E45BD5",
"service": "api",
"amount": "250.00",
"currency": "USD",
"status": "open",
"reason": "fraud",
"reason_note": null,
"occurred_on": "2026-09-30",
"evidence_due_at": "2026-10-07T09:00:00.000Z",
"evidence_submitted_at": null,
"merchant_evidence_note": null,
"merchant_evidence_submitted_at": null,
"resolved_at": null,
"created_at": "2026-09-30T09:00:00.000Z",
"payment_code": "ab34cdef",
"environment": "sandbox"
}
Errores posibles