> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rwa.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Reproducing the Homepage

> The exact API queries behind every number, chart, and table on the RWA.xyz homepage

The [RWA.xyz homepage](https://app.rwa.xyz) 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](/api/requests): a JSON `query` parameter, URL-encoded with `curl -G --data-urlencode`.

```bash theme={null}
export RWA_API_KEY="your_api_key_here"
```

> [!NOTE]
>
> 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:

| Kind | Name | ID / value |
| - | - | - |
| Asset class | Stablecoins | `28` |
| Asset class | Cryptocurrency | `26` |
| Asset class | US Treasury Debt | `27` |
| Asset class | Corporate Credit, Diversified Credit, Asset-Backed Credit, Active Strategies, Specialty Finance | `32`, `42`, `51`, `52`, `55` |
| Tokenization type | Represented | `2` |
| Tokenization type | Distributed | `3` |

| Measure slug | Measure ID | Used for |
| - | -: | - |
| `bridged_token_value_dollar` | `71` | RWA value |
| `bridged_token_market_cap_dollar` | `70` | Stablecoin value |
| `holding_addresses_count` | `15` | Holders |
| `monthly_active_addresses_count` | `43` | Active addresses |
| `daily_transfer_volume_dollar` | `20` | Transfer volume |
| `adjusted_daily_mints_dollar` | `87` | Net flows (inflows) |
| `adjusted_daily_burns_dollar` | `88` | Net flows (outflows) |
| `apy_7_day` | `80` | Treasury yield |
| `apy_30_day` | `81` | High yield |

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`](/api/endpoints/tokens#get-v4tokensaggregates) and [`/v4/tokens/aggregates/timeseries`](/api/endpoints/tokens#get-v4tokensaggregatestimeseries). 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

| Group | Asset class filter | Measure (sort and display) |
| - | - | - |
| Tokenized U.S. Treasury Funds | `asset_class_id = 27`, `is_investable = true` | `bridged_token_value_dollar` |
| Stablecoins | `asset_class_id = 28`, `token_count > 0`, `bridged_token_market_cap_dollar > 0` | `bridged_token_market_cap_dollar` |
| Non-U.S. Govt. Debt | `asset_class_id = 30`, `token_count > 0` | `bridged_token_value_dollar` |
| Credit | `asset_class_id` in `32`, `31`, `42`, `51`, `55`; `token_count > 0` | `bridged_token_value_dollar` |
| Stocks | `asset_class_id = 34`, `token_count > 0` | `bridged_token_value_dollar` |
| PE / VC | `asset_class_id` in `35`, `56`; `token_count > 0` | `bridged_token_value_dollar` |
| Active Strategies | `asset_class_id = 52`, `token_count > 0` | `bridged_token_value_dollar` |
| Commodities | `asset_class_id = 37`, `token_count > 0` | `bridged_token_value_dollar` |
| Real Estate | `asset_class_id = 36` | `total_asset_value_dollar` |

**Example (Tokenized U.S. Treasury Funds):**

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/assets' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "fields": ["id", "name", "slug", "ticker", "bridged_token_value_dollar"],
    "filter": {
      "operator": "and",
      "filters": [
        {
          "operator": "and",
          "filters": [
            { "field": "asset_class_id", "operator": "equals", "value": 27 },
            { "field": "is_investable", "operator": "equals", "value": true }
          ]
        },
        { "field": "tokenization_type_ids", "operator": "not-includes", "value": 2 }
      ]
    },
    "sort": { "field": "bridged_token_value_dollar", "direction": "desc" },
    "pagination": { "page": 1, "perPage": 10 }
  }'
```

## 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.

| Figure | Measure | Filters (all combined with `and`) |
| - | - | - |
| Distributed Asset Value | `bridged_token_value_dollar` | `tokenization_type_id = 3`, `asset_class_id ≠ 28`, `asset_class_id ≠ 26`, `token_count > 0` |
| Represented Asset Value | `bridged_token_value_dollar` | `tokenization_type_id = 2`, `asset_class_id ≠ 28`, `asset_class_id ≠ 26`, `token_count > 0` |
| Total Asset Holders | `holding_addresses_count` | `asset_class_id ≠ 28`, `asset_class_id ≠ 26`, `token_count > 0` |
| Total Stablecoin Value | `bridged_token_market_cap_dollar` | `asset_class_id = 28`, `token_count > 0` |
| Total Stablecoin Holders | `holding_addresses_count` | `asset_class_id = 28`, `token_count > 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):**

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/tokens/aggregates' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "filter": {
      "operator": "and",
      "filters": [
        { "field": "measure_slug", "operator": "equals", "value": "bridged_token_value_dollar" },
        { "field": "tokenization_type_id", "operator": "equals", "value": 3 },
        { "field": "asset_class_id", "operator": "notEquals", "value": 28 },
        { "field": "asset_class_id", "operator": "notEquals", "value": 26 },
        { "field": "token_count", "operator": "gt", "value": 0 }
      ]
    },
    "aggregate": { "groupBy": "asset_class", "aggregateFunction": "sum", "mode": "stock" },
    "sort": { "field": "date", "direction": "asc" },
    "pagination": { "page": 1, "perPage": 25 }
  }' | jq '{ total: ([.results[].value] | add), dates: ([.results[].date] | unique) }'
```

For the 30-day-ago value, add this filter to the same request, using the date 30 days before today:

```json theme={null}
{ "field": "date", "operator": "onOrBefore", "value": "2026-09-21" }
```

**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:

```json theme={null}
{
  "results": [
    {
      "value": 9120000000.12,
      "date": "2026-10-20T00:00:00.000Z",
      "item_count": 412,
      "asset_count": 118,
      "reporting_asset_count": 117,
      "measure": { "id": 71, "slug": "bridged_token_value_dollar", "name": "Bridged Token Value (Dollar)", "unit": "dollar" },
      "group": { "id": 27, "type": "asset_class", "name": "US Treasury Debt", "slug": "us-treasury-debt", "color": "#05417a" }
    }
  ]
}
```

## 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

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/tokens/aggregates/timeseries' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "filter": {
      "operator": "and",
      "filters": [
        { "field": "measure_slug", "operator": "equals", "value": "bridged_token_value_dollar" },
        { "field": "asset_class_id", "operator": "notEquals", "value": 26 },
        { "field": "asset_class_id", "operator": "notEquals", "value": 28 },
        { "field": "tokenization_type_id", "operator": "equals", "value": 3 }
      ]
    },
    "aggregate": {
      "groupBy": "asset_class",
      "aggregateFunction": "sum",
      "interval": "day",
      "mode": "stock",
      "groupLimit": 50
    },
    "sort": { "field": "date", "direction": "desc" },
    "pagination": { "page": 1, "perPage": 100 }
  }'
```

### Tabs

| Tab | Measure | `interval` | `mode` |
| - | - | - | - |
| Total Value | `bridged_token_value_dollar` (stablecoins: `bridged_token_market_cap_dollar`) | `day` | `stock` |
| Asset Holders | `holding_addresses_count` | `day` | `stock` |
| Active Addresses | `monthly_active_addresses_count` | `month` | `stock` |
| Transfer Volume | `daily_transfer_volume_dollar` | `week` | `flow` |

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:

| Control | Filter added |
| - | - |
| Distributed (default) | `tokenization_type_id = 3` |
| Represented | `tokenization_type_id = 2`, and stablecoins are always excluded |
| All | no tokenization type filter |
| Include Stablecoins off (default) | `asset_class_id ≠ 28` |
| Include Stablecoins on, Total Value tab | an `or` that adds stablecoin market cap (see below) |
| Include Stablecoins on, other tabs | no stablecoin filter |

On the Total Value tab, stablecoins report value under a different measure. So with Include Stablecoins on, the chart combines two branches:

```json theme={null}
{
  "operator": "and",
  "filters": [
    {
      "operator": "or",
      "filters": [
        {
          "operator": "and",
          "filters": [
            { "field": "measure_slug", "operator": "equals", "value": "bridged_token_value_dollar" },
            { "field": "asset_class_id", "operator": "notEquals", "value": 26 },
            { "field": "asset_class_id", "operator": "notEquals", "value": 28 }
          ]
        },
        {
          "operator": "and",
          "filters": [
            { "field": "asset_class_id", "operator": "equals", "value": 28 },
            { "field": "measure_slug", "operator": "equals", "value": "bridged_token_market_cap_dollar" },
            { "field": "asset_class_id", "operator": "notEquals", "value": 26 }
          ]
        }
      ]
    },
    { "field": "tokenization_type_id", "operator": "equals", "value": 3 }
  ]
}
```

## 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`

> [!NOTE]
>
> 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):**

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/tokens/aggregates' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "filter": {
      "operator": "and",
      "filters": [
        { "field": "measure_slug", "operator": "equals", "value": "bridged_token_value_dollar" },
        { "field": "asset_class_id", "operator": "notEquals", "value": 28 },
        { "field": "tokenization_type_id", "operator": "notEquals", "value": 2 },
        {
          "operator": "or",
          "filters": [
            {
              "operator": "and",
              "filters": [
                { "field": "asset_class_id", "operator": "equals", "value": 27 },
                { "field": "is_investable", "operator": "equals", "value": true }
              ]
            },
            { "field": "asset_class_id", "operator": "notEquals", "value": 27 }
          ]
        }
      ]
    },
    "aggregate": { "groupBy": "network", "aggregateFunction": "sum", "mode": "stock", "groupLimit": 100 },
    "sort": { "field": "date", "direction": "asc" },
    "pagination": { "page": 1, "perPage": 25 }
  }'
```

## 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](https://www.newyorkfed.org/markets/reference-rates/sofr), smoothed with the same 7-day average.

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/assets/aggregates/timeseries' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "filter": {
      "operator": "and",
      "filters": [
        { "field": "measure_slug", "operator": "equals", "value": "apy_7_day" },
        { "field": "asset_ticker", "operator": "is_not_null", "value": null },
        { "field": "asset_class_id", "operator": "equals", "value": 27 },
        { "field": "circulating_asset_value_dollar", "operator": "gte", "value": 100000000 },
        { "field": "date", "operator": "onOrAfter", "value": "2023-12-26" }
      ]
    },
    "aggregate": { "groupBy": "asset_ticker", "aggregateFunction": "avg", "interval": "day" },
    "sort": { "field": "date", "direction": "asc" },
    "pagination": { "page": 1, "perPage": 25 }
  }'
```

## 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.

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/assets' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "fields": ["id", "ticker"],
    "filter": {
      "operator": "and",
      "filters": [
        {
          "operator": "or",
          "filters": [
            { "field": "asset_class_id", "operator": "equals", "value": 52 },
            { "field": "asset_class_id", "operator": "equals", "value": 51 },
            { "field": "asset_class_id", "operator": "equals", "value": 32 },
            { "field": "asset_class_id", "operator": "equals", "value": 42 },
            { "field": "asset_class_id", "operator": "equals", "value": 55 }
          ]
        },
        { "field": "circulating_asset_value_dollar", "operator": "gte", "value": 10000000 }
      ]
    },
    "sort": { "field": "circulating_asset_value_dollar", "direction": "desc" },
    "pagination": { "page": 1, "perPage": 3500 }
  }'
```

**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.

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/assets/aggregates/timeseries' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "filter": {
      "operator": "and",
      "filters": [
        { "field": "measure_slug", "operator": "equals", "value": "apy_30_day" },
        { "field": "asset_id", "operator": "in", "value": [101, 202, 303] }
      ]
    },
    "aggregate": { "groupBy": "asset_class", "aggregateFunction": "avg", "interval": "day" },
    "sort": { "field": "date", "direction": "asc" },
    "pagination": { "page": 1, "perPage": 25 }
  }'
```

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.

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/tokens/aggregates' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "filter": {
      "operator": "and",
      "filters": [
        {
          "operator": "or",
          "filters": [
            { "field": "measure_slug", "operator": "equals", "value": "adjusted_daily_mints_dollar" },
            { "field": "measure_slug", "operator": "equals", "value": "adjusted_daily_burns_dollar" }
          ]
        },
        { "field": "asset_class_id", "operator": "notEquals", "value": 28 },
        { "field": "date", "operator": "onOrAfter", "value": "2026-09-21T14:00:00.000Z" }
      ]
    },
    "aggregate": { "groupBy": "asset", "aggregateFunction": "sum", "mode": "flow", "groupLimit": 100 },
    "sort": { "field": "date", "direction": "asc" },
    "pagination": { "page": 1, "perPage": 25 }
  }'
```

## 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](https://app.rwa.xyz/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`

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/assets' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "fields": ["id", "name", "ticker", "asset_class_id", "asset_class_name", "circulating_asset_value_dollar.val", "_created_at"],
    "filter": {
      "operator": "and",
      "filters": [
        { "field": "token_count", "operator": "gt", "value": 0 },
        { "field": "primary_market_id", "operator": "gt", "value": 0 },
        { "field": "is_investable", "operator": "equals", "value": true },
        { "field": "inception_date", "operator": "is_not_null", "value": null },
        { "field": "asset_class_id", "operator": "notEquals", "value": 26 },
        { "field": "asset_class_id", "operator": "notEquals", "value": 28 },
        { "field": "_created_at", "operator": "onOrAfter", "value": "2026-09-21T14:00:00.000Z" }
      ]
    },
    "sort": { "field": "_created_at", "direction": "desc" },
    "pagination": { "page": 1, "perPage": 250 }
  }'
```

## 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.

```bash theme={null}
curl -G 'https://api.rwa.xyz/v4/assets' \
  -H "Authorization: Bearer $RWA_API_KEY" \
  --data-urlencode 'query={
    "filter": {
      "operator": "and",
      "filters": [
        { "field": "asset_class_id", "operator": "notEquals", "value": 26 },
        { "field": "asset_class_id", "operator": "notEquals", "value": 28 },
        { "field": "token_count", "operator": "gt", "value": 0 },
        { "field": "primary_market_id", "operator": "gt", "value": 0 },
        { "field": "tokenization_type_ids", "operator": "includes", "value": 3 },
        { "field": "tokenization_type_ids", "operator": "not-includes", "value": 2 }
      ]
    },
    "sort": { "field": "bridged_token_value_dollar", "direction": "desc" },
    "pagination": { "page": 1, "perPage": 50 }
  }'
```

## Data freshness and caching

* **Data is T-1.** On-chain metrics refresh once a day (see [Data Quality](/methodology/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

> **My total value is higher or lower than the homepage**
>
> * 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.

> **Stablecoins and RWAs are mixed together**
>
> 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.

> **Distributed and represented values don't add up**
>
> 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.

> **My holder count is about twice the homepage's**
>
> 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.

> **Transfer volume has huge spikes**
>
> `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.

> **My numbers match yesterday's homepage, not today's**
>
> Data is T-1 and cached for up to an hour on both sides; see [Data freshness and caching](#data-freshness-and-caching). Compare the `date` in your response with the date the homepage data was loaded.

> **I get an "All Others" row, or fewer data points than expected**
>
> 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](mailto:team@rwa.xyz) for full API access.

> **"groupBy value must be one of the following"**
>
> `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`](/api/meta) to see the available fields.

> **Still doesn't reconcile**
>
> 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](mailto:team@rwa.xyz) with your full query and the `date` in the response.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.