OfferDetail.type tells you which checkout the offer needs: 'coinlist::token_sale', 'superstate::swap', 'ondo::swap', or 'centrifuge::vault'. Switch on it exhaustively, or hand the offer to CheckoutContainer and let the SDK dispatch. v0.13.0 added 'centrifuge::vault', so an exhaustive switch written for an earlier version needs a new case - see the changelog.Prerequisites
- Completed OAuth and a working
PassageProvider - An offer id from Fetch offers (for example
offer.idfromOffersGridContaineronOfferClick)
Recommended: useOfferDetails
The hook mirrors the SDK client methodpassage.offers.get: it waits until the provider is ready, then loads details and exposes offerDetailsState:
LOADING- provider not ready or request in flight. Withenabled: falseand nodata, the hook also staysLOADING: it has noDISABLEDstate.ERROR-reasonisnot-authenticatedwhen no user is signed in (NotAuthenticatedError), andgeneric-errorfor any other failureCONTENT-offerDetailis theOfferDetail
data with an OfferDetail your server fetched with passage.offers.get(id) on PassageServer, and the hook uses it as-is and sends no request. The hook has no refetch().
When the user picks an offer from the grid, keep that offer in React state and pass offer.id - TypeScript then matches the branded id type the hook expects.
REST: GET /v1/offers/
Use the API directly when you are not in React or you need a one-off server fetch with a token you already hold.Example: fetch with Bearer token
Example: fetch with Bearer token
Display the full terms and link to the sale agreement URL as provided - do not summarize or paraphrase legal terms.
Lower-level client
passage.offers.get in React
passage.offers.get in React
Equivalent to the hook, without the built-in state machine. Pass the same Prefer
offer.id you get from OffersGridContainer:useOfferDetails unless you need custom control flow.Next step
Requirements
Show the user what they must satisfy before they can participate.