Balance
Read your available and withdrawable balance.
The sandbox balance is virtual. Sandbox payments move to available_amount at once, without waiting for a value date, so you can test withdrawals right away.
The live balance comes from real collections. A payment waits in pending_settlement_amount until its value date, then moves to available_amount.
Get balance
Response · 200
Balance summary.
Balance
Response · Example
{
"currency_code": "USD",
"available_amount": "48200.00",
"pending_settlement_amount": "250.00",
"environment": "live"
}
Possible errors
GET/api/v3/balance/withdrawableGet withdrawable balance
Response · 200
Withdrawable summary.
WithdrawableBalance
Response · Example
{
"currency_code": "USD",
"withdrawable_amount": "48200.00",
"can_withdraw": true,
"environment": "live"
}
Possible errors
Refunds
Request a refund or void and track it.
In live, HTTP 202 means the request was received, not that the refund is done. Follow the result through the status endpoints: requested, then awaiting_provider_manual, then completed; or rejected / cancelled.
In sandbox a request is finalized immediately (completed by default). Send X-CAV-Sandbox-Scenario: rejected to test a rejected refund.
Live requests are reviewed. Track the returned reversal until it is completed, rejected or cancelled. refund reverses a settled payment; void cancels one that is not final. Only a completed refund sends payment.refunded; track a void with GET.
POST/api/v3/refundsIdempotency-Key requiredRequest a refund or void
Parameters
Request body
Request body · Example
{
"payment_code": "ab34cdef",
"operation_type": "refund",
"reason": "Customer cancelled the order."
}
Response · 202
Reversal requested. It is reviewed and sent to the provider manually. With a sandbox key the simulated result is returned (environment sandbox); an idempotent replay also returns 202.
Reversal
Response · Example
{
"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"
}
Possible errors
List refunds
Parameters
Response · 200
Paginated refunds.
Response · Example
{
"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
}
}
Possible errors
Get refund status
Parameters
Response · 200
The reversal.
Object: Reversal (fields are listed under Request a refund or void).
Response · Example
{
"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"
}
Possible errors
Notification
When a refund completes, a signed payment.refunded notification is sent to the payment's webhook URL. Headers, signature and retries are the same as in Webhooks. A void sends no notification.
Signed payment.refunded notification to the merchant URL
Request body
Request body · Example
{
"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"
}
}
Withdrawals
Request a USDT (TRC20) withdrawal and track it.
In live, HTTP 201 means the request was accepted and the amount is held, not that the USDT was sent. Check status and tx_hash, and double-check the address: a transfer on the chain cannot be reversed.
A sandbox withdrawal debits the virtual balance and never sends anything on the chain. It follows the same rules as live, including the minimum, the daily cap and the conversion rate. Send X-CAV-Sandbox-Scenario: rejected to test a rejection. The sandbox accepts the TRON zero address as a destination; live rejects burn addresses with 1000030.
The minimum and the daily cap are set per account by Manuell; below the minimum the API returns 9000019, above the cap 9000021. In live, an operator of Manuell sends the USDT and records tx_hash (sent), or rejects the request with a reason (rejected) and the amount returns to your balance.
POST/api/v3/withdrawalsIdempotency-Key requiredRequest a USDT withdrawal
Parameters
Request body
Request body · Example
{
"amount": "250.00",
"address": "REPLACE_WITH_YOUR_TRON_ADDRESS",
"address_acknowledged": true
}
Response · 201
Withdrawal requested. Balance is held; the on-chain send is performed manually. With a sandbox key the simulated result is returned (environment sandbox); an idempotent replay also returns 201.
Withdrawal
Response · Example
{
"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"
}
Possible errors
List withdrawals
Parameters
Response · 200
Paginated withdrawals.
Response · Example
{
"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
}
}
Possible errors
GET/api/v3/withdrawals/{id}Get withdrawal status
Parameters
Response · 200
The withdrawal.
Object: Withdrawal (fields are listed under Request a USDT withdrawal).
Response · Example
{
"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"
}
Possible errors
Disputes
List chargebacks and submit your evidence.
Disputes come from the card networks, so in sandbox you create a test dispute yourself with POST /api/v3/sandbox/disputes. See Testing account operations.
Manuell records a dispute when the bank notifies it. The disputed amount is deducted from your balance (the balance can go negative and can_withdraw becomes false) and is restored if you win. Send your evidence before evidence_due_at; a new Idempotency-Key replaces your earlier note while the dispute is open.
List disputes
Parameters
Response · 200
Paginated disputes.
Dispute
Response · Example
{
"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
}
}
Possible errors
Get a dispute
Parameters
Response · 200
The dispute.
Object: Dispute (fields are listed under List disputes).
Response · Example
{
"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"
}
Possible errors
POST/api/v3/disputes/{id}/evidenceIdempotency-Key requiredSubmit dispute evidence
Parameters
Request body
Request body · Example
{
"note": "Order 4821 was delivered on 2026-09-25. Carrier reference ABC123."
}
Response · 200
Evidence recorded; the dispute status does not change. An identical idempotent replay returns the original response body.
Object: Dispute (fields are listed under List disputes).
Response · Example
{
"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"
}
Possible errors
Manage deliveries
Inspect webhook deliveries and retry failed ones.
The address that receives notifications is set per environment on “API Key & Integration”. The endpoints below list deliveries and requeue failed ones.
GET/api/v3/webhooks/deliveriesList webhook deliveries
Parameters
Response · 200
Paginated deliveries.
WebhookDelivery
Response · Example
{
"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
}
}
Possible errors
GET/api/v3/webhooks/deliveries/{id}Get webhook delivery
Parameters
Response · 200
The delivery, including url and payload.
WebhookDeliveryDetail
Response · Example
{
"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
}
Possible errors
POST/api/v3/webhooks/deliveries/{id}/retryIdempotency-Key requiredRetry a failed delivery
Parameters
Response · 200
Failed delivery requeued. An identical idempotent replay returns the original queued response without another retry.
Object: WebhookDeliveryDetail (fields are listed under Get webhook delivery).
Response · Example
{
"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
}
Possible errors
Delivery errors
last_error is a legacy field; use last_error_code in new integrations.
Service status and maintenance
Some services can be put under maintenance temporarily. Only new work is affected; this section shows what stops, what keeps working and how to check the status.
GET/api/v3/service-statusPublicGet service status
Response · 200
Services under maintenance (the list can be empty).
ServiceStatusItem
Response · Example
{
"data": [
{
"service": "api_collection",
"until": "2026-10-01T12:00:00Z",
"note": "Planned maintenance."
}
]
}
Other responses
429Request limit exceeded.
Possible errors
Testing account operations
Balance, refunds, withdrawals and disputes work in sandbox with the same endpoints, bodies and error codes as in live.
- Sandbox payments move to
available_amount at once, without waiting for a value date. - Refund and withdrawal requests are finalized immediately. The
X-CAV-Sandbox-Scenario header selects the outcome. - Disputes come from the bank, so in sandbox you create one with
POST /api/v3/sandbox/disputes.
Review refund, withdrawal and dispute tests in “Sandbox operations”.
Choosing the outcome
Refund and withdrawal requests use the same endpoints and bodies as live. To choose the outcome, add the optional X-CAV-Sandbox-Scenario header. It is not part of the signature. On a live key the header is rejected with 422 (1000001) so that a test can never become a real request.
X-CAV-Sandbox-Scenario
X-CAV-Sandbox-Scenario: rejected
Test dispute
Disputes come from the card networks and cannot be started from your side in live. This is the only sandbox-only endpoint: it creates a test dispute for a paid sandbox payment and returns the same Dispute object as live.
POST/api/v3/sandbox/disputesIdempotency-Key requiredCreate a sandbox dispute for a paid sandbox payment
Request body
Request body · Example
{
"payment_code": "ab34cdef",
"scenario": "open",
"reason": "fraud"
}
Response · 201
Dispute recorded; an idempotent replay returns the same dispute.
Object: Dispute (fields are listed under List disputes).
Response · Example
{
"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"
}
Possible errors