What can be refunded
QR, announced transfer, dedicated deposit account and collect payins
cannot be refunded through this path (
refund_not_supported): those
rails have no refund capability at the processor. POS charges are
refunded through the crypto rail with
POST /v1/pos/charges/{id}/refunds.
Lifecycle
Request a refund
1
Refund the full payin
Omit The response is
amount to refund everything that is left to refund:201 when the processor approves right away, 202 when
it is still in flight (with reconciliation_required: true) and 422
when it declines. An ambiguous provider result is persisted as the same
refund claim and is reconciled by the provider webhook or the read-only
sweep; it is never dispatched again by the platform.2
Or refund part of it
Send You can request several partials on the same payin. When the sum exceeds
what is left to refund, we answer
amount in the payin currency (not in USDT). The debit is
computed proportionally to the value that payin brought in:422 refund_exceeds_payin without
touching your balance.3
Void instead of refunding (same day)
If the payin has not settled at the processor yet, If the payin can no longer be voided, the processor declines it and you
can request a regular refund.
kind: "void" voids
it instead of creating a refund. The effect on your balance is the same;
for the cardholder, a void usually shows up on their statement sooner.4
Check the status
Second factor
POST /v1/payins/{payinID}/refunds takes money out of your account,
so it requires a second factor when a person originates it with their
session (action payin_refund). If your organization has it enabled,
the first call answers 403 otp_required with a challenge_id: verify
the code and repeat the request with the challenge token.
API keys are exempt by design, same as everywhere else on the
platform: your backend integrates without friction.
History and filters
status (pending, completed, failed), kind (refund,
void, chargeback), payin_id, from/to and pagination.
How much of each payin is refunded
Every payin exposes its refund progress, and you can filter the payin list by it:
The payin does not change status: it stays
credited. Your
financial history is never rewritten; the refund is a new movement.
Chargebacks
When the card issuer imposes a chargeback, the money is already gone: it is neither your decision nor ours. In that case:- We debit the amount from your balance automatically, with
kind: "chargeback". - The debit is applied even if you have no balance: the account can go negative and that debt is netted against your next credits.
- You receive the
payin_refundedwebhook withkind: "chargeback"and, if the balance went negative, thebalance_afterfield.
What we debit across refunds and chargebacks on the same payin never
exceeds what that payin brought in. If a chargeback arrives after you
already refunded, the debit is capped to whatever was left — or lands at
zero with the reason recorded — so we never charge you the same money
twice.
The payin_refunded webhook
Emitted on every final state (completed or failed) and on
chargebacks. pending refunds do not emit: wait for the final state.
failure_reason; a chargeback that leaves the
account negative carries balance_after.
Receipt
Every refund has its PDF receipt with your organization’s branding and a public verification code:Errors
Full catalogue in Errors.
FAQ
Do I get the fee back when I refund?
Do I get the fee back when I refund?
No. The fee and the FX margin of the original payin are not refundable:
we debit the gross value the payin brought in and the house keeps what
it charged. This is the standard behaviour of the card industry.
I requested a refund and got a 202. Should I retry?
I requested a refund and got a 202. Should I retry?
Not with another key. A
202 means the refund may already have been
executed and we do not have confirmation yet. Retrying with a new key
would be a second real refund. Repeat the request with the same
idempotency_key (we return the same object) or wait for the
payin_refunded webhook.Which currency is debited?
Which currency is debited?
The asset the payin was credited in (
credit_asset): USD, or BOB/MXN/ARS for payins held
in local fiat — regardless of your current default settlement asset. We
never convert on your behalf: if you do not have enough of that asset, we
answer insufficient_funds. The response and the payin_refunded webhook
carry the authoritative debited_asset and debited_amount (see
Actual debit asset).Can I refund a payin from months ago?
Can I refund a payin from months ago?
As long as the payin is
credited and has refundable value left, yes on
our side. The real limit comes from the processor and the card scheme
rules (usually 180 days); past that window the refund is declined with
failed and the reserved amount returns to your balance untouched.What if a chargeback leaves my balance negative?
What if a chargeback leaves my balance negative?
The account is allowed to go negative for this reason only. The debt is
settled automatically against your next credits; meanwhile, operations
that move money out still require available balance.
Can my organization admin refund too?
Can my organization admin refund too?
Yes. The admin panel can originate the refund on any account of the
organization; it is audited with the admin who executed it and shows up
in your history with
requested_by: "admin".Actual debit asset
Refund responses andpayin_refunded include authoritative
debited_asset and debited_amount; usdt_debited remains the equivalent.
balance_after is expressed in the actual debit asset. Local-fiat disputes
are not supported and return 409 dispute_fiat_unsupported.