- Cash-in: the customer deposits physical cash at a retail location and receives crypto in the destination wallet.
- Cash-out (cash pickup): the customer withdraws crypto from a wallet and collects physical cash at a retail counter or ATM.
usd endorsement on the customer.
Cash-in
A cash-in is an in-person cash deposit flow. You create a cash-in that reserves a deposit code. The customer takes that code to a partner retail location, deposits cash, and OMS automatically converts it to crypto and delivers it to the destination wallet (cashToCrypto).
Cash-ins skip the quote step: the customer decides how much to deposit at the counter, so no amount is fixed at creation. Pass an indicatedAmount on the source for an upfront pricing estimate.
Cash-in limits
Create a cash-in
POST /cash-ins. The request names the customer, the cash source location, and the crypto destination.
Pass an
Idempotency-Key header to safely retry without creating duplicates.
Cash-in object
The response, everyGET, every list entry, and every cashIn.* webhook payload return the same shape:
Display the
depositInstructions.cashInCode in your UI. When you pass an indicatedAmount on create, pricing carries the estimated source and destination amounts and the fee breakdown so you can show the customer what to expect before they visit the location. The estimate is finalized once the cash is deposited; if the amount deposited differs from the amount priced on, pricing carries only the cash actually deposited on the source side, because the estimated destination, fees, and rate no longer describe the cash-in. The created transaction’s ID appears on transactionId once the deposit is made.
Amounts in pricing are decimal strings padded to each asset’s precision (two decimals for usd, six for usdc). See the transactions pricing shape for the shared model.
Cash-in flow
POST /cash-ins/{cashInId}/refresh issues a new code for a cash-in that has not expired, but it does not extend expiresAt. Once expiresAt passes, the refresh fails with 422 RefreshExpired; create a new cash-in instead.
Cash-in status
A cash-in has no
subStatus; branch on status alone. Detail about a failure lives in the failure object, and the auto-created transaction’s own status and sub-status carry conversion progress after the deposit lands.
Cash-in webhook events
Each payload is the full cash-in object described above. Subscribe to the
cashIn.* events alongside transaction.statusChanged to receive both the cash-in’s own lifecycle events and the auto-created transaction’s events.
Cash-in operations
GET /cash-ins returns results newest first. Page with limit, startingAfter, and endingBefore: pass the previous page’s nextCursor as startingAfter while hasMore is true.
POST /cash-ins/{cashInId}/cancel cancels a cash-in that is still pending. The deposit code stops working and the cash-in becomes cancelled once the provider confirms it deleted the code. If the customer scans the code while the cancel is in flight, the request fails with 409 CashInAlreadyScanned; if the code had already expired, it fails with 409 CashInExpired. A cash-in that is processing or final fails with 409 CashInNotCancellable. Pass an Idempotency-Key header to retry safely.
Simulating a cash-in (sandbox)
In sandbox, drive a cash-in through its lifecycle without a real deposit using the simulation endpoints. Each endpoint is scoped to a specific cash-in by ID and returns404 in production.
Cash-out
A cash-out (cash pickup) is the inverse of a cash-in: the customer holds crypto in an OMS wallet and withdraws it as physical cash. It uses a standard quote with acash destination (cryptoToCash). OMS pulls crypto from the wallet, issues a time-limited pickup code, and the customer collects cash at a partner retail location. Set the amount on the destination side; it must be a multiple of $20.00, up to $400.00 per transaction.
Cash pickup is under active development and available through early access. To enable it for your project, contact us.
Request access
Share your use case and we’ll reach out about cash pickup.
Cash-out limits
Cash-out flow
Supported locations
Cash deposits and withdrawals are processed through OMS’s partner retail and ATM network across the US. List nearby locations withGET /cash-locations, passing the provider, latitude, and longitude query parameters, an optional radius in miles (greater than 0, at most 100), and a flow of cash_in or cash_out to select the configuration. Pass customerId to return only locations the customer is eligible to use, based on their KYC country and, for US customers, their state.
The response is a list envelope with locations in data, nearest first. Page with limit, startingAfter, and endingBefore. Each location carries its provider’s maxTransaction and maxDailyPerCustomer limits, an id and a cashLocationReference (pass them as locationId and locationReference when you create a cash-in, or as cashLocationId and cashLocationReference on a cash pickup quote), its distance from the supplied coordinates, and whether it supports deposits (buyAllowed) and withdrawals (sellAllowed).
Related
- Cash-in guide: full walkthrough with request and response
- Cash pickup guide: the cash-out flow in detail
- Transactions: standard two-step flow for card and bank transfers