Skip to main content
Offramp’s underlying transfer logic didn’t change — v3 create/accept calls the exact same provider code v2 uses. What changed is the request/response shape sitting in front of it: how you specify the destination, a couple of renamed fields, and a real gap in one response field. See the platform-wide changes for ID format, pagination, error shape, and idempotency — this page only covers what’s specific to Offramp.
The quote-then-accept flow (create → OPEN_QUOTE → accept → settlement) is not new in v3 — v2 already works this way. If you’re already handling that flow in v2, the state machine itself doesn’t change.

Endpoints

Request changes: create an offramp

v2:
v3:
If you use a raw wallet address (not a HIFI-tracked wallet) as the return destination for funds that don’t complete, you’ll need to register it as an External Wallet before creating the offramp — v3 has no equivalent to v2’s freeform returnAddress string.

Response changes

v2 (nested under a transfer envelope):
v3 (flat):
Cancel (POST .../cancel): v2 returns { "message": "Transaction: <id> cancelled successfully" }. v3 returns the full offramp object (with status reflecting the cancellation) instead of a message string.

Status and lifecycle

Unchanged — v2 and v3 offramps share the exact same status enum and transitions (OPEN_QUOTE, PENDING_APPROVAL, AWAITING_FUNDS, COMPLETED, etc.). Nothing here is v3-specific.

Transfer approvals

Works the same way in both versions once you account for the field rename: set requiresApproval: true (v3) / requireApproval: true (v2) on create, and the record is created with status: "PENDING_APPROVAL" instead of OPEN_QUOTE — no funds move until a separate approve/reject call resolves it. See the (forthcoming) Transfer Approvals migration page for the approve/reject endpoints themselves.

Webhooks

Event types are unchanged: OFFRAMP.CREATED and OFFRAMP.STATUS.<STATUS> fire the same way regardless of whether the offramp was created via v2 or v3, and the payload is built from the same v3-shaped offramp object either way. If you’re already consuming these webhooks, no changes needed here.