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

# List Stablecoins

> Stablecoin-only twin of `GET /v3/rwa`: the depeg list with `segment` fixed to `stablecoin`. `stablecoin` here is the derived segment, not `asset_class` fiat: membership also admits tokens for their stable peg behaviour, and those rows carry no `asset_class`. Read each row's `asset_class` to separate confirmed fiat from null. Each row is enriched with the v3 composite letter grade (`grade`, null when ungraded) plus top-level `schema_version` and `grades_available`. Accepts every `GET /rwa` filter except `segment`; `pegType` narrows by peg mechanism; note `direct` is also the fallback for a token with no recorded denomination, so it means "cash-backed OR not yet classified", and `yield-bearing` cuts across the other four rather than being a fifth peer. Requires the v3 API usage plan. `aggregates` (including `aggregates.tier_counts`) covers the segment-selected universe: the segment is applied before aggregation, every other filter after it. The TOP-LEVEL `tier_counts` is different — it counts the filtered result set, before pagination. `pegType` and the other filters are post-aggregate view filters.

The v3 depeg list with `segment` pinned to `stablecoin` server-side — this route cannot return an RWA, and a caller-supplied `segment` is ignored.

Use it when your integration only ever wants stablecoins. If you need both segments from one call, use [`GET /rwa`](/api-reference/depeg-monitor/list-pegged-tokens-with-depeg-risk) and pass `segment` yourself — note those rows do **not** carry the v3 composite `grade` this route adds.

<Warning>
  **Two polarities in one payload.** Each row carries the v3 composite `grade` (risk polarity: `A+` ≈ 0 risk, `F` ≈ 100) **and** the v2 depeg `score`. Do not compare them directly. See [Score Polarity](/api-reference/rwa-v3#score-polarity).
</Warning>

## What counts as a stablecoin

A **segment** is a category derived from the asset classification fields (`asset_class`, `is_rwa`, `subclass`); it is not one of their values:

| Segment | Rule |
| - | - |
| `rwa` | `is_rwa` is true and `asset_class` is not `fiat` |
| `stablecoin` | everything else |

`asset_class = fiat` means the token is **denominated in a government currency** — it is not a statement about what backs the peg. USDC, DAI and USDe are all fiat-denominated and all stablecoins, whether the reserves are cash, over-collateralised crypto or a hedged derivative book.

<Warning>
  Do **not** pass an `asset_class` value such as `fiat` or `fixed-income` to `segment`. They are different vocabularies: `segment` is `stablecoin` or `rwa`, while each returned row's `asset_class` reads `fiat`, `fixed-income`, `commodity` and so on. Every row carries both, so you can see why it matched.
</Warning>

<Warning>
  **`segment = stablecoin` is not the same as `asset_class = "fiat"`.**

  A token joins the pegged universe through **any one** of three signals: `asset_class = "fiat"`, `is_rwa = true`, or a stable peg behaviour. The third admits tokens that assert a stable peg whose backing is not confirmed, and those deliberately carry **no** `asset_class`. They resolve to the `stablecoin` segment.

  Read each row's `asset_class` to tell a confirmed fiat token (`"fiat"`) from one carrying none (`null`). A non-trivial minority of stablecoin rows are `null`, so do not filter client-side on `asset_class === "fiat"` expecting the full set.
</Warning>

## Narrowing by peg mechanism

`pegType` filters by **how the peg is held**, which is a separate axis from the segment:

| Value | Meaning |
| - | - |
| `direct` | held in cash and equivalents |
| `collateralized` | crypto-backed, typically over-collateralised |
| `algorithmic` | algorithmic supply control |
| `derivative-hedged` | hedged derivative book |
| `yield-bearing` | yield-bearing wrapper |

<Warning>
  `yield-bearing` is **not** a fifth peer of the other four. The first four partition how the peg is *defended*; `yield-bearing` answers whether the holder receives yield, so it cuts across them. Treat the five as one selector rather than a clean taxonomy, and do not assume `pegType=direct` returns every cash-backed token.
</Warning>

<Note>
  **A classification outage does not fail closed here.** The grades and detail aliases answer `503` when the classification cannot be loaded; this list is served from a cached set of tracked tokens instead, so the same outage yields the last-known list, or an empty one, with `200`. The `stale` flag reflects the pricing snapshot, not the token set, so it will not signal it either. Treat an unexpectedly empty result as unknown rather than as "no stablecoins match".

  The `503` in the response list below is the payment path (x402), not a classification failure.
</Note>

<Note>
  A token with no denomination record falls back to a currency lookup, where the listed fiat codes read `direct`. Treat `direct` as "cash-backed **or not yet classified**" rather than a confirmed reserve model.
</Note>


## OpenAPI

````yaml GET /v3/stablecoins
openapi: 3.0.1
info:
  title: Risk Score API
  description: API definition for Webacy Risk Scores
  version: 1.9.0
servers:
  - url: https://api.webacy.com
    description: Webacy Risk Score API (Production)
  - url: https://api-development.webacy.com
    description: Webacy Risk Score API (Development)
  - url: http://0.0.0.0:3030/api/v1/risk-score
    description: Webacy Risk Score API - Local
security:
  - api_key: []
tags:
  - name: Webhooks
    description: >-
      Subscribe to and manage real-time event notifications (currently
      DEPEG_TIER_CHANGE)
  - name: Threat Risks
    description: Analyze addresses for security threats and malicious activity
  - name: Sanction Checks
    description: Check addresses against OFAC and other sanction lists
  - name: Approval Risks
    description: Analyze token approvals and associated risks
  - name: Transaction Risks
    description: Assess risk details for blockchain transactions
  - name: Exposure Risk
    description: Understand risk profile and exposure of addresses
  - name: Contract Risk
    description: Real-time smart contract security analysis
  - name: URL Risks
    description: Analyze URLs for phishing and security threats
  - name: API Usage
    description: Monitor and manage API consumption
  - name: Holder Analysis
    description: Token holder distribution and sniper detection
  - name: Address Poisoning
    description: Detect address poisoning attack patterns
  - name: Token Analysis
    description: Comprehensive token security and market analysis
  - name: Pool Analysis
    description: Liquidity pool data and analysis
  - name: Transaction Scanning
    description: Scan and simulate transactions for risks
  - name: trading-lite
    description: Lightweight trading risk assessment
  - name: RWA & Pegged Tokens
    description: >-
      Real-world asset and pegged-token analytics (supply flows, mint/burn
      velocity)
  - name: Vault Risk v3
    description: >-
      Webacy-native v3 vault risk surface — composite grade, categories,
      coverage, and the framework taxonomy.
  - name: RWA Risk v3
    description: >-
      Webacy-native v3 RWA / stablecoin risk surface — composite grade,
      structural-health criteria, and batch scoring.
  - name: Stablecoins v3
    description: >-
      Stablecoin-only aliases of the v3 RWA routes: same grades, same shapes,
      `segment` fixed to `stablecoin`.
paths:
  /v3/stablecoins:
    get:
      tags:
        - Stablecoins v3
      summary: List stablecoins with depeg data and the v3 composite grade
      description: >-
        Stablecoin-only twin of `GET /v3/rwa`: the depeg list with `segment`
        fixed to `stablecoin`. `stablecoin` here is the derived segment, not
        `asset_class` fiat: membership also admits tokens for their stable peg
        behaviour, and those rows carry no `asset_class`. Read each row's
        `asset_class` to separate confirmed fiat from null. Each row is enriched
        with the v3 composite letter grade (`grade`, null when ungraded) plus
        top-level `schema_version` and `grades_available`. Accepts every `GET
        /rwa` filter except `segment`; `pegType` narrows by peg mechanism; note
        `direct` is also the fallback for a token with no recorded denomination,
        so it means "cash-backed OR not yet classified", and `yield-bearing`
        cuts across the other four rather than being a fifth peer. Requires the
        v3 API usage plan. `aggregates` (including `aggregates.tier_counts`)
        covers the segment-selected universe: the segment is applied before
        aggregation, every other filter after it. The TOP-LEVEL `tier_counts` is
        different — it counts the filtered result set, before pagination.
        `pegType` and the other filters are post-aggregate view filters.
      operationId: listStablecoinsV3
      parameters:
        - name: chain
          in: query
          required: false
          schema:
            type: string
          description: >-
            Filter by short chain code (e.g. `eth`, `arb`, `pol`, `opt`, `base`,
            `bsc`, `sol`).
        - name: denomination
          in: query
          required: false
          schema:
            type: string
          description: Filter by denomination code (e.g. `USD`, `EUR`, `XAU`).
        - name: tier
          in: query
          required: false
          schema:
            type: string
            enum:
              - critical
              - warning
              - watch
              - ok
              - premium
          description: Filter by display tier.
        - name: pegType
          in: query
          required: false
          schema:
            type: string
            enum:
              - direct
              - collateralized
              - algorithmic
              - derivative-hedged
              - yield-bearing
          description: >-
            Filter by peg mechanism (`denomination.pegType`): `direct` =
            fiat-backed, `collateralized` = crypto-backed. A token with no
            recorded denomination falls back to Webacy's currency mapping, where
            the listed fiat codes read as `direct`; one with no denomination at
            all (a token pending classification, or a currency outside that
            mapping) is excluded by this filter. Unknown values are ignored.
        - name: tags
          in: query
          required: false
          schema:
            type: string
          description: >-
            Comma-separated token labels: `standard`, `yield`, `rwa`, `gold`,
            `bridged`, `vault`.
        - name: minScore
          in: query
          required: false
          schema:
            type: number
            minimum: 0
            maximum: 100
          description: Minimum risk score (0-100).
        - name: maxScore
          in: query
          required: false
          schema:
            type: number
            minimum: 0
            maximum: 100
          description: Maximum risk score (0-100).
        - name: minMcap
          in: query
          required: false
          schema:
            type: number
            minimum: 0
          description: Minimum market cap in USD.
        - name: liquidity
          in: query
          required: false
          schema:
            type: string
            enum:
              - high
              - medium
              - low
              - very_low
          description: Filter by liquidity tier.
        - name: q
          in: query
          required: false
          schema:
            type: string
            maxLength: 100
          description: Substring match on `symbol`, `name`, or `address`.
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - score
              - symbol
              - chain
              - tier
              - abs_dev_clean
              - market_cap_usd
              - ts
            default: score
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
            default: desc
        - name: showAll
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: >-
            When `true`, include excluded/problematic tokens that are normally
            suppressed.
        - name: collapsedOnly
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: When `true`, return only collapsed/dead tokens (graveyard view).
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
        - name: pageSize
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 500
            default: 50
        - name: grading_scheme
          in: query
          required: false
          schema:
            type: string
            enum:
              - v1
              - v2
              - peg
            default: v2
          description: >-
            Grading scheme to pin — selects the per-category weights and
            letter-grade band table. Default `v2` (alias of `v1`'s weights,
            standard 11-band grade scale). `peg` is the peg-loss-focused
            weighting. `v3`/`v4`/`peg-liquidity` are registered but withheld
            behind the `v3-grading-scheme` feature flag. Unknown values return
            400 with the supported list.
      responses:
        '200':
          headers:
            x-credit-token:
              $ref: '#/components/headers/XCreditToken'
            x-credit-balance-cu:
              $ref: '#/components/headers/XCreditBalanceCu'
          description: >-
            Paginated list of pegged tokens with depeg risk data and ecosystem
            aggregates
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RwaTokenListGradedResponse'
        '400':
          description: Unsupported chain, tier, sort, or order value
        '402':
          $ref: '#/components/responses/X402PaymentRequired'
        '403':
          $ref: '#/components/responses/UnauthorizedError'
          description: Missing or invalid x-api-key
        '503':
          $ref: '#/components/responses/X402ServiceUnavailable'
      security:
        - api_key: []
components:
  headers:
    XCreditToken:
      description: >-
        Opaque bearer token for a prepaid x402 CU balance. Send it as
        `x-credit-token` to spend that balance. If the balance is insufficient
        and a payment for its verified payer settles, the same token is topped
        up and returned; otherwise the paid call returns a new independent
        token.
      schema:
        type: string
    XCreditBalanceCu:
      description: CU remaining for the returned or presented credit token after this call.
      schema:
        type: integer
        minimum: 0
        example: 480
  schemas:
    RwaTokenListGradedResponse:
      allOf:
        - $ref: '#/components/schemas/RwaTokenListResponse'
        - type: object
          required:
            - schema_version
            - grades_available
            - items
          properties:
            schema_version:
              type: string
              example: '3.3'
            grades_available:
              type: boolean
              description: >-
                false when the grading pipeline was unavailable for this request
                (grades are null for that reason).
            items:
              type: array
              items:
                $ref: '#/components/schemas/RwaTokenListGradedItem'
    RwaTokenListResponse:
      type: object
      required:
        - items
        - pagination
        - aggregates
        - tier_counts
        - stale
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/RwaTokenListItem'
        pagination:
          $ref: '#/components/schemas/RwaPagination'
        aggregates:
          $ref: '#/components/schemas/RwaAggregates'
        tier_counts:
          type: object
          description: Post-filter tier counts (after query filters, before pagination).
          required:
            - critical
            - warning
            - watch
            - ok
          properties:
            critical:
              type: integer
              minimum: 0
            warning:
              type: integer
              minimum: 0
            watch:
              type: integer
              minimum: 0
            ok:
              type: integer
              minimum: 0
        stale:
          type: boolean
          description: >-
            true when the snapshot is served from the fallback cache during an
            upstream data outage.
    RwaTokenListGradedItem:
      allOf:
        - $ref: '#/components/schemas/RwaTokenListItem'
        - type: object
          required:
            - grade
          properties:
            grade:
              type: string
              nullable: true
              example: A-
              description: >-
                v3 composite letter grade, or null when the token is not in the
                graded snapshot.
    RwaTokenListItem:
      type: object
      description: >-
        Single token row in the paginated list response, combining peg
        monitoring data with token identity. Most numeric fields are nullable to
        reflect partial coverage.
      required:
        - address
        - chain
        - symbol
        - name
        - assetType
        - denomination
        - has_monitor_data
        - ts
        - score
        - tier
        - drivers
        - price
        - peg_value
        - abs_dev_clean
        - reference_price
        - within_expected_range
        - token_type
        - token_labels
        - peg_range
        - is_collapsed
        - rwa_nav_usd
        - rwa_classification
        - rwa_nav_as_of
        - market_cap_usd
        - total_market_cap_usd
        - market_cap_by_chain
        - circulating_supply
        - total_supply_on_chain
        - total_supply_cross_chain
        - fdv_usd
        - volume_24h
        - volume_24h_usd
        - dex_volume_24h_usd
        - volume_mcap_ratio
        - markets
        - markets_all_chains
        - total_dex_liquidity_all_chains_usd
        - migration
        - project_info
        - score_delta_24h
        - score_delta_7d
        - liquidity_tier
        - slippage_bps_100k
        - liquidity_available_100k
        - liquidity_decay_pct
        - liquidity_decay_flag
        - volume_60m
        - volatility_burst
        - volatility_ratio
        - max_drawdown_5m
        - mins_over_50bp_60m
        - mins_over_100bp_60m
        - streak_over_50bp_min
        - streak_over_100bp_min
        - chain_spread_5m
        - chain_spread_60m
        - price_source_deviation
        - volume_z_5m
        - volume_z_60m
        - oracle_price
        - oracle_deviation_bps
        - oracle_deviation_flag
        - risk
        - asset_class
        - is_rwa
        - subclass
      properties:
        address:
          type: string
        chain:
          type: string
        symbol:
          type: string
        name:
          type: string
          nullable: true
        assetType:
          type: string
        asset_class:
          type: string
          nullable: true
          example: fiat
          description: >-
            Asset class (fiat, fixed-income, commodity, ...). NOT equivalent to
            the `stablecoin` segment: a token admitted for its stable peg
            behaviour carries a null `asset_class` and still resolves to
            `stablecoin`. Null means the token has no confirmed class — either
            unclassified, or confirmed stable without a confirmed backing type.
        segment:
          type: string
          enum:
            - stablecoin
            - rwa
          description: >-
            The computed category the `segment` filter selects on, derived from
            `asset_class` / `is_rwa` (`rwa` = `is_rwa` true and not fiat,
            `stablecoin` = everything else). Returned so a client can see why a
            row matched without re-implementing the rule. It is a derived
            category, not a classification dimension value.
        is_rwa:
          type: boolean
          nullable: true
          description: Real-world-asset flag. `true` (and not fiat) ⇔ `segment` `rwa`.
        subclass:
          type: string
          nullable: true
          example: tbill
          description: >-
            Asset subclass (tbill, money_market, tokenized_fund, gold, ...).
            Null when none.
        denomination:
          $ref: '#/components/schemas/RwaDenominationSummary'
        has_monitor_data:
          type: boolean
          description: >-
            Whether Webacy has ingested peg monitoring data for this token.
            `true` = a peg/risk record exists; `false` = the token is tracked
            but not yet ingested, so its risk fields (score, tier, price, ...)
            are null because no data exists yet, not because it was scored
            empty.
        ts:
          type: string
          format: date-time
          nullable: true
        score:
          type: number
          nullable: true
        tier:
          $ref: '#/components/schemas/RwaRiskTier'
        drivers:
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/RwaScoreDriver'
        price:
          type: number
          nullable: true
        peg_value:
          type: number
          nullable: true
        abs_dev_clean:
          type: number
          nullable: true
        reference_price:
          type: number
          nullable: true
        within_expected_range:
          type: boolean
          nullable: true
        token_type:
          $ref: '#/components/schemas/RwaTokenType'
        token_labels:
          type: array
          items:
            type: string
        peg_range:
          type: array
          nullable: true
          description: '[min, max] tuple.'
          items:
            type: number
          minItems: 2
          maxItems: 2
        is_collapsed:
          type: boolean
        rwa_nav_usd:
          type: number
          nullable: true
        rwa_classification:
          $ref: '#/components/schemas/RwaClassification'
        rwa_nav_as_of:
          type: string
          nullable: true
        market_cap_usd:
          type: number
          nullable: true
          description: >-
            Single-chain market cap (this token's chain only). Use
            `total_market_cap_usd` for the cross-chain rollup — that's the
            headline number for multi-chain tokens like USDC.
        total_market_cap_usd:
          type: number
          nullable: true
          description: >-
            Cross-chain market cap rollup across every chain the token is
            deployed on. Headline mcap for multi-chain tokens; may exceed
            `market_cap_usd`.
        market_cap_by_chain:
          type: object
          nullable: true
          description: >-
            Per-chain market cap breakdown keyed by short chain code. `null`
            when no per-chain data is available.
          additionalProperties:
            type: number
            format: double
        circulating_supply:
          type: number
          nullable: true
          description: >-
            Circulating supply — derived from market cap and price. See
            `total_supply_*` for the breakdown.
        total_supply_on_chain:
          type: number
          nullable: true
          description: >-
            On-chain supply on this token's chain only. Use
            `total_supply_cross_chain` for the cross-chain total.
        total_supply_cross_chain:
          type: number
          nullable: true
          description: >-
            Cross-chain aggregated supply across every chain the token is
            deployed on. Headline supply for multi-chain tokens.
        fdv_usd:
          type: number
          nullable: true
          description: Fully-diluted valuation in USD.
        volume_24h:
          type: number
          nullable: true
          deprecated: true
          description: >-
            Deprecated. Use `volume_24h_usd`; `volume_24h` is the legacy alias
            kept only while consumers migrate.
        volume_24h_usd:
          type: number
          nullable: true
          description: Canonical 24h volume in USD.
        dex_volume_24h_usd:
          type: number
          nullable: true
          description: 24h DEX-only volume in USD.
        volume_mcap_ratio:
          type: number
          nullable: true
        markets:
          type: array
          nullable: true
          description: >-
            DEX market entries. `null` = outside the top-N liquidity scope (not
            computed); `[]` = in scope but no DEX markets found; populated =
            real entries. Host-chain-scoped — this token's chain only; see
            `markets_all_chains` for the cross-chain venue view.
          items:
            $ref: '#/components/schemas/RwaMarket'
        markets_all_chains:
          type: array
          nullable: true
          description: >-
            Cross-chain DEX pools: the token's top pools across every chain it
            is deployed on, each entry tagged with its own `chain`. Unlike
            `markets` (host-chain-scoped, feeds chain-specific risk scoring),
            this is the venue/distribution view. Same null-vs-empty semantics as
            `markets`: `null` = not computed; `[]` = computed but no pools
            found.
          items:
            $ref: '#/components/schemas/RwaMarket'
        total_dex_liquidity_all_chains_usd:
          type: number
          format: double
          nullable: true
          description: >-
            Total pooled USD across the full cross-chain pool set. Summed over
            the uncapped set, so it can exceed the sum of the top-N entries
            returned in `markets_all_chains`. `null` when not computed.
        migration:
          $ref: '#/components/schemas/RwaMigration'
        project_info:
          $ref: '#/components/schemas/RwaProjectInfo'
        score_delta_24h:
          type: number
          nullable: true
          description: Score change over the trailing 24h.
        score_delta_7d:
          type: number
          nullable: true
          description: Score change over the trailing 7d.
        liquidity_tier:
          $ref: '#/components/schemas/RwaLiquidityTier'
        slippage_bps_100k:
          type: number
          nullable: true
        liquidity_available_100k:
          type: boolean
          nullable: true
        liquidity_decay_pct:
          type: number
          nullable: true
        liquidity_decay_flag:
          type: boolean
          nullable: true
        volume_60m:
          type: number
          nullable: true
        volatility_burst:
          type: boolean
          nullable: true
        volatility_ratio:
          type: number
          nullable: true
        max_drawdown_5m:
          type: number
          nullable: true
        mins_over_50bp_60m:
          type: number
          nullable: true
        mins_over_100bp_60m:
          type: number
          nullable: true
        streak_over_50bp_min:
          type: number
          nullable: true
        streak_over_100bp_min:
          type: number
          nullable: true
        chain_spread_5m:
          type: number
          nullable: true
        chain_spread_60m:
          type: number
          nullable: true
        price_source_deviation:
          type: number
          nullable: true
        volume_z_5m:
          type: number
          nullable: true
        volume_z_60m:
          type: number
          nullable: true
        oracle_price:
          type: number
          nullable: true
        oracle_deviation_bps:
          type: number
          nullable: true
        oracle_deviation_flag:
          type: boolean
          nullable: true
        risk:
          type: object
          nullable: true
          description: Standard risk response (same shape as token/pool risk endpoints).
          additionalProperties: true
    RwaPagination:
      type: object
      required:
        - total
        - page
        - pageSize
        - totalPages
      properties:
        total:
          type: integer
          minimum: 0
        page:
          type: integer
          minimum: 1
        pageSize:
          type: integer
          minimum: 1
          maximum: 500
        totalPages:
          type: integer
          minimum: 0
    RwaAggregates:
      type: object
      description: >-
        Ecosystem-wide aggregates computed before the view filters. When
        `segment` is supplied they describe that segment only (stablecoins or
        RWAs), since the segment filter is applied before aggregation.
      required:
        - generated_at
        - tier_counts
        - total_mcap
        - total_volume_24h
        - at_peg_count
        - at_peg_total
        - monitored_count
        - stability_index
        - biggest_depegs
        - highest_risk
        - most_stable
      properties:
        generated_at:
          type: string
          nullable: true
        tier_counts:
          type: object
          required:
            - critical
            - warning
            - watch
            - ok
          properties:
            critical:
              type: integer
              minimum: 0
            warning:
              type: integer
              minimum: 0
            watch:
              type: integer
              minimum: 0
            ok:
              type: integer
              minimum: 0
        total_mcap:
          type: number
        total_volume_24h:
          type: number
        at_peg_count:
          type: integer
        at_peg_total:
          type: integer
        monitored_count:
          type: integer
          description: >-
            Pre-filter count of members the depeg monitor has ingested
            (has_monitor_data = true). Use this for an "assets tracked" figure;
            pagination.total is the full DB catalog including pending,
            never-scored members.
        stability_index:
          type: number
        biggest_depegs:
          type: array
          items:
            $ref: '#/components/schemas/RwaDepegSummary'
        highest_risk:
          type: array
          items:
            $ref: '#/components/schemas/RwaRiskSummary'
        most_stable:
          type: array
          items:
            $ref: '#/components/schemas/RwaRiskSummary'
    RwaDenominationSummary:
      type: object
      description: Denomination context for a pegged token (e.g. USD, EUR, XAU).
      nullable: true
      required:
        - code
        - name
        - category
        - pegRatio
        - pegType
      properties:
        code:
          type: string
        name:
          type: string
        category:
          type: string
          description: e.g. fiat, commodity, crypto, index
        pegRatio:
          type: string
        pegType:
          type: string
    RwaRiskTier:
      type: string
      description: >-
        Base risk tier from the depeg pipeline. `premium` is an API-layer
        override added when a token trades above its peg.
      enum:
        - critical
        - warning
        - watch
        - ok
        - premium
    RwaScoreDriver:
      type: object
      description: A single component of the 12-factor depeg risk score decomposition.
      required:
        - name
        - raw
        - normalized
        - weight
        - contribution
      properties:
        name:
          type: string
        raw:
          oneOf:
            - type: number
              nullable: true
            - type: string
              nullable: true
            - type: boolean
              nullable: true
        normalized:
          type: number
          nullable: true
        weight:
          type: number
        contribution:
          type: number
          nullable: true
    RwaTokenType:
      type: string
      description: Pipeline-assigned token sub-classification.
      enum:
        - standard
        - yield
        - rwa
        - gold
        - bridged
        - vault
      nullable: true
    RwaClassification:
      type: string
      description: >-
        RWA category assigned when a token is classified as a NAV-pegged
        real-world asset.
      enum:
        - tbill
        - money_market
        - tokenized_fund
      nullable: true
    RwaMarket:
      type: object
      description: >-
        A single DEX market entry. Webacy surfaces the top-N pools by liquidity
        per token.
      required:
        - dex
        - pair
        - pool_address
        - chain
        - liquidity_usd
        - volume_24h_usd
      properties:
        dex:
          type: string
          description: DEX identifier, e.g. `curve`, `uniswap`.
        pair:
          type: string
          description: Trading pair label, e.g. `DAI/USDT`.
        pool_address:
          type: string
          nullable: true
        chain:
          type: string
          description: Short chain code, e.g. `eth`.
        liquidity_usd:
          type: number
          format: double
        volume_24h_usd:
          type: number
          format: double
    RwaMigration:
      type: object
      description: >-
        Migration lifecycle grouping for a token. `null` at the parent level
        means no migration data is available at all; a non-null object means at
        least one migration field is available, with each leaf independently
        nullable.
      nullable: true
      required:
        - status
        - target_symbol
        - target_address
        - ratio
        - notes
      properties:
        status:
          $ref: '#/components/schemas/RwaMigrationStatus'
        target_symbol:
          type: string
          nullable: true
        target_address:
          type: string
          nullable: true
        ratio:
          type: number
          nullable: true
        notes:
          type: string
          nullable: true
    RwaProjectInfo:
      type: object
      description: >-
        Issuer / audit provenance. All leaf fields are independently nullable
        except `audit_firms` / `audit_report_urls`, which are always-arrays
        (empty = checked, none found).
      nullable: true
      required:
        - issuer
        - audit_count
        - audit_firms
        - auditor_tier
        - last_audit_date
        - audit_report_urls
        - notes
      properties:
        issuer:
          type: string
          nullable: true
        audit_count:
          type: integer
          nullable: true
        audit_firms:
          type: array
          items:
            type: string
        auditor_tier:
          $ref: '#/components/schemas/RwaAuditorTier'
        last_audit_date:
          type: string
          nullable: true
          description: '`YYYY-MM` form.'
        audit_report_urls:
          type: array
          items:
            type: string
        notes:
          type: string
          nullable: true
    RwaLiquidityTier:
      type: string
      description: Liquidity tier based on 60-minute DEX volume thresholds.
      enum:
        - high
        - medium
        - low
        - very_low
      nullable: true
    RwaDepegSummary:
      type: object
      required:
        - symbol
        - chain
        - address
        - price
        - peg_value
        - abs_dev_clean
        - score
        - tier
      properties:
        symbol:
          type: string
        chain:
          type: string
        address:
          type: string
        price:
          type: number
          nullable: true
        peg_value:
          type: number
          nullable: true
        abs_dev_clean:
          type: number
        score:
          type: number
        tier:
          type: string
          enum:
            - critical
            - warning
            - watch
            - ok
    RwaRiskSummary:
      type: object
      required:
        - symbol
        - chain
        - address
        - score
        - tier
        - market_cap_usd
      properties:
        symbol:
          type: string
        chain:
          type: string
        address:
          type: string
        score:
          type: number
        tier:
          type: string
          enum:
            - critical
            - warning
            - watch
            - ok
        market_cap_usd:
          type: number
          nullable: true
    RwaMigrationStatus:
      type: string
      description: >-
        Token migration lifecycle status. `null` = this token has not been
        classified yet.
      enum:
        - active
        - migrating
        - deprecated
      nullable: true
    RwaAuditorTier:
      type: string
      description: >-
        Auditor quality tier, normalised to the canonical API vocabulary. Same
        vocabulary as `/rwa/grades`.
      enum:
        - top
        - mid
        - low
        - basic
      nullable: true
  responses:
    X402PaymentRequired:
      description: >-
        Keyless x402 payment required. Returned for a keyless caller (gateway
        entry `x-webacy-entry: x402`) with no prepaid CU balance or insufficient
        CU on the presented credit token. Identified by the base64
        `PAYMENT-REQUIRED` response header; the body carries the x402 challenge
        (a USDC price on Base and a Stripe-minted deposit address). Pay it, then
        retry with the `PAYMENT-SIGNATURE` header to unlock the resource and
        receive a credit token. An authenticated api-key caller with a
        past_due/unpaid subscription may instead receive a different 402
        (`Subscription payment required`, plain JSON, no `PAYMENT-REQUIRED`
        header).
      headers:
        PAYMENT-REQUIRED:
          description: >-
            Base64-encoded x402 challenge (network, asset, amount, payTo,
            resource.url). The edge rollout supplies the canonical public
            request path through a valid gateway claim; missing or invalid
            claims safely fall back to the public origin plus an internal path
            identifier. resource.url is not yet suitable for publishing to a
            public x402 discovery catalog (Coinbase's Bazaar): route-specific
            declarations and live paid validation are still pending.
          schema:
            type: string
      content:
        application/json:
          example:
            x402Version: 1
            error: payment required
    UnauthorizedError:
      description: Authorization information is missing or invalid
      content:
        application/json:
          example:
            message: Unauthorized
    X402ServiceUnavailable:
      description: >-
        x402 paywall fails CLOSED: if payment configuration is incomplete or
        invalid, the x402 route unexpectedly has no payment requirement, or the
        facilitator, credit store, or settlement is unavailable, a gated keyless
        request returns 503 (`Payment service temporarily unavailable`) rather
        than serving the resource unpaid.
      content:
        application/json:
          example:
            message: Payment service temporarily unavailable
  securitySchemes:
    api_key:
      type: apiKey
      in: header
      name: x-api-key

````

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