Skip to main content
OMS supports two complementary in-person cash flows:
  • 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.
Both flows hand off a code at a partner retail location. Cash-in skips the upfront quote step; cash-out uses a standard quote with a cash destination. Both require the 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, every GET, 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

The deposit code is valid for one hour. 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 returns 404 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 a cash 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 with GET /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).