Money coming in
One call from you. We pick the provider, watch the payment, and tell you when it is settled.
Money going out
Check the destination first if you like. Then one call, and it executes at once — no approval step on our side.
Money going back
A refund is something you ask for, against one payin. A reversal is something that happens to you — we tell you, signed.
Scroll sideways to follow the arrows, or open “As text” below.
Your platform
Your backend, holding your API key.
Aurumsys
The orchestrator: one API in front of every provider.
Provider B · second · takes over if A refuses
Provider A
First in your routing order for this method and currency.
Payer
Your customer, in their browser.
Inside every request
what the orchestrator does between your call and the providerVerify
Your API key and its scope are checked before anything else happens.
Once only
The same Idempotency-Key never creates a second payment. A repeat gets the first answer again.
Ask you first
Optional. With the hook on, we ask your endpoint before any provider is touched. A no stops here.
Route
Your routing order picks the provider for this method and currency.
Cascade
A provider that refuses can be followed by the next in your order. Same id, one answer, every attempt on record.
Watch
Provider notices are verified before they count. An unclear answer is re-checked with the provider until it is sure.
Tell you
Every status you could not have learned yourself arrives as a signed callback, retried with backoff until you answer.
Where a payment can be
amber: wait · green: settle · red: show the reason · dashed: the rare paths, explained in the guideAs text
One call from you. We pick the provider, watch the payment, and tell you when it is settled.
Who takes part: Your platform (your backend, holding your API key) · Aurumsys (the orchestrator: one API in front of every provider) · Provider A (first in your routing order for this method and currency; Provider B: second · takes over if A refuses; Provider C: third) · Payer (your customer, in their browser).
The journey
- Your platform → Aurumsys: Create the payin:
POST /v1/payins, with anIdempotency-Key. - Aurumsys → Provider A: Route the payin to the first provider in your routing order for this method and currency.
- Aurumsys → Provider A: If Provider A refuses in a way another provider could take, and your cascade setting allows it, the same payment is offered to Provider B — same id, one answer.
- Provider A → Aurumsys: The provider answers with its payment page link.
- Aurumsys → Your platform: 201 with status
PENDINGand aredirectUrl. - Your platform → Payer: Send the payer to
redirectUrl, as a top-level navigation. - Payer → Provider A: The payer pays on the provider page.
- Provider A → Aurumsys: The provider notifies us that it is paid; we verify the notice before it counts.
- Aurumsys → Your platform: Signed callback with status
COMPLETED. Settle your books here. - Payer → Your platform: The payer's browser returns to your
returnUrl. It is a page to show, not a payment result.
Inside every request
- Verify. Your API key and its scope are checked before anything else happens.
- Once only. The same
Idempotency-Keynever creates a second payment. A repeat gets the first answer again. - Ask you first. Optional. With the hook on, we ask your endpoint before any provider is touched. A no stops here.
- Route. Your routing order picks the provider for this method and currency.
- Cascade. A provider that refuses can be followed by the next in your order. Same id, one answer, every attempt on record.
- Watch. Provider notices are verified before they count. An unclear answer is re-checked with the provider until it is sure.
- Tell you. Every status you could not have learned yourself arrives as a signed callback, retried with backoff until you answer.
Where a payment can be
CREATEDmoves to one of the waiting states:PENDING,PROCESSINGorIN_DOUBT.- A waiting state can move to another waiting state before it settles.
- Any waiting state can end in any of the three terminal states:
COMPLETED(settle),FAILED(show the reason) orCANCELLED. IN_DOUBTis not a failure. It waits for the provider's answer and often endsCOMPLETED. Never re-send it.PENDINGmay becomeEXPIRED— our guess that an abandoned page will never be paid. AnEXPIREDpayin may still becomeCOMPLETEDorFAILEDif it is paid late after all.- A
FAILEDpayin may still becomeCOMPLETEDinside a provider's provisional window, on the slow rails that declare one. COMPLETEDandCANCELLEDare final. A won dispute arrives as a new reversal, never as a status flip.- Apply a late status change to a row you had already closed; do not reject it as impossible.
Every callback is signed. Every provider attempt is on the payment. Nothing settles on the browser coming back.
Scroll sideways to follow the arrows, or open “As text” below.
Your platform
Your backend, with a money-moving API key.
Aurumsys
The orchestrator: checks the destination, picks the rail, follows the money.
Provider B · second · takes over if A refuses
Provider A
First in your order for this rail and currency.
Recipient
Your customer's bank account, card or wallet.
Inside every request
what the orchestrator does before a cent leavesVerify
Your API key must be a money-moving one. A read-only key is refused before anything else.
Once only
The same Idempotency-Key never pays twice. A retry after a timeout gets the first answer again.
Check the destination
Each rail publishes the exact shape it wants. A mistyped account costs one corrected keystroke, not a failed payout.
Route
Your routing order picks the provider for this rail and currency.
Cascade
A provider that refuses outright can be followed by the next in your order. Never after money may have moved.
Watch
An ambiguous answer parks the payout as IN_DOUBT and we ask the provider until it is sure. Nothing is sent twice.
Tell you
COMPLETED or FAILED arrives as a signed callback. A failure says what to do: retry later, try another method, or stop.
Where a payout can be
no PENDING in the normal case: nobody is waiting on a page. It executes, or it does not.As text
Check the destination first if you like. Then one call, and it executes at once — no approval step on our side.
Who takes part: Your platform (your backend, with a money-moving API key) · Aurumsys (the orchestrator: checks the destination, picks the rail, follows the money) · Provider A (first in your order for this rail and currency; Provider B: second · takes over if A refuses; Provider C: third) · Recipient (your customer's bank account, card or wallet).
The journey
- Your platform → Aurumsys: Optional dry run:
POST /v1/payouts/validatewith the same body as the payout. - Aurumsys → Your platform: The answer is valid, or names the exact field to correct. No transaction exists yet and no
Idempotency-Keyis consumed. - Your platform → Aurumsys: Create the payout:
POST /v1/payouts, with the destination and anIdempotency-Key. - Aurumsys checks: The destination shape and the route limits are checked. A wrong-shaped account is refused before any transaction exists, so the correction can go out under the same
Idempotency-Key. - Aurumsys → Provider A: Route the payout to the first provider in your routing order for this rail and currency.
- Aurumsys → Provider A: If Provider A refuses outright, and your cascade setting allows it, the same payout is offered to Provider B — same id, one answer. Never after money may have moved.
- Provider A → Aurumsys: The provider accepts the payout.
- Aurumsys → Your platform: 201 with status
PROCESSING: the provider is executing it. - Provider A → Recipient: The provider sends the money. Some rails first show the recipient a page (
redirectUrl) to collect or confirm details. - Provider A → Aurumsys: The provider notifies us that it is paid out; we verify the notice before it counts.
- Aurumsys → Your platform: Signed callback with status
COMPLETED— orFAILED, with the reason and what to do.
Inside every request
- Verify. Your API key must be a money-moving one. A read-only key is refused before anything else.
- Once only. The same
Idempotency-Keynever pays twice. A retry after a timeout gets the first answer again. - Check the destination. Each rail publishes the exact shape it wants. A mistyped account costs one corrected keystroke, not a failed payout.
- Route. Your routing order picks the provider for this rail and currency.
- Cascade. A provider that refuses outright can be followed by the next in your order. Never after money may have moved.
- Watch. An ambiguous answer parks the payout as
IN_DOUBTand we ask the provider until it is sure. Nothing is sent twice. - Tell you.
COMPLETEDorFAILEDarrives as a signed callback. A failure says what to do: retry later, try another method, or stop.
Where a payout can be
CREATEDmoves toPROCESSING. There is noPENDINGin the normal case, because nobody is waiting on a page.PROCESSINGandIN_DOUBTcan move between each other before the payout settles.- Either can end
COMPLETED,FAILEDorCANCELLED. IN_DOUBTis not a failure: it often endsCOMPLETED. Never re-send it.COMPLETEDandCANCELLEDare final.- A returned payout arrives later as a
REVERSALyou did not create (reversalKindPAYOUT_REVERSAL), with its own signedtransaction.reversedcallback.
A payout executes immediately. Check the destination first, send once, and settle on the signed callback.
Scroll sideways to follow the arrows, or open “As text” below.
Your platform
Names the payin to refund, and optionally an amount.
Aurumsys
Keeps the ledger of what is still refundable on each payin.
Provider B · not consulted
Provider A
The one that took the payin. The refund follows it.
Payer
Gets the money back where it came from.
When money is taken back instead
chargeback · recall · returned payout · fraud claim — a REVERSAL nobody on your side createdInside every refund
shorter than a payin: no routing, no cascadeVerify
A money-moving key, checked before anything else.
Once only
The same Idempotency-Key never refunds twice. A retry gets the first answer again.
Against the payin
Only a COMPLETED payin, only up to what is still refundable — earlier refunds and reversals already taken off.
Same provider
A refund follows the payin to the provider that took it, with the settings of that day. No routing, no cascade.
Tell you
Some providers settle inside the answer, others later by signed callback. Either way parentTransactionId names the payin.
As text
A refund is something you ask for, against one payin. A reversal is something that happens to you — we tell you, signed.
Who takes part: Your platform (names the payin to refund, and optionally an amount) · Aurumsys (keeps the ledger of what is still refundable on each payin) · Provider A (the one that took the payin. The refund follows it; Provider B: not consulted; Provider C: not consulted) · Payer (gets the money back where it came from).
The journey
- Your platform → Aurumsys: Refund the payin:
POST /v1/refundswith the payin asparentTransactionId, anIdempotency-Key, and optionally an amount (omit it for the full remainder). - Aurumsys checks: The payin must be
COMPLETEDand the amount must fit what is still refundable — earlier refunds and reversals count. The check runs under a lock, so two concurrent refunds cannot both fit. - Aurumsys → Provider A: The refund goes to the provider that took the payin. It is never routed and never cascades.
- Provider A → Aurumsys: The provider accepts the refund.
- Aurumsys → Your platform: The answer is
PROCESSING, orCOMPLETEDat once — per provider. Read the status; do not assume. - Provider A → Payer: The provider returns the money to the payer.
- Provider A → Aurumsys: The provider notifies us that it is refunded; we verify the notice before it counts.
- Aurumsys → Your platform: Signed callback with status
COMPLETED;parentTransactionIdnames the payin.
When money is taken back instead
chargeback · recall · returned payout · fraud claim: a REVERSAL nobody on your side created.
- Their bank → Provider A: The money is taken back: the payer disputed it, or the rail returned it.
- Provider A → Aurumsys: The provider notifies us, and we create the
REVERSAL. No endpoint creates one, and there is nothing to acknowledge. - Aurumsys → Your platform: Signed
transaction.reversedcallback.reversalKindsays which kind it is; read it, do not derive it. A reversal against a payin consumes the same refundable remainder as refunds do. - Aurumsys → Your platform: A dispute won later arrives as a new reversal the other way (
reversalKindCHARGEBACK_WON), never as a status flip on the old one.
Inside every refund
- Verify. A money-moving key, checked before anything else.
- Once only. The same
Idempotency-Keynever refunds twice. A retry gets the first answer again. - Against the payin. Only a
COMPLETEDpayin, only up to what is still refundable — earlier refunds and reversals already taken off. - Same provider. A refund follows the payin to the provider that took it, with the settings of that day. No routing, no cascade.
- Tell you. Some providers settle inside the answer, others later by signed callback. Either way
parentTransactionIdnames the payin.
Refunds and reversals draw from the same remainder. Treat them as the same thing and you pay the same money out twice.