Skip to main content
Best for: wallets, brokerages, and platforms that want to give users access to tokenized equities (real-world shares represented on-chain) without becoming a regulated broker-dealer or transfer agent themselves.

How it works

Tokenized equities are real shares of an issuer, represented on-chain and held in custody arrangements that meet securities law. Your app surfaces the available equities, your users buy and hold them through your UI, and Passage runs the issuance, custody, settlement, and compliance underneath.
Embed tokenized equities flow diagram

Who handles what

Passage handles

  • Issuer onboarding and offering compliance
  • KYC and per-jurisdiction eligibility
  • Order routing and settlement
  • On-chain issuance and custody arrangements
  • Corporate actions (dividends, splits, etc.)
  • Investor disclosures and doc signing
  • Regulatory reporting

You handle

  • Your app’s UX and product surface
  • OAuth client setup and session storage
  • Which equities to surface to which users
  • Order entry UI inside your app
  • Holdings display and post-purchase status

Walkthrough

1

Confirm scope with your Passage contact

Tokenized equities have additional regulatory considerations versus token sales - jurisdiction, user accreditation, and the issuers you can surface all depend on the structure. Work with your Passage account manager to confirm what’s in scope before you build.
2

Get OAuth credentials and install the SDK

The integration surface is the same as for embedded token sales. Reach out to Passage via the Support portal to request a client_id, redirect_uri, and client_secret, then install:
npm install @coinlist-co/react
See the SDK quickstart and the OAuth recipe for setup.
3

Render available equities

Equities surface through the same offers API as other CoinList-managed offers. Drop OffersGrid in for the fastest path, or build your own UI on top of useOffers when you need full layout control. The set of offers your client_id sees is scoped on the server, so once your account is set up for equities the user will only see what they’re eligible for.
"use client";
import { OffersGrid } from "@coinlist-co/react";

export function EquitiesList() {
  return (
    <OffersGrid
      maxColumns={3}
      onOfferClick={(offer) => router.push(`/equities/${offer.slug}`)}
    />
  );
}
For a custom layout, use useOffers and render the returned offers yourself - see Fetch offers for the loading / error / empty states the hook exposes.
4

Handle order entry and confirmation

For each equity, render the issuer details, current price, and any disclosures using useOfferDetails. Order entry, signing, and settlement happen through the Passage participation flow - see Display offer details and Track participations.Eligibility is checked at order time; Passage returns either an executed order, a pending state, or a rejection your UI should surface.
5

Show holdings and corporate actions

Pull each user’s holdings via the participations endpoints and render them in your portfolio UI. Corporate actions (dividends, splits, reorganizations) flow through Passage and are reflected in the same data - you re-fetch on session refresh and reflect changes in your UI.

Build it

SDK quickstart

Credentials, install, and OAuth shape.

Set up OAuth authentication

Wire CoinListProvider, a sign-in surface, and the callback handler.

Display offer details

Load full equity data - issuer, price, disclosures - with useOfferDetails.

Track participations

Render holdings and order status in your portfolio UI.

Common questions

Token sales are primary offerings of a project’s own token. Tokenized equities are shares of real-world issuers represented on-chain, with secondary trading mechanics and corporate actions (dividends, splits). The SDK shape is the same; the compliance and settlement structure underneath is different.
The set of issuers available depends on what’s onboarded with Passage and what’s eligible in your users’ jurisdictions. Your account manager confirms the available universe before you build.
Eligibility depends on each issuer’s offering structure and the user’s jurisdiction. Passage runs the eligibility check at order time - your UI just needs to surface the result.
Passage processes corporate actions on the user’s holdings. The updates flow through the same participations data your app already reads, so a re-fetch on session refresh keeps your UI accurate.
Public price data for surfaced equities can be rendered without an active user session, but order entry requires a signed-in, eligible user. See the API reference for which endpoints are public versus authenticated.