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: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):
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: setrequiresApproval: 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.