Skip to main content
A crypto deposit is the simplest way money comes in: the user already holds a stablecoin somewhere, and we route it to where you want it. Cross-chain is handled for you - the user does not bridge, swap, or hold a second gas token.
Live today. This is the rail the widget has been settling real deposits on, and the one you can build your own UI against right now. Nothing is held or signed by us at any point.

Before you start

  • An API key and the /v1 prefix - see Authentication.
  • The destination you want money to land on. Omit it and it settles as USDC on Arbitrum, which is what most integrations mean.
  • A frontend that can ask the user’s wallet to sign. We hand back an unsigned transaction; submitting it is yours.

What it does

  • Any supported source chain and token. The user picks what they hold.
  • One landing spot you control. By default USDC on Arbitrum; name another chain and token if your key is enabled for it.
  • Non-custodial throughout. The transaction we hand back is unsigned and the user’s wallet signs it. Funds never sit with us between the payer and you.
  • Exact-in or exact-out. Pin the amount the payer spends, or the amount that must land - the second is what a fixed price needs.

The flow

1

Price it

POST /v1/deposit/quote with the source, the destination, and the amount. See Quote a deposit.
2

Build the transaction

POST /v1/deposit/transaction with that quote. You get an unsigned transaction, preceded by an approval when the token allowance is short. See Build the transaction.
3

Let the user sign

Your frontend submits it from the user’s wallet. Nothing reaches us here.
4

Track it

POST /v1/deposit/status with the receipt, or take a webhook instead of polling. See Check status.
A quote lives five minutes. Build the transaction from a fresh one - past that the request is refused with a quote-expired error rather than silently repriced, so the user never signs a number they were not shown.

Exact-in and exact-out

exact-in means the payer spends exactly the amount you named and whatever arrives, arrives. target-out means a fixed figure has to land and the payer’s side flexes to cover it. Collecting a set price - an invoice, a checkout total - is the exact-out case.

Settling somewhere other than Arbitrum

Name both destination.chain and destination.token, never one alone: a chain without its token address would keep Arbitrum’s address on a chain where it does not exist, so that request is refused. Your key also has to be enabled for that chain, otherwise the quote comes back 403 chain_not_allowed instead of a quote you could not have used.

Where to go next