Flow of Funds
Refresher on how instant on-ramping works with Superbank’s API.
Pre-requisites
Before you begin, ensure you have:- A Superbank Developer account with API access
- A prefunded account with sufficient USDC balance
- Your API key.
On-Ramping
Step 1: Receive an instant on-ramping request
Your user sends a real-time on-ramping request via your UI, or API. Persist their destination wallet address (destination.wallet_address).
Step 2: Create a Settlement Request
Create a settlement request by sending aPOST request to /v0/settlement-requests endpoint on Superbank’s API.
We recommend supplying an external_id (your own identifier for this
settlement) and optional metadata (free-form key/value pairs) on
create. Both are echoed back on every read and webhook, and external_id
is filterable on the list endpoint — meaning you don’t need to persist
anything from the create response (not Superbank’s id, not
payment_instructions). Look the settlement up by external_id
whenever you need it; the full record (including payment_instructions)
comes back on every lookup.
Request
cURL
Response
Some fields (e.g.outbound_payment, inbound_payment, timestamps, failure fields) are omitted in the examples on this page for brevity — see the Settlement Request reference for the full schema.
id, and not payment_instructions. Both come back on the lookup.
Look the settlement up later via the external_id filter whenever the
next step runs:
cURL
Step 3: Start on-ramping with your infrastructure provider
Use thepayment_instructions returned in the previous step as the on-ramping destination to request the deposit instructions from your infrastructure provider.
For example, here’s how to do it with Bridge as your infrastructure provider.
Request
cURL
Response
Step 4: Update settlement request status to FUNDS_SENT
Once the End-User has initated the payment using your infrastructure provider, update the settlement request status to FUNDS_SENT by sending the PUT request to /v0/settlement-requests/:id.
This triggers the instant settlement from your pre-funded wallet, to your User’s destination wallet.
Request
cURL
Response
Step 5: Instant settlement completed
Once you confirm the funds are sent via Step 4, Superbank moves USDC from your pre-funded wallet to the End-User’s wallet in real time. The End-User receives their USDC instantly (blockchain speed).Detecting Completion
Between Step 5 (Superbank moves the funds) and Step 6 (you callREQUEST_COMPLETED with the transaction hash), your system needs to know that the settlement is done. There are two ways to find out, and we strongly recommend the first.
Webhooks (recommended)
Subscribe a webhook endpoint and listen forsettlement_request.updated events where data.status === 'SETTLEMENT_COMPLETED'. As soon as Superbank moves the funds, you’ll get a signed POST to your endpoint and can immediately fire Step 6.
X-Superbank-Event and X-Superbank-Signature headers, and the complete list of event types are documented in the Webhooks guide.
Polling (fallback)
If you can’t accept webhooks, pollGET /v0/settlement-requests/:id until status === 'SETTLEMENT_COMPLETED'. Recommended interval: 5 seconds or longer. Polling more aggressively wastes your rate-limit budget without speeding up settlement (the underlying blockchain confirmation is the gating factor, not our API).
cURL
Step 6: Reconcile via REQUEST_COMPLETED
After T+X — when you’ve collected the fiat from the end user and reconciled
it on-chain into your Superbank prefunded wallet — close the settlement by
calling REQUEST_COMPLETED with the transaction hash of the on-chain
reconciliation.
The on-chain reconciliation typically happens one of two ways:
(a) Direct deposit via payment_instructions. Use the wallet address
or bank details shown in payment_instructions from Step 2’s response.
Funds deposited there settle automatically into the prefunded wallet, so
you don’t need to perform a separate forwarding step.
(b) Third-party forwarding. If you receive the funds on a third-party
infrastructure first (e.g. Bridge, Coinbase, your own off-ramp), forward
the resulting stablecoin on-chain to the Superbank prefunded wallet to
reconcile.
In both cases, the transaction_hash in the request below is the hash of
the on-chain transfer that lands stablecoin in the prefunded wallet — not
the destination payment Superbank made to the end user (that’s the
OUTBOUND, which auto-confirms in seconds and doesn’t need to be reported
back).
Request
cURL
Response — two possible outcomes
The status in the response depends on whether Superbank has already detected the inbound on-chain transfer to your prefunded wallet at the moment you submit this call:REQUEST_COMPLETED— the inbound PAYIN was already detected and the amount matched. The settlement is final;completed_atis set andinbound_paymentis populated. This is the typical path when you callREQUEST_COMPLETEDafter the on-chain transfer has had time to confirm and be picked up by Superbank’s indexer.AWAITING_PAYIN_RECONCILIATION— yourtransaction_hashis recorded, but the matching inbound PAYIN has not yet been observed. Superbank will defer the amount check until the PAYIN lands. As soon as it does, the request automatically resolves toREQUEST_COMPLETED(orPAYIN_AMOUNT_MISMATCHif the received amount differs from the settlement amount) and Superbank emits anothersettlement_request.updatedwebhook. No further action is required from your side. This is most commonly seen when you callREQUEST_COMPLETEDimmediately after broadcasting the on-chain transfer, before it has confirmed and been indexed, or on rails with slower finality.
REQUEST_COMPLETED (synchronous path)
AWAITING_PAYIN_RECONCILIATION (deferred path)
Same request, but the inbound PAYIN has not yet been indexed. Note the
absent inbound_payment and completed_at — both will be populated when
Superbank later detects the on-chain transfer and finalises the request.
Next Steps
Webhooks
Wire up a webhook handler to detect
SETTLEMENT_COMPLETED without polling — envelope, headers,
signature verification, and the full event list.Fiat → Stablecoin on-ramping
Same destination shape, but the end-user deposits fiat instead of
stablecoin. Use this when there’s a fiat leg on the source side and
you want Superbank to handle the conversion and deposit instructions.