Skip to main content
The RWA.xyz homepage is built on the same /v4 API you use. This page lists the query behind each homepage element, so you can reproduce its numbers and reconcile your own results with ours. Every example uses the request style from Requests: a JSON query parameter, URL-encoded with curl -G --data-urlencode.
Two homepage elements do not come from the public API: the SOFR line on the Tokenized U.S. Treasury Yield chart, and the filter counts in the All Tokenized Assets table. Both are covered below.

Reference IDs

The homepage filters by numeric IDs. These are the IDs it uses: The homepage code filters on measure_id. The examples below use measure_slug, which selects the same measure.

How aggregate queries resolve dates

Most homepage figures come from /v4/tokens/aggregates and /v4/tokens/aggregates/timeseries. Three behaviors matter when you reconcile them:
  • mode: "stock" returns the latest value, and flow returns a sum. In stock mode, /v4/tokens/aggregates finds each token’s latest snapshot. It then takes the latest date within each group and sums the tokens reported on that date. Each result’s date field shows which day you got. If you omit mode, the endpoint defaults to flow and sums every daily snapshot in the date range, which is wrong for values and holders.
  • “30 days ago” is a date filter. To get the value as of an earlier day, add { "field": "date", "operator": "onOrBefore", "value": "YYYY-MM-DD" }. Stock mode then returns the latest snapshot on or before that date.
  • groupBy is required. The homepage groups by asset_class and adds the value of every result to get one total. date is not a valid groupBy value. Pagination does not limit aggregate results. If you set groupLimit, only the top N groups by value are returned individually, and the rest are combined into one “All Others” row. The limit applies separately to each measure.

Ticker marquee

The scrolling ticker at the top of the page shows the top 10 assets in each of nine groups. Each item shows the asset’s current value (val) and its 7-day change (chg_7d_pct).
  • Endpoint: GET /v4/assets, one request per group
  • Filters: the group’s asset class filter, plus tokenization_type_ids not-includes 2 (this excludes represented assets)
  • Sort: the group’s measure, descending; perPage: 10
  • Date handling: none; val is the latest value and chg_7d_pct is the 7-day change in percent
  • Display: assets with no ticker or no value are skipped
Example (Tokenized U.S. Treasury Funds):

Headline figures

The five figures under Global Market Overview each come from two /v4/tokens/aggregates requests: one for the current value and one for the value 30 days ago.
  • Endpoint: GET /v4/tokens/aggregates
  • Aggregate: { "groupBy": "asset_class", "aggregateFunction": "sum", "mode": "stock" }
  • Result: add value across all returned asset class rows
  • Date handling: the current request has no date filter, so each asset class uses its latest snapshot (normally yesterday). For the 30-day-ago request, add date onOrBefore the date 30 days before today.
  • 30D change: (current − value30DaysAgo) / value30DaysAgo as a fraction (multiply by 100 for a percentage). If the earlier value is 0 or missing, the homepage shows 0.
Notes:
  • RWA value uses bridged_token_value_dollar, not total_asset_value_dollar. Stablecoin value uses bridged_token_market_cap_dollar.
  • The RWA figures exclude both stablecoins (28) and cryptocurrency (26).
  • Total Asset Holders includes distributed and represented assets, so it has no tokenization_type_id filter.
  • Holder figures add up per-token holder counts. A wallet that holds three different tokens is counted three times.
Example (Distributed Asset Value):
For the 30-day-ago value, add this filter to the same request, using the date 30 days before today:
Response shape (one row per asset class; values are illustrative). date is returned as a timestamp, and its YYYY-MM-DD part is the snapshot day:

Total RWA Value chart

The large chart below the headline figures plots one series per asset class. Its controls change the query:
  • Endpoint: GET /v4/tokens/aggregates/timeseries
  • Aggregate: groupBy: "asset_class", aggregateFunction: "sum", groupLimit: 50, plus the interval and mode for each tab (below)
  • Date handling: no date filter, so the response covers the full history. The chart initially zooms to the last three years. Each point is a daily sum, or one value per week or month for the weekly and monthly tabs.
  • Display: the “None” group is hidden. Gaps in the Repurchase Agreements series are filled with the previous day’s value. The tooltip total is the sum of the visible series for that date.

Default view: Total Value, Distributed, stablecoins off

Tabs

In flow mode, each weekly Transfer Volume point is the sum of that week’s daily totals. Weeks start on Sunday, each point is labeled with that Sunday’s date, and the latest week is partial. In stock mode, each monthly point is the last daily value of that month.

Distribution and stablecoin controls

Every tab keeps asset_class_id ≠ 26. The controls add these filters: On the Total Value tab, stablecoins report value under a different measure. So with Include Stablecoins on, the chart combines two branches:

RWA League Table

The league table ranks groups by current RWA value. It has four tabs (Networks, Managers, Platforms, and Asset Classes) and a Distributed / Represented / All selector. Distributed is the default.
  • Endpoint: GET /v4/tokens/aggregates, two requests (current and 30 days ago) for each tab and selector option
  • Measure: bridged_token_value_dollar
  • Aggregate: aggregateFunction: "sum", mode: "stock", groupLimit: 100, and groupBy set by the tab: network, manager, protocol (Platforms), or asset_class
  • Filters:
    • asset_class_id ≠ 28
    • U.S. Treasuries must be investable: (asset_class_id = 27 and is_investable = true) or asset_class_id ≠ 27
    • Distributed: tokenization_type_id notEquals 2. Represented: tokenization_type_id = 2. All: no tokenization type filter.
  • Date handling: the current request has no date filter. The 30-day-ago request adds date onOrBefore the date 30 days before today.
  • Rows: the “None” and “All Others” groups are dropped, along with rows with a value of 0 and the off-chain (book_entry) network row. Rows are sorted by value.
  • Columns:
    • Total Value = value
    • 30D% = (value − value30DaysAgo) / value30DaysAgo. A group that is missing from the 30-day-ago response, or has a value of 0 there, shows 0.
    • Market Share = value ÷ the sum of value across all named groups. The sum leaves out “None” and “All Others” but is calculated before the zero-value and off-chain rows are hidden.
    • RWA Count = asset_count
The league table defines “Distributed” as tokenization_type_id notEquals 2. The headline figures and the chart use tokenization_type_id equals 3. The league table also does not exclude cryptocurrency (26). Its Distributed total can therefore differ from the Distributed Asset Value headline figure.
Example (Networks tab, Distributed):

Total RWA Value pie chart

The pie chart reuses the league table data. It defaults to the Platforms tab (groupBy: "protocol") with the Distributed option. Each slice is a league table row’s value. To reproduce it, run the league table query with "groupBy": "protocol".

Tokenized U.S. Treasury Yield chart

This chart shows the equal-weighted average 7-day APY of large tokenized U.S. Treasury funds, smoothed over 7 days.
  • Endpoint: GET /v4/assets/aggregates/timeseries
  • Measure: apy_7_day
  • Filters: asset_ticker is_not_null, asset_class_id = 27, circulating_asset_value_dollar gte 100000000 (current circulating asset value of at least $100M), date onOrAfter 2023-12-26
  • Aggregate: groupBy: "asset_ticker", aggregateFunction: "avg", interval: "day"
  • Post-processing:
    1. For each date, average the values of every ticker that has a point on that date. Each fund has equal weight.
    2. Apply a trailing 7-calendar-day simple moving average. The average for each date is the mean of the points that exist from 6 days before that date through the date itself. A series has no smoothed points until 6 days after its first point.
    3. Display from 2024-01-01. The query starts on 2023-12-26 so that the first displayed point has a full 7-day window.
  • Show Constituents: draws each ticker’s unsmoothed series in gray behind the average.
  • SOFR line: not served by the API. It is the Secured Overnight Financing Rate from the Federal Reserve Bank of New York, smoothed with the same 7-day average.

Tokenized High Yield chart

This chart compares the average 30-day APY of five credit and strategy asset classes. Building it takes two steps. Step 1: select qualifying assets. Use GET /v4/assets with:
  • asset_class_id equal to one of 52, 51, 32, 42, or 55 (an or filter)
  • circulating_asset_value_dollar gte 10000000
  • fields: ["id", "ticker"], perPage: 3500
Then remove these tickers, which were excluded after manual data-quality review: ACRED, BR0OVSCTF004, BR0OVSCTF012, BRVERTDBS0I1, GSTR, mGLO, mGLOBAL, pEAK, RLP, STAC, USD3, xSOLY. The remaining id values are the qualifying assets. This exclusion list is part of the homepage code and may change.
Step 2: query the APY timeseries.
  • Endpoint: GET /v4/assets/aggregates/timeseries
  • Measure: apy_30_day
  • Filters: asset_id in the IDs from step 1
  • Aggregate: aggregateFunction: "avg", interval: "day". Use groupBy: "asset_class" for the default “All asset classes” view.
  • Date handling: no date filter, so the response covers the full history
  • Post-processing: apply the same trailing 7-calendar-day average as the Treasury chart to each series. Each series starts 6 days after its first point.
  • Selecting an asset class: add asset_class_id = <id> and switch to groupBy: "asset". The chart averages the assets’ values on each date with equal weight, smooths that average over 7 days, and draws the individual assets unsmoothed in gray.
Replace [101, 202, 303] with the IDs from step 1.

Net Flows card

Net flows are inflows (mints) minus outflows (burns) over a trailing window, excluding stablecoins. The card defaults to grouping by Asset over 30D.
  • Endpoint: GET /v4/tokens/aggregates
  • Measures: adjusted_daily_mints_dollar and adjusted_daily_burns_dollar. The homepage request has no measure filter and reads these two measures from the response. Adding the filter shown below gives the same rows.
  • Filters: asset_class_id ≠ 28 and date onOrAfter the window start. Group by Manager also adds manager_id gt 0.
  • Aggregate: groupBy set to asset, asset_class, or manager; aggregateFunction: "sum", mode: "flow", groupLimit: 100
  • Date handling: the window starts N days before the time the homepage data was loaded and has no end date, so it runs through the latest data (yesterday). 7D = 7 days, 30D = 30, 90D = 90, 6M = 180, 1Y = 365, and YTD starts on January 1 (UTC). The homepage sends the start as a full timestamp rounded down to the hour, for example 2026-09-21T14:00:00.000Z.
  • Post-processing: for each group.id, net flow = mints value − burns value. A group with only a burn row has a net flow of −burns. The “All Others” rows (group.id -1) are netted the same way. Sort by absolute net flow and keep the top 10. Because groupLimit applies to mints and burns separately, a group can fall into “All Others” for one measure but not the other.

Recently Registered Assets

This card lists assets that were added to RWA.xyz in the last 30 days and that meet the New Asset Monitor criteria.
  • Endpoint: GET /v4/assets
  • Filters: token_count > 0, primary_market_id > 0, is_investable = true, inception_date is_not_null, asset_class_id ≠ 26, asset_class_id ≠ 28, and _created_at onOrAfter 30 days before the time the homepage data was loaded. The cutoff is a full timestamp rounded down to the hour, for example 2026-09-21T14:00:00.000Z. A date-only value would also include assets registered earlier that day.
  • Sort: _created_at descending; perPage: 250
  • Columns: name and ticker, asset class, value (circulating_asset_value_dollar.val), and registration date (_created_at)
  • Count: pagination.resultCount

All Tokenized Assets table

The table at the bottom of the page lists distributed, non-stablecoin RWAs, sorted by value.
  • Endpoint: GET /v4/assets
  • Filters: asset_class_id ≠ 26, asset_class_id ≠ 28, token_count > 0, primary_market_id > 0, tokenization_type_ids includes 3, and tokenization_type_ids not-includes 2
  • Sort: bridged_token_value_dollar descending; perPage: 50
  • Columns:
    • Total Value = bridged_token_value_dollar.val
    • 30D APY = apy_30_day.val
    • 30D = bridged_token_value_dollar.chg_30d_pct (in percent)
    • Platform = the most common tokens[].platform among the asset’s tokens with issuance_type NATIVE. On a tie, the platform encountered first wins.
    • Networks = the asset’s distinct tokens[].network values by slug, excluding book-entry, sorted by name
  • Pagination: the example returns the first 50 rows. Request more pages to get the full list.
  • Filter panel: the counts and the histogram come from a direct database query over the same base filter. They describe the whole base list, not the currently filtered table. To reproduce them, page through the base query:
    • Asset class and network counts: the number of assets per asset_class_id, and per network. An asset counts once for every network it is on.
    • Redemption term counts: the number of assets per primary_market__redemption_frequency, combined into options. Instant = Instant + 30 minutes if US markets are open. Otherwise next trading day.; Daily = Daily + U.S. Banking Daily; Monthly = Monthly (30d) + Monthly (Calendar); Weekly, Quarterly, Yearly (Yearly (360d)), and Maturity only (Only at maturity) each map to one value.
    • 30D APY histogram: collect every apy_30_day.val greater than 0. Split the range from 0 to ceil(max + 2) into 48 equal-width bins (the range is 0 to 1 when there are no values), count the values in each bin, and scale the bars so the tallest is 1.

Data freshness and caching

  • Data is T-1. On-chain metrics refresh once a day (see Data Quality), so the latest date is normally yesterday. There is no intraday data.
  • Responses are cached. API responses are edge-cached for up to an hour (Cache-Control: s-maxage=3600). The homepage also caches its queries for up to an hour. For a while after the daily refresh, the API or the homepage may still show the prior day.
  • Check the date. Each /v4/tokens/aggregates row includes the date it represents. Compare figures only when the dates match.

Troubleshooting

  • Use bridged_token_value_dollar for RWAs and bridged_token_market_cap_dollar for stablecoins. total_asset_value_dollar is a different measure and will not match.
  • Send "mode": "stock". Without it, the aggregates endpoints default to flow and add up every daily snapshot.
  • Group by asset_class with sum, then add value across all returned rows.
  • Exclude cryptocurrency (asset_class_id ≠ 26) as well as stablecoins.
Filter by asset class: use asset_class_id ≠ 28 for RWAs and asset_class_id = 28 for stablecoins. The homepage shows these as separate figures: Distributed Asset Value, Represented Asset Value, and Total Stablecoin Value.
The split comes from tokenization_type_id: 3 is distributed and 2 is represented. Distributed Asset Value and Represented Asset Value are separate figures. The league table’s Distributed view uses tokenization_type_id ≠ 2 and does not exclude cryptocurrency, so its total can differ slightly from the headline figure.
Total Asset Holders and Total Stablecoin Holders are separate figures. If you sum holding_addresses_count without an asset class filter, you add them together. Use asset_class_id ≠ 28 and ≠ 26 for asset holders, and asset_class_id = 28 for stablecoin holders. Holder figures are sums of per-token counts, not unique wallets.
daily_transfer_volume_dollar is a raw daily total, and it counts every hop. If tokens move from A to B and then from B to C, both transfers count. Flash-loan loops can move the same funds through many hops in one transaction and inflate the total. For example, on 2026-10-17 the daily total reached about $3.51T on BNB Chain and $170B on Ethereum. The homepage Transfer Volume tab uses the same measure, summed per week in flow mode, so its weekly bars include these spikes too.
Data is T-1 and cached for up to an hour on both sides; see Data freshness and caching. Compare the date in your response with the date the homepage data was loaded.
On plans with limited API access, /v4/tokens/aggregates returns at most 10 groups plus an “All Others (N Items)” row, and timeseries responses keep only the most recent points (30 for daily measures). Include the “All Others” row when you sum totals. These plans also have a request allowance that is smaller than the number of requests the homepage makes. Contact team@rwa.xyz for full API access.
groupBy takes entity names such as asset_class, network, protocol, manager, asset, or token. date and *_id values are not accepted. Call /v4/tokens/aggregates/meta to see the available fields.
If your API key has a scoped access policy, every query is limited to that scope, and totals will be lower than the homepage. Email team@rwa.xyz with your full query and the date in the response.