GET /requests/v3 is the latest version of the Requests API. It gives you a richer query surface with advanced filtering across status, chains, amounts, addresses, time, and more, plus a cleaner and more consistent response. This guide covers every change and how to upgrade. GET /requests/v2 remains available during a deprecation window (see the sunset timeline below) — migrate before it’s retired.
Sunset timeline
GET /requests/v2 is deprecated as of July 22, 2026. It keeps working, but migrate to GET /requests/v3 before it’s fully retired on November 24, 2026.
Response shape
The same request shown in full for v2 and v3, plus a focused diff of what moved.- v2
- v3
- Difference
What changed
Every individual change, grouped by request side and response side.Request & querying
Authentication
Authentication
x-api-key request header is now required. Every request authenticates against an active API key. See API Keys for details.Filtering, search & sorting
Filtering, search & sorting
sortBy accepts createdAt (default), updatedAt, or amountUsd. sortDirection is asc or desc (defaults to desc for time fields, asc for amountUsd).Advanced filtering (AND / OR / negation). The filters parameter takes a JSON-encoded array of groups. Fields within a group are AND’d; the groups themselves are OR’d. Any key can be negated with a not: prefix, and a field’s value may be an array (OR within that field). Top-level parameters still apply.features are top-level only.hashis removed; useterm, or the targeteddepositTxHash/fillTxHash/refundTxHash.referreris no longer a query parameter; it’s still returned in the response, but only whenincludeAuthenticatedData=true.
Response fields
Currencies — unified to a single object
Currencies — unified to a single object
currency (string) + currencyObject (object) duality is removed everywhere, along with feeCurrency/feeCurrencyObject and appFeeCurrencyObject. Every currency is a single object: { chainId, address, symbol, name, decimals, metadata }. Amount objects carry that currency plus amount, amountFormatted, amountUsd, and where relevant amountUsdCurrent, minimumAmount.Fees — expandedPriceImpact → data.fees, relay → platform
Fees — expandedPriceImpact → data.fees, relay → platform
data.expandedPriceImpact is renamed to data.fees (and the old wei data.fees / data.feesUsd are removed). Each phase (quoted, actual) breaks fees into swap, execution, platform, app, and sponsored, with the shared currency hoisted to data.fees.currency. The relay component is renamed to platform, and per-component values now include amount and amountFormatted in addition to usd.Fee sponsorship — single source of truth
Fee sponsorship — single source of truth
data.subsidizedRequest and data.subsidizedFee are removed. data.feeSponsorship is now the only sponsorship source — determine whether a request was sponsored from feeSponsorship.{quoted,actual}.sponsoredTotal.amountUsd. The relay bucket is renamed to platform, the shared currency is hoisted to feeSponsorship.currency, and the actual phase gains a sponsorPayment object.App fees — consolidated into one object
App fees — consolidated into one object
appFees (quoted) and paidAppFees (actual) arrays are consolidated into one object with explicit quoted / actual keys and a hoisted currency.Swap & route — metadata folds into data.route
Swap & route — metadata folds into data.route
data.metadata catch-all is removed. sender is promoted to the root (next to recipient), and everything else moves into data.route, which now has two phases:data.route.quoted— the route as quoted at request time.data.route.actual— what actually executed. Carriesrate, andactualfalls back toquotedwhen there’s no execution data yet (e.g. same-chain swaps).
origin and destination sides, and each side has inputCurrency / outputCurrency (each a full amount object) plus router (on the actual route, router reflects the provider that actually filled the leg, not always "relay"). includedSwapSources / includedOriginSwapSources / includedDestinationSwapSources are hoisted to the top of data.route.There is no data.swap and no data.quotedOutputAmount — read amounts from the route instead:- Amount deposited:
data.route.actual.origin.inputCurrency(→quoted). - Amount received:
data.route.actual.destination.outputCurrency(→quoted). For same-chain swaps there is no destination side, so fall back toorigin.outputCurrency.
Transaction hashes — hash → txHash
Transaction hashes — hash → txHash
inTxs[] and outTxs[], the hash field is renamed to txHash. The array names themselves are unchanged.Statuses — new values
Statuses — new values
status enum is now pending, waiting, depositing, submitted, success, failure, refund. depositing and submitted are new; the v2 delayed value is gone. The status filter accepts success, failure, refund, pending, depositing.Moved, added & nulled fields
Moved, added & nulled fields
moonpayIdmoves from the root todata.externalMetadata.moonpayId.senderis promoted to the root (next torecipient); it previously lived indata.metadata.sender.referrermoves intodata.referrerand is returned only whenincludeAuthenticatedData=true. It’s also no longer a query parameter.refundTo(refund target for deposit-address transactions) is added at the root.requestType(Bridge,Crosschain Swap,Same-chain Swap,Send,Wrap,Unwrap,Call) is added at the root.features(e.g.gasless_execution,fast_fill,gas_top_up,app_fees,deposit_address) is added at the root.depositAddressis now a structured object:{ address, type: "strict" | "open", depositor, depositTxHash, recoveryAddress }.recoveryAddressis the origin-chain address that can recover deposit-address funds if the recipient wallet is later blocked (nullwhen not set).supersededByRequestIdis promoted to the root; it previously lived atdata.supersededByRequestIdin v2. When a deposit-address request is regenerated (currently Bitcoin/BVM only), the original request’ssupersededByRequestIdpoints to the regeneratedrequestIdthat owns the sweep and fill.nullotherwise.data.quoteOraclePriceis added — the oracle price snapshot at quote time ({ rate, observedAt, inputCurrency, outputCurrency }), returned only for fixed-BPS oracle integrators;nullotherwise.data.priceis removed — read the quoted output amount fromdata.route.actual.destination.inputCurrency(distinct from the actual received amount indata.route.actual.destination.outputCurrency).failReason/refundFailReasonusenullinstead of the string"N/A".
Field migration reference
Renamed & restructured
Renamed & restructured
Removed
Removed
Added
Added
Migration checklist
Switch the endpoint and headers
GET /requests/v3 and send x-api-key (now required). Drop the referrer query parameter. Set includeAuthenticatedData=true only from a trusted server context to receive authenticated fields (see the note at the end).Update fee reads
data.fees.gas / feesUsd. Read the per-component USD breakdown from data.fees.quoted / data.fees.actual, and rename the relay component to platform.Repoint currency & route reads
data.metadata.* reads: sender is now at the root, and currencies/rate come from data.route.{quoted,actual} (prefer actual, fall back to quoted). Read the deposited amount from route.actual.origin.inputCurrency and the received amount from route.actual.destination.outputCurrency (fall back to origin.outputCurrency for same-chain swaps). Drop currency/currencyObject string handling — read the single currency object.Consolidate app fees & sponsorship
data.appFees.quoted / data.appFees.actual. Replace subsidizedRequest/subsidizedFee with data.feeSponsorship, and rename its relay bucket to platform.Fix tx hashes, statuses & nulls
inTxs[].hash / outTxs[].hash to txHash. Handle the new depositing / submitted statuses (and remove delayed). Treat failReason / refundFailReason as null rather than "N/A".Adopt the new querying surface
user/hash/id lookups with a single term search where it fits, and take advantage of the new filter/sort parameters. Pagination is unchanged — keep passing continuation back for the next page (limit max 50).