LEGIT Trust API

REST API for the LEGIT trust oracle: trust-check one x402 merchant address (score, grade, uptime, latency, explanation), pull a deep report with 30-day history and percentile, batch-check up to 20 addresses, get a best-merchant routing recommendation for a stated need, resolve on-chain merchant identity, read the ranked leaderboard, trending merchants, per-chain network health, receipts and the live network pulse. Five verdict endpoints (compare, arena, history, watch, deep-check) answer HTTP 402 with an x402 v2 PaymentRequired document and are paid per call in USDC (algorand-mainnet $0.004, base-mainnet $0.005); everything else is free with no authentication. 24 operations across 24 paths, published as OpenAPI 3.1.0 at https://legit.gonna.bond/openapi.json; the spec declares no servers[] and the base URL is the host the provider's own llms.txt examples call.

Operations 24

GET /health Liveness probe #
GET /v1/leaderboard Query the ranked merchant leaderboard to shortlist counterparties #
GET /v1/stats Read headline service stats and storage facts #
GET /v1/compare Compare 2-5 addresses side-by-side before picking one to pay #
GET /v1/check/{address} Trust-check a merchant address before paying it #
GET /v1/receipts Receipts #
GET /v1/route Get a routing recommendation between two counterparties #
GET /v1/report/{address} Pull the full trust report of one merchant before integrating #
POST /v1/batch-check Batch-check multiple addresses in one call #
GET /v1/pulse Read the live x402 network pulse #
GET /v1/chain-logos Resolve official chain brand tiles #
GET /v1/networks Check per-chain payment health before routing #
GET /v1/merchant/{address}/identity Resolve a merchant's on-chain identity across chains #
GET /v1/arena Get arena verdicts: the 24h cross-chain settlement benchmark #
GET /v1/arena/preview Preview the settlement arena for free #
GET /.well-known/legit Discover LEGIT's endpoints, pricing and rails #
GET /v1/history Pull 30-day score history of one merchant for trend analysis #
POST /v1/watch Set a webhook-armed 7- or 30-day watch sentinel that fires on grade transitions #
GET /v1/watches/{watch_id} Read watch status free with the bearer watch id #
GET /v1/watches/{watch_id}/events Read the watch event feed, the source of truth #
POST /v1/deep-check Run deep-check due diligence on up to 10 addresses #
GET /v1/referee/reproduce.py Referee Reproduce Script #
GET /v1/referee Referee Report #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/legit-trust-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

gonna-bond-legit-openapi.yml Raw ↑
# Faithful YAML serialization of https://legit.gonna.bond/openapi.json as fetched 2026-09-19 (HTTP 200, application/json, 59,922 bytes).
# Content is unchanged from the provider's document; the verbatim JSON is at openapi/_original/gonna-bond-legit-openapi-original.json.
# The provider publishes no servers[] block; the base URL https://legit.gonna.bond is recorded in apis.yml from the provider's own llms.txt examples.
openapi: 3.1.0
info:
  title: LEGIT
  description: 'Trust-check any x402 merchant or agent address on Algorand, Base, Solana, or 17 other chains before routing a payment. Returns a real-time grade (A+ to F) and score (0-100) built from live uptime, response latency, and payment coherence measurements, not self-reported data. Run as a pre-payment trust check: call GET /v1/check/{address} before any x402 payment to an address you have not paid before. Free: check a single address, pull a full trust report, batch-check multiple addresses, get a routing recommendation between two counterparties, resolve a merchant''s on-chain identity, query the ranked merchant leaderboard, see trending active merchants, and read live network pulse. Paid ($0.004 Algorand / $0.005 Base, via x402): compare two addresses side-by-side, get arena verdicts, pull 30-day score history for trend analysis, set a webhook-armed watch sentinel (7-day diagnostic tier or 30-day standard, same rail price) that fires on grade transitions, and run deep-check due
    diligence. Use before sending an x402 payment to an unknown merchant, before accepting a counterparty in agent-to-agent settlement, or to monitor a critical upstream service for trust degradation. Created by GONNA.'
  version: 0.1.0
  contact:
    name: GONNA
    url: https://gonna.bond/gonnaverse/
    email: legit@gonna.bond
  x-logo:
    url: https://legit.gonna.bond/favicon.png
  x-guidance: 'LEGIT is the trust and routing layer for the x402 agentic economy. Trust-check any x402 merchant address on Algorand, Base, Solana or 17 other chains before routing a payment: grades (A+ to F) and scores (0-100) come from live uptime, latency and payment-coherence probes, never self-reported data. Run as a pre-payment trust check: call GET /v1/check/{address} before any x402 payment to an address you have not paid before. Start FREE: GET /v1/check/{address} (full trust report), /v1/leaderboard (ranked shortlist), /v1/trending, /v1/pulse, /v1/arena/preview. Paid per call in USDC over x402: GET /v1/compare (2-5 merchants head-to-head), /v1/arena (24h cross-chain settlement benchmark, ?network= filter), /v1/history?address=... (30-day trust trend), POST /v1/watch (7- or 30-day change sentinel, webhook-armed), POST /v1/deep-check (due diligence, up to 10 addresses). How to pay: call a paid endpoint without paying and it answers 402 with a PaymentRequired document listing every
    active rail; pay one rail and retry with the PAYMENT-SIGNATURE header. Rails cheapest first: algorand-mainnet $0.004, base-mainnet and solana-mainnet $0.005 per call. Watch companions GET /v1/watches/{watch_id} and /v1/watches/{watch_id}/events are FREE: the watch id is the bearer capability for status and the event feed. Webhook payload anatomy: /docs; agent manifest: /llms.txt. Use LEGIT before sending an x402 payment to an unknown merchant, before accepting a counterparty in agent-to-agent settlement, or to monitor a critical upstream for trust degradation.'
paths:
  /health:
    get:
      summary: Liveness probe
      description: 'Liveness probe: ``{"status": "ok"}`` when the service is up (FREE).'
      operationId: health_health_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: object
                title: Response Health Health Get
      security: []
  /v1/leaderboard:
    get:
      summary: Query the ranked merchant leaderboard to shortlist counterparties
      description: 'Leaderboard with optional ?network= filter (SPEC_V2, Module A).


        ``networks`` always lists the distinct networks present BEFORE filtering

        so clients can build filter chips; backwards compatible with Wave 1.


        Wave 16 (Instant Speed): cacheable for 30s. ``view=trimmed`` is the

        dashboard''s diet variant: null optional fields are omitted entirely

        (the dashboard treats absent and null identically), which removes

        hundreds of ``"field":null`` pairs from a large board. The default

        view is byte-for-byte the public contract it always was.


        Wave 18 (The Instant Doctrine): opt-in server pagination via

        ``page``/``size`` (25/50/100) plus a ``q`` name/address substring

        filter, sliced AFTER the existing filter+sort+rank logic so ranks

        stay global; the paged payload also carries ``counts`` (cheap

        per-network tallies for the dashboard chips). A 30s in-process TTL

        cache (keyed by the full query string) fronts every variant; the

        rate limiter still sees every request.


        Wave 40 (La Voce): testnet networks and dormant merchants (no

        measurement inside LEGIT_ACTIVE_WINDOW_DAYS, default 7 days) are out

        of the default view; ``?include_testnet=true`` and

        ``?include_dormant=true`` restore them, dormant entries flagged

        ``dormant: true``.


        Wave 41 (La Bellezza, W0): ``rank`` is the consecutive position in

        the returned view (post testnet/dormant policy): 1,2,3 with no

        holes. The additive ``rank_global`` preserves the absolute

        pre-filter rank; with both opt-ins active, rank == rank_global.'
      operationId: leaderboard_v1_leaderboard_get
      parameters:
      - name: network
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            minLength: 1
            maxLength: 32
            pattern: ^[a-z0-9-]+$
          - type: 'null'
          description: Optional exact-match network filter (e.g. base-mainnet)
          title: Network
        description: Optional exact-match network filter (e.g. base-mainnet)
      - name: view
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            pattern: ^(full|trimmed)$
          - type: 'null'
          description: 'Optional payload diet. ''trimmed'' omits null-valued optional fields (additive contract: absent instead of null); the default keeps the full Wave 1 shape.'
          title: View
        description: 'Optional payload diet. ''trimmed'' omits null-valued optional fields (additive contract: absent instead of null); the default keeps the full Wave 1 shape.'
      - name: page
        in: query
        required: false
        schema:
          anyOf:
          - type: integer
            minimum: 1
          - type: 'null'
          description: 'Wave 18: optional 1-based server page. When page and/or size are given the response becomes the paged shape {generated_at, total, page, size, entries} sliced AFTER the global rank/filter logic, so ranks stay global.'
          title: Page
        description: 'Wave 18: optional 1-based server page. When page and/or size are given the response becomes the paged shape {generated_at, total, page, size, entries} sliced AFTER the global rank/filter logic, so ranks stay global.'
      - name: size
        in: query
        required: false
        schema:
          anyOf:
          - type: integer
          - type: 'null'
          description: 'Wave 18: page size, one of 25, 50, 100 (default 50 when paging).'
          title: Size
        description: 'Wave 18: page size, one of 25, 50, 100 (default 50 when paging).'
      - name: q
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            minLength: 1
            maxLength: 100
          - type: 'null'
          description: 'Wave 18: optional name/address substring filter.'
          title: Q
        description: 'Wave 18: optional name/address substring filter.'
      - name: include_testnet
        in: query
        required: false
        schema:
          type: boolean
          description: 'Wave 40: testnet/devnet/amoy/sepolia networks are excluded by default; pass ?include_testnet=true to restore them (same entry shape).'
          default: false
          title: Include Testnet
        description: 'Wave 40: testnet/devnet/amoy/sepolia networks are excluded by default; pass ?include_testnet=true to restore them (same entry shape).'
      - name: include_dormant
        in: query
        required: false
        schema:
          type: boolean
          description: 'Wave 40: the default view shows only merchants with a measurement inside the active window (LEGIT_ACTIVE_WINDOW_DAYS, default 7 days); pass ?include_dormant=true for the full view, with dormant entries flagged dormant=true.'
          default: false
          title: Include Dormant
        description: 'Wave 40: the default view shows only merchants with a measurement inside the active window (LEGIT_ACTIVE_WINDOW_DAYS, default 7 days); pass ?include_dormant=true for the full view, with dormant entries flagged dormant=true.'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Leaderboard'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
  /v1/stats:
    get:
      summary: Read headline service stats and storage facts
      description: 'Headline service stats: merchant and measurement counts, average

        trust score and verifiable storage facts (FREE, cached 30s).'
      operationId: stats_v1_stats_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stats'
      security: []
  /v1/compare:
    get:
      summary: Compare 2-5 addresses side-by-side before picking one to pay
      description: 'Compare 2-5 merchant addresses head-to-head (FREE, rate limited).


        Returns a TrustReport-like summary per address plus ``winner`` (best

        trust score; Wave 7 ties broken by more real payments settled, then

        lower median latency, then higher sample size) and a plain-English

        ``rationale``. Untracked addresses are included with ``score=null``

        and ``tracked=false``; they cannot win.


        Wave 41c (Il Cliente Cieco): ``addresses`` is optional. A blind

        client (one that paid and calls with no parameters) gets the top

        merchants of the current default ranking compared, with the additive

        ``defaults_applied`` field disclosing the choice; when the ranking

        holds too few real merchants no sensible default exists and the

        parameter stays honestly required (self-documenting 422). Paid: $0.004 on Algorand / $0.005 on Base, via x402 (per call in USDC on algorand-mainnet or base-mainnet; the 402 response lists every active rail). The POST /v1/watch 7-day diagnostic tier pays the same per-call rail price as the 30-day watch.'
      operationId: compare_v1_compare_get
      parameters:
      - name: addresses
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            minLength: 1
            maxLength: 2000
          - type: 'null'
          description: 'Comma-separated merchant addresses (2-5). Optional: when omitted, the top merchants of the current default ranking are compared and the choice is disclosed in defaults_applied.'
          title: Addresses
        description: 'Comma-separated merchant addresses (2-5). Optional: when omitted, the top merchants of the current default ranking are compared and the choice is disclosed in defaults_applied.'
        examples:
          two_addresses:
            summary: Compare two Algorand merchant addresses
            value: G7V7U7H6IYRP7BIZO2KV6ODGQPESMMRDCWBYT3GIMNHTNK3VCKWSSKD55A,ZQFL2SVFDQDKFAUCCE2WVXH6EF3LRUUJZLKJMDIED56LODOKW23JSKB7NT
          three_addresses:
            summary: Compare three Algorand merchant addresses
            value: G7V7U7H6IYRP7BIZO2KV6ODGQPESMMRDCWBYT3GIMNHTNK3VCKWSSKD55A,ZQFL2SVFDQDKFAUCCE2WVXH6EF3LRUUJZLKJMDIED56LODOKW23JSKB7NT,TARTD3TCZERKBTXQQEQED76TGSCBU6SL2QE3Z5K74GKTRCIHFMSIDAOLJP
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompareResponse'
              example:
                generated_at: '2026-01-01T00:00:00+00:00'
                entries:
                - address: ADDRESS_A
                  name: Merchant A
                  score: 82.5
                  grade: B
                  provisional: false
                  uptime_pct: 99.5
                  latency_p50_ms: 210.0
                  sample_size: 12
                  settle_count: 340
                  network: algorand-mainnet
                  explorer_url: https://allo.info/account/ADDRESS_A
                  tracked: true
                - address: ADDRESS_B
                  name: null
                  score: null
                  grade: null
                  provisional: false
                  uptime_pct: null
                  latency_p50_ms: null
                  sample_size: 0
                  settle_count: 0
                  network: null
                  explorer_url: null
                  tracked: false
                winner: ADDRESS_A
                rationale: 'Merchant A wins: highest trust score (82.5 vs 71.0).'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '402':
          description: 'Payment required: the body is an x402 PaymentRequired document (x402Version, error, resource, accepts) listing the USDC payment offers for every active rail; retry with a payment payload.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  x402Version:
                    type: integer
                  error:
                    type: string
                  resource:
                    type: object
                  accepts:
                    type: array
                    items:
                      type: object
      x-payment-info:
        price:
          mode: fixed
          currency: USD
          amount: '0.004'
        protocols:
        - x402: {}
  /v1/check/{address}:
    get:
      summary: Trust-check a merchant address before paying it
      description: Full trust report for one merchant (Algorand address or base URL).
      operationId: check_v1_check__address__get
      parameters:
      - name: address
        in: path
        required: true
        schema:
          type: string
          title: Address
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TrustReport'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
  /v1/receipts:
    get:
      summary: Receipts
      description: 'Verified on-chain payment receipts for one tracked merchant.


        The 30-day ledger of real settlements observed by LEGIT''s own keyless

        chain scan (Algorand first): who paid, how much, when, with the

        on-chain transaction id as independently verifiable evidence.

        ``receipts`` is newest-first and capped at 100 entries while

        ``total_receipts`` and ``volume_usd`` cover the full window. An empty

        window is an honest empty answer (total_receipts 0, receipts []),

        never invented rows; untracked addresses get an honest 404.


        Wave 47b: the address is a mandatory query parameter (the /v1/history

        convention), so the registered path is exactly "/v1/receipts" and an

        operator-declared X402_PREMIUM_PATHS entry matches it byte-for-byte.

        This endpoint is FREE by construction: it ships outside

        X402_PREMIUM_PATHS and stays free until the operator adds the path to

        that env var (per-path payment via the app.payments middleware, which

        this wave does not touch).'
      operationId: receipts_v1_receipts_get
      parameters:
      - name: address
        in: query
        required: true
        schema:
          type: string
          minLength: 1
          maxLength: 300
          description: Merchant address (or base URL) exactly as tracked by LEGIT, e.g. ?address=ADDR.
          title: Address
        description: Merchant address (or base URL) exactly as tracked by LEGIT, e.g. ?address=ADDR.
        examples:
          algorand_address:
            summary: 30-day receipts of one Algorand merchant
            value: G7V7U7H6IYRP7BIZO2KV6ODGQPESMMRDCWBYT3GIMNHTNK3VCKWSSKD55A
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReceiptsResponse'
        '404':
          description: 'The address is not tracked by LEGIT: an honest 404, never an invented ledger.'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
  /v1/route:
    get:
      summary: Get a routing recommendation between two counterparties
      description: 'Phase 0 routing: keyword match on merchant name/address, best score wins.'
      operationId: route_v1_route_get
      parameters:
      - name: need
        in: query
        required: true
        schema:
          type: string
          minLength: 1
          maxLength: 200
          title: Need
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RouteResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
  /v1/report/{address}:
    get:
      summary: Pull the full trust report of one merchant before integrating
      description: 'Deep report: full breakdown, 30-row score history, rank and percentile.


        FREE (rate limited). Unknown addresses get an honest unrated report.

        The fabricated demo report requires the explicit ``?demo=true`` opt-in.'
      operationId: report_v1_report__address__get
      parameters:
      - name: address
        in: path
        required: true
        schema:
          type: string
          title: Address
      - name: demo
        in: query
        required: false
        schema:
          type: boolean
          description: 'Opt-in demo mode: for the five hardcoded demo addresses, return the fabricated illustration report flagged demo=true. Off by default: fabricated data is never served unmarked.'
          default: false
          title: Demo
        description: 'Opt-in demo mode: for the five hardcoded demo addresses, return the fabricated illustration report flagged demo=true. Off by default: fabricated data is never served unmarked.'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeepReport'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
  /v1/batch-check:
    post:
      summary: Batch-check multiple addresses in one call
      description: 'Trust-report-lite for 1..20 validated addresses in one call.


        FREE (rate limited). Fabricated demo entries require the explicit

        ``?demo=true`` opt-in; when any are included the response is flagged

        ``demo: true`` at the top level and per entry.'
      operationId: batch_check_v1_batch_check_post
      parameters:
      - name: demo
        in: query
        required: false
        schema:
          type: boolean
          description: 'Opt-in demo mode: demo addresses resolve to the fabricated illustration entries flagged demo=true. Off by default.'
          default: false
          title: Demo
        description: 'Opt-in demo mode: demo addresses resolve to the fabricated illustration entries flagged demo=true. Off by default.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                addresses:
                  type: array
                  items:
                    type: string
                    maxLength: 300
                  minItems: 1
                  maxItems: 20
                  description: 1 to 20 merchant addresses or base URLs, each validated like /v1/check. Untracked addresses get an honest unrated report, never an invented score.
                  example:
                  - G7V7U7H6IYRP7BIZO2KV6ODGQPESMMRDCWBYT3GIMNHTNK3VCKWSSKD55A
              required:
              - addresses
            example:
              addresses:
              - G7V7U7H6IYRP7BIZO2KV6ODGQPESMMRDCWBYT3GIMNHTNK3VCKWSSKD55A
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchReport'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
  /v1/trending:
    get:
      summary: See trending active merchants
      description: 'FREE. Top 5 by 24h score delta; falls back to top 5 by score.


        Wave 8.9 (the honesty gate): the demo-merchant fallback renders ONLY

        while the DB holds zero real merchants. When real merchants exist but

        no score signal has landed yet (cold start after a redeploy), the strip

        gets an honest empty list and the dashboard says it is gathering 24h

        signals, instead of inventing names.


        Wave 18 (The Instant Doctrine): served from the cycle-computed

        snapshot; on a cold boot it computes ONCE, stores and serves. The

        path and shape are identical to what they always were.


        Wave 40 (La Voce): testnet networks and dormant merchants are out of

        the default strip; ?include_testnet=true and ?include_dormant=true

        restore them, dormant entries flagged ``dormant: true``. The opt-in

        variants are computed fresh per request (bounded grouped queries,

        rate limited); the snapshot serves the default view.'
      operationId: trending_v1_trending_get
      parameters:
      - name: include_testnet
        in: query
        required: false
        schema:
          type: boolean
          description: 'Wave 40: testnet/devnet/amoy/sepolia networks are excluded by default; pass ?include_testnet=true to restore them (same entry shape).'
          default: false
          title: Include Testnet
        description: 'Wave 40: testnet/devnet/amoy/sepolia networks are excluded by default; pass ?include_testnet=true to restore them (same entry shape).'
      - name: include_dormant
        in: query
        required: false
        schema:
          type: boolean
          description: 'Wave 40: the default strip shows only merchants with a measurement inside the active window (LEGIT_ACTIVE_WINDOW_DAYS, default 7 days); pass ?include_dormant=true for the full field, dormant entries flagged dormant=true.'
          default: false
          title: Include Dormant
        description: 'Wave 40: the default strip shows only merchants with a measurement inside the active window (LEGIT_ACTIVE_WINDOW_DAYS, default 7 days); pass ?include_dormant=true for the full field, dormant entries flagged dormant=true.'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Trending'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
  /v1/pulse:
    get:
      summary: Read the live x402 network pulse
      description: 'Real network pulse: the facilitator''s masked live transaction stream,

        merged with recent on-chain USDC payments from the Wave 8.5 ledger.


        Wave 18 (The Instant Doctrine): served from the cycle-computed

        snapshot (refreshed every indexer cycle), so a page load never waits

        on the facilitator round-trip. Cold boot computes ONCE, stores and

        serves. Graceful empty list when the facilitator is unreachable.

        Each transaction carries ``tx_url`` (Wave 3.2): an explorer link when

        the stream exposes a real on-chain hash, else None. On-chain rows are

        honestly labeled ``event="onchain_payment"`` and never presented as

        facilitator settles.'
      operationId: pulse_v1_pulse_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: object
                title: Response Pulse V1 Pulse Get
      security: []
  /v1/chain-logos:
    get:
      summary: Resolve official chain brand tiles
      description: 'Wave 14 (The Chain Heraldry): network slug -> official tile URL.


        Static payload (the mapping only changes with a deploy), cacheable for

        10 minutes. Unmapped chains (skale-base-mainnet, aws-base, unknown

        slugs) are simply absent: clients keep their monogram/glyph fallback.'
      operationId: chain_logos_v1_chain_logos_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: object
                title: Response Chain Logos V1 Chain Logos Get
      security: []
  /v1/networks:
    get:
      summary: Check per-chain payment health before routing
      description: 'Per-chain payment network health from the facilitator, plus honest

        coverage counts from our own DB.


        Cached 60s. Graceful empty ``networks`` list when the facilitator is

        unreachable. Wave 8.6: ``settlement_rails`` counts the facilitator

        rails (the 6 gasless chains) while ``chains_indexed``/``indexed_chains``

        report how many chains the oracle actually indexes merchants on, so the

        two scopes are never conflated.'
      operationId: networks_v1_networks_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: object
                title: Response Networks V1 Networks Get
      security: []
  /v1/merchant/{address}/identity:
    get:
      summary: Resolve a merchant's on-chain identity across chains
      description: 'Cross-chain identity for a merchant, from our DB.


        Graceful 404-shape: ``{"found": false}`` (HTTP 200) when the address is

        unknown. Categories are best-effort filled from the facilitator''s live

        identity record ([] when unavailable).'
      operationId: merchant_identity_v1_merchant__address__identity_get
      parameters:
      - name: address
        in: path
        required: true
        schema:
          type: string
          title: Address
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: object
                title: Response Merchant Identity V1 Merchant  Address  Identity Get
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
  /v1/arena:
    get:
      summary: 'Get arena verdicts: the 24h cross-chain settlement benchmark'
      description: 'Wave 6 (The Arena): the public cross-chain x402 settlement benchmark.


        Ranks every chain with any signal (pulse transactions in the last 24h,

        tracked merchants, or facilitator network health) by real settle count

        (Wave 8.9: micropayments are a count economy; volume only breaks ties).

        Cached 60s. Honest by construction: with zero pulse data in the

        window the narrative says the arena is still gathering its first data

        and no leader is named. Wave 39 (Il Biglietto da Visita): the optional

        ?network= slug narrows the benchmark to one chain (cached separately

        per slug); an unknown slug is an honest 400 listing the valid slugs. Paid: $0.004 on Algorand / $0.005 on Base, via x402 (per call in USDC on algorand-mainnet or base-mainnet; the 402 response lists every active rail). The POST /v1/watch 7-day diagnostic tier pays the same per-call rail price as the 30-day watch.'
      operationId: arena_v1_arena_get
      parameters:
      - name: network
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            maxLength: 64
          - type: 'null'
          description: 'Optional chain slug filter, e.g. ?network=base-mainnet: the benchmark is narrowed to that one network. Omit it for the full cross-chain arena. An unknown slug is an honest 400 listing the slugs currently benchmarked.'
          title: Network
        description: 'Optional chain slug filter, e.g. ?network=base-mainnet: the benchmark is narrowed to that one network. Omit it for the full cross-chain arena. An unknown slug is an honest 400 listing the slugs currently benchmarked.'
        examples:
          single_network:
            summary: Benchmark one chain (Base)
            value: base-mainnet
          algorand_only:
            summary: Benchmark Algorand only
            value: algorand-mainnet
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: object
                title: Response Arena V1 Arena Get
              example:
                generated_at: '2026-01-01T00:00:00+00:00'
                window_hours: 24
                chains:
                - network: base-mainnet
                  network_name: Base
                  chain_family: evm
                  tx_count_24h: 150
                  settles_24h: 120
                  settles_facilitator_24h: 118
                  settles_onchain_24h: 2
                  large_inflows_24h: 0
                  verifies_24h: 30
                  volume_usdc_24h: 61.25
                  avg_ticket_usdc_24h: 0.51
                  merchants_tracked: 8
                  avg_trust_score: 76.4
                  latency_p50_ms: 240.0
                  avg_settlement_time: 2s
                  rank: 1
                large_inflows_24h: 0
                leader: base-mainnet
                narrative: 'Base leads x402 settlement: 120 settles totaling 61.25 USDC in 24h.'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '402':
          description: 'Payment required: the body is an x402 PaymentRequired document (x402Version, error, resource, accepts) listing the USDC payment offers for every active rail; retry with a payment payload.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  x402Version:
                    type: integer
                  error:
                    type: string
                

# --- truncated at 32 KB (74 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/gonna-bond/refs/heads/main/openapi/gonna-bond-legit-openapi.yml