Add a USDC off-ramp in one function call.
Start with the free SDK: it creates delegated deposits. Add private buyers, lifecycle webhooks, and Peerlytics credits when your product needs market data and webhook operations. A wallet signs; the SDK never holds keys or fiat.
import { offramp } from "@usdctofiat/offramp"; // Sell 100 USDC for USD via Venmo, non-custodialconst deposit = await offramp(wallet, { amount: "100", platform: "venmo", currency: "USD", identifier: "@yourhandle",});Build paths
Pick the integration shape before choosing code.
SDK surface
Compact primitives that match the real protocol lifecycle.
offramp()Create or resume a sell-USDC deposit, delegate pricing, and return depositId + txHash.
deposits()List deposits for an address when the app needs narrow owner-state reconciliation.
close()Withdraw unfilled USDC from an existing deposit with the signer wallet.
Restrict an order to one taker wallet, generate a share link, or remove the restriction.
useOfframp() and usePeerExtensionRegistration() for wallet-app frontends.
PLATFORMS, CURRENCIES, validation helpers, and OfframpError codes.
OFFRAMP_DEVELOPER_RESOURCES and playbooks for apps, bots, agents, OTC, webhooks, and Peerlytics.
The SDK is free. A buyer-side fee on delegated fills, and Peerlytics for deeper data.
Create and manage deposits from your own wallet. No platform fee, no custody — keep your spread and pay only Base gas.
@usdctofiat/offramp creates deposits with no API key. Deeper Peerlytics analytics, webhooks, and API credits are available through Peerlytics.
0.10%on filled volume
Delegate keeps your rate competitive automatically. Its manager fee is buyer-side: deducted from the
USDC released to the buyer on delegated fills — never from your fiat proceeds or your quoted rate.
Delegate is optional. Price and manage your own rate from your wallet at no cost, or build it into your app with the free SDK.
Production flow
Build the shortest path first, then add private orders and observability.
- 01Create a delegated deposit from the user wallet or bot wallet with offramp().
- 02Use deposits() to reconcile local state after refreshes, retries, or bot restarts.
- 03Pass otcTaker when the buyer is known and the order should not be public fillable.
- 04Register webhooks through Peerlytics when your product needs asynchronous lifecycle state.
- 05Add @peerlytics/sdk when you need orderbook reads, market analytics, and credit-backed API access.
Webhook events
HMAC-signed callbacks for the off-ramp lifecycle.
Developer questions
Does the SDK custody keys?
No. The SDK signs with the viem WalletClient you pass: your user's wallet, a server wallet, or a bot wallet. It never holds private keys.
Does the SDK move fiat?
No. Fiat moves directly between the buyer and seller on the chosen payment app. The SDK only handles the onchain USDC and deposit lifecycle.
Do I need an API key to create deposits?
No. Creating deposits is permissionless, since your wallet signs. An API key is only needed to register webhooks and to use the Peerlytics API.
How do I test an integration?
There is no public sandbox; the SDK targets Base mainnet, so a test deposit is real and discoverable on the open orderbook. Use the 1 USDC minimum, and either restrict it as an OTC deposit (pass otcTaker so only your own wallet can fill it) or accept that a buyer could take it before you call close(). Confirm it onchain and via deposits(), then close() it.
How are webhooks verified?
Each delivery carries X-Usdctofiat-Signature: t=<unix>,v1=<hex>, an HMAC-SHA256 over timestamp.rawBody. The reference verifier in the starters repo treats timestamps older than 5 minutes as stale to guard against replays; you set that window in your own verifier, the sender does not enforce it.