OnTopX402 API

Read the leaderboard, read a single entry, and bid for rank. GET /api/leaderboard returns the board unauthenticated; POST /api/bid returns an x402 payment challenge rather than requiring an account.

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/ontopx402-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 email required.

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

OpenAPI Specification

ontopx402-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: OnTopX402
  description: A single public leaderboard where rank is decided by the amount paid. Submit a link, a
    description and an amount; you appear at whatever position that amount buys. Bids on the same link
    add up. Paid in USDC over x402 — no account, no API key.
  version: 1.0.0
  contact:
    name: OnTopX402
    url: https://ontopx402.com
    email: info@ontopx402.com
  x-openapi-url: https://ontopx402.com/openapi.json
  x-provider: OnTopX402 — a leaderboard where rank is the amount paid. By One Scales Inc..
  x-provider-url: https://ontopx402.com
  x-guidance: 'A public leaderboard ordered by the amount paid. To be listed, POST /api/bid with a url,
    a description of at most 255 characters, and the amount you want to bid in US dollars. The amount
    you name IS the price you pay: the endpoint answers 402 with x402 payment requirements for exactly
    that amount. Pay them and send the request again with the X-PAYMENT header. Bidding again on a url
    already listed adds to its total rather than replacing it. Reading the board is free: GET /api/leaderboard
    and GET /api/entry need no payment.'
  x-ai-instructions: 'A public leaderboard ordered by the amount paid. To be listed, POST /api/bid with
    a url, a description of at most 255 characters, and the amount you want to bid in US dollars. The
    amount you name IS the price you pay: the endpoint answers 402 with x402 payment requirements for
    exactly that amount. Pay them and send the request again with the X-PAYMENT header. Bidding again
    on a url already listed adds to its total rather than replacing it. Reading the board is free: GET
    /api/leaderboard and GET /api/entry need no payment.'
  x-keywords:
  - leaderboard
  - ranking
  - directory
  - listing
  - submit
  - advertising
  - paid-placement
  - sponsored
  - promotion
  - marketing
  - bidding
  - auction
  - outbid
  - pay-per-rank
  - link-listing
  - backlink
  - seo
  - x402
  - usdc
  - base
  - solana
  - agent-payments
  - agent-discovery
  - micropayments
  x-category: advertising
  x-agentcash-auth:
    mode: paid
  x-pricing:
    model: caller-priced
    currency: USDC
    network: Base and Solana
    minimum: $1
    minimum_atomic: '1000000'
    maximum: $1,000,000
    maximum_atomic: '1000000000000'
    decimals: 6
    example: Sending amount=25.00 produces a 402 quoting 25000000 atomic USDC.
    note: The caller sets the price. The amount you bid is the amount you pay, and it decides your rank.
  x-402:
    resource: https://ontopx402.com/api/bid
    price: caller-specified
    minimum: $1
    minimum_atomic: '1000000'
    maximum_atomic: '1000000000000'
    decimals: 6
    currency: USDC
    example_request:
      url: https://example.com
      description: What this link is.
      amount: '25.00'
    example_response:
      ok: true
      paid_usd: '25.00'
      transaction: '0x9f2c1b7a4e6d8035c1a2f7b93d5e04c6a8b1d2e3f4056789abcdef0123456789'
      network: eip155:8453
      simulated: false
      rank: 1
      url: https://example.com
      name: example.com
      description: What this link is.
      amount_usd: '25.00'
      amount_atomic: 25000000
      bids: 3
      favicon: https://www.google.com/s2/favicons?domain=example.com&sz=64
      first_bid_at: '2026-08-19T14:02:11+00:00'
      updated_at: '2026-08-21T09:35:47+00:00'
      page: https://ontopx402.com/e/example-com
    network: eip155:8453
    asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
    pay_to: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
    facilitator: https://api.cdp.coinbase.com/platform/v2/x402
    scheme: exact
    description: Bid for a rank. The price of the call is the bid.
    mime_type: application/json
    networks:
    - network: eip155:8453
      asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
      asset_symbol: USDC
      pay_to: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
    - network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
      asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
      asset_symbol: USDC
      pay_to: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b
  x-logo:
    url: https://ontopx402.com/static/favicon.svg
    altText: OnTopX402
paths:
  /api/leaderboard:
    get:
      summary: Read the leaderboard
      description: The current ranking, highest total paid first. Free, no payment needed.
      operationId: api_leaderboard_api_leaderboard_get
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 500
          minimum: 1
          default: 50
          title: Limit
      - name: offset
        in: query
        required: false
        schema:
          type: integer
          minimum: 0
          default: 0
          title: Offset
      responses:
        '200':
          description: The board, highest total paid first.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Leaderboard'
              example:
                count: 2
                total_paid_usd: '37.00'
                top_amount_usd: '25.00'
                to_take_first_usd: '26.00'
                entries:
                - rank: 1
                  url: https://example.com
                  name: example.com
                  description: What this link is.
                  amount_usd: '25.00'
                  amount_atomic: 25000000
                  bids: 3
                  favicon: https://www.google.com/s2/favicons?domain=example.com&sz=64
                  first_bid_at: '2026-08-19T14:02:11+00:00'
                  updated_at: '2026-08-21T09:35:47+00:00'
                  page: https://ontopx402.com/e/example-com
                - rank: 2
                  url: https://another.example
                  name: another.example
                  description: A different link.
                  amount_usd: '12.00'
                  amount_atomic: 12000000
                  bids: 1
                  favicon: https://www.google.com/s2/favicons?domain=another.example&sz=64
                  first_bid_at: '2026-08-19T14:02:11+00:00'
                  updated_at: '2026-08-21T09:35:47+00:00'
                  page: https://ontopx402.com/e/another-example
        '429':
          description: Too many free reads from one address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Too many requests. Slow down.
      tags:
      - leaderboard
      x-payment-info:
        price:
          free: {}
        protocols: []
  /api/entry:
    get:
      summary: Look up one entry
      description: Where a given link currently sits, and what it would cost to pass the one above.
      operationId: api_entry_api_entry_get
      parameters:
      - name: url
        in: query
        required: true
        schema:
          type: string
          title: Url
      responses:
        '200':
          description: This link is listed. Includes what it would cost to pass the entry directly above
            it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntryLookup'
              example:
                rank: 2
                url: https://example.com
                name: example.com
                description: What this link is.
                amount_usd: '12.00'
                amount_atomic: 12000000
                bids: 3
                favicon: https://www.google.com/s2/favicons?domain=example.com&sz=64
                first_bid_at: '2026-08-19T14:02:11+00:00'
                updated_at: '2026-08-21T09:35:47+00:00'
                page: https://ontopx402.com/e/example-com
                listed: true
                to_pass_the_one_above_usd: '14.00'
        '400':
          description: The url could not be read.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: That does not look like a web address.
        '404':
          description: This link is not on the board yet. The reply still tells you what first place currently
            costs.
          content:
            application/json:
              schema:
                type: object
              example:
                listed: false
                url: https://nobody-has-bid-on-this.example
                to_take_first_usd: '26.00'
        '429':
          description: Too many free reads from one address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Too many requests. Slow down.
      tags:
      - leaderboard
      x-payment-info:
        price:
          free: {}
        protocols: []
  /api/bid:
    post:
      summary: Bid for a rank
      description: 'Pay to appear on the board, or to climb it.


        The amount you name is the amount you pay. Bidding again on the same link

        adds to your total — it does not replace it. Money spent is spent: being

        outbid later does not refund anything.


        The bid can be sent as a JSON body **or** as query parameters. The query

        form exists because most agent payment tools take nothing but a URL —

        `awal x402 pay <url>`, `pay curl <url>` — and cannot attach a body.

        Putting the whole bid in the URL keeps this endpoint usable by all of them.'
      operationId: api_bid_api_bid_post
      parameters:
      - name: url
        in: query
        required: false
        schema:
          type: string
          description: The link to rank. Use this instead of a body.
          default: ''
          title: Url
        description: The link to rank. Use this instead of a body.
      - name: description
        in: query
        required: false
        schema:
          type: string
          description: Up to 255 characters, shown on the board.
          default: ''
          title: Description
        description: Up to 255 characters, shown on the board.
      - name: amount
        in: query
        required: false
        schema:
          type: string
          description: How much to bid, in US dollars.
          default: ''
          title: Amount
        description: How much to bid, in US dollars.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BidRequest'
            example:
              url: https://example.com
              description: What this link is.
              amount: '25.00'
        description: The bid. May also be sent as query parameters instead, for payment tools that can
          only fetch a URL.
      responses:
        '200':
          description: Paid and listed. The board already reflects this bid.
          headers:
            X-PAYMENT-RESPONSE:
              description: Base64 x402 settlement receipt, including the transaction hash.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BidSuccess'
              examples:
                settled:
                  summary: A bid that settled
                  value:
                    ok: true
                    paid_usd: '25.00'
                    transaction: '0x9f2c1b7a4e6d8035c1a2f7b93d5e04c6a8b1d2e3f4056789abcdef0123456789'
                    network: eip155:8453
                    simulated: false
                    rank: 1
                    url: https://example.com
                    name: example.com
                    description: What this link is.
                    amount_usd: '25.00'
                    amount_atomic: 25000000
                    bids: 3
                    favicon: https://www.google.com/s2/favicons?domain=example.com&sz=64
                    first_bid_at: '2026-08-19T14:02:11+00:00'
                    updated_at: '2026-08-21T09:35:47+00:00'
                    page: https://ontopx402.com/e/example-com
                already_credited:
                  summary: The same payment sent twice
                  description: A replayed transaction is never credited a second time. The current entry
                    is returned unchanged, and nothing further is charged.
                  value:
                    already_credited: true
                    rank: 1
                    url: https://example.com
                    name: example.com
                    description: What this link is.
                    amount_usd: '25.00'
                    amount_atomic: 25000000
                    bids: 3
                    favicon: https://www.google.com/s2/favicons?domain=example.com&sz=64
                    first_bid_at: '2026-08-19T14:02:11+00:00'
                    updated_at: '2026-08-21T09:35:47+00:00'
                    page: https://ontopx402.com/e/example-com
        '400':
          description: The url, description or amount is unusable. Nothing was charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                below_minimum:
                  value:
                    error: The minimum bid is $1.00.
                bad_url:
                  value:
                    error: That does not look like a web address.
                no_description:
                  value:
                    error: Write a short description.
        '429':
          description: Too many requests from one address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Too many requests. Slow down.
        '402':
          description: Payment required. The body is an x402 v2 payment-required object whose `accepts`
            entries are priced at exactly the amount you asked to bid, on Base and Solana. Pay one of
            them and send the request again with the X-PAYMENT header. Nothing is charged and no row is
            written until the payment settles.
          headers:
            PAYMENT-REQUIRED:
              description: The same payment-required object, base64-encoded. Sent on every 402 so a client
                that reads only headers still sees it.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentRequired'
              examples:
                priced_at_your_bid:
                  summary: Quoted for a $25.00 bid
                  value:
                    x402Version: 2
                    error: Payment required
                    resource:
                      url: https://ontopx402.com/api/bid
                      description: Rank on ontopx402.com for example.com
                      mimeType: application/json
                      serviceName: OnTopX402
                    accepts:
                    - scheme: exact
                      network: eip155:8453
                      asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
                      amount: '25000000'
                      payTo: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
                      maxTimeoutSeconds: 300
                    - scheme: exact
                      network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
                      asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                      amount: '25000000'
                      payTo: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b
                      maxTimeoutSeconds: 300
                settlement_failed:
                  summary: A payment that did not settle
                  description: Nothing was charged and no row was written.
                  value:
                    error: The payment did not go through. Nothing was charged.
                    reason: settle_failed
      x-guidance: 'A public leaderboard ordered by the amount paid. To be listed, POST /api/bid with a
        url, a description of at most 255 characters, and the amount you want to bid in US dollars. The
        amount you name IS the price you pay: the endpoint answers 402 with x402 payment requirements
        for exactly that amount. Pay them and send the request again with the X-PAYMENT header. Bidding
        again on a url already listed adds to its total rather than replacing it. Reading the board is
        free: GET /api/leaderboard and GET /api/entry need no payment.'
      x-ai-instructions: 'A public leaderboard ordered by the amount paid. To be listed, POST /api/bid
        with a url, a description of at most 255 characters, and the amount you want to bid in US dollars.
        The amount you name IS the price you pay: the endpoint answers 402 with x402 payment requirements
        for exactly that amount. Pay them and send the request again with the X-PAYMENT header. Bidding
        again on a url already listed adds to its total rather than replacing it. Reading the board is
        free: GET /api/leaderboard and GET /api/entry need no payment.'
      x-payment-info:
        price:
          dynamic:
            mode: caller-specified
            currency: USD
            minimum: '1'
            field: amount
        protocols:
        - x402: {}
      tags:
      - bidding
components:
  schemas:
    BidRequest:
      properties:
        url:
          type: string
          title: Url
          description: The link you want ranked.
          examples:
          - https://example.com
        description:
          type: string
          title: Description
          description: Up to 255 characters, shown on the board.
          examples:
          - The thing we make.
        amount:
          type: string
          title: Amount
          description: How much to bid, in US dollars. Minimum $1.
          examples:
          - '25.00'
          pattern: ^\$?\d+(\.\d{1,6})?$
      type: object
      title: BidRequest
      description: 'A bid: which link to rank, what to say about it, and how much to pay. All three are
        required. The amount you name is the amount you pay and the amount that decides your rank.'
      required:
      - url
      - description
      - amount
      example:
        url: https://example.com
        description: What this link is.
        amount: '25.00'
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    Entry:
      type: object
      title: Entry
      description: One listing on the board.
      properties:
        rank:
          type: integer
          minimum: 1
          description: Position on the board. 1 is the top. Computed on read from the total paid, never
            stored.
        url:
          type: string
          format: uri
          description: The listed link, normalised.
        name:
          type: string
          description: Display name, derived from the host.
        description:
          type: string
          maxLength: 255
          description: What the latest bid said this link is.
        amount_usd:
          type: string
          pattern: ^\d+\.\d{2}$
          description: Lifetime total paid on this link, in US dollars. A string, not a float — money
            is never a float here.
        amount_atomic:
          type: integer
          description: The same total in atomic USDC units (6 decimals). Use this one for arithmetic.
        bids:
          type: integer
          description: How many settled bids make up the total.
        favicon:
          type: string
          format: uri
        first_bid_at:
          type: string
          format: date-time
          description: 'When this link first appeared. Breaks ties: on an equal total, whoever arrived
            first ranks higher.'
        updated_at:
          type: string
          format: date-time
          description: When the most recent bid settled.
        page:
          type: string
          format: uri
          description: Human-readable page for this entry, with its full bid history.
      required:
      - rank
      - url
      - name
      - description
      - amount_usd
      - amount_atomic
      - bids
      - first_bid_at
      - updated_at
      - page
    Leaderboard:
      type: object
      properties:
        count:
          type: integer
          description: How many live entries exist in total.
        total_paid_usd:
          type: string
          description: Everything ever paid into the board.
        top_amount_usd:
          type: string
          description: What the current number one has paid.
        to_take_first_usd:
          type: string
          description: What a single bid would have to be, right now, to take the top spot outright.
        entries:
          type: array
          items:
            $ref: '#/components/schemas/Entry'
      required:
      - count
      - total_paid_usd
      - top_amount_usd
      - to_take_first_usd
      - entries
    EntryLookup:
      type: object
      description: A listed link returns its entry plus what it would take to pass the one above it. An
        unlisted link returns 404 with the price of first place.
      allOf:
      - $ref: '#/components/schemas/Entry'
      properties:
        listed:
          type: boolean
          const: true
        to_pass_the_one_above_usd:
          type: string
          description: A single bid of this size would move this entry above the one ranked directly above
            it. Absent when it is already number one.
    BidSuccess:
      type: object
      description: The bid settled and the board has already changed.
      allOf:
      - $ref: '#/components/schemas/Entry'
      properties:
        ok:
          type: boolean
          const: true
        paid_usd:
          type: string
          description: What this one bid cost.
        transaction:
          type: string
          description: Settlement transaction hash. Unique — the same payment can never be credited twice.
        network:
          type: string
          description: Which chain it settled on.
        simulated:
          type: boolean
          description: True only on a test deployment with payments off. Always false in production.
      required:
      - ok
      - paid_usd
      - transaction
      - network
    Error:
      type: object
      properties:
        error:
          type: string
          description: What went wrong, in plain words.
        example:
          type: string
          description: A working call, when the problem was a missing or malformed field.
      required:
      - error
    PaymentRequired:
      type: object
      description: An x402 v2 payment-required object, priced at exactly the amount you asked to bid,
        on Base and Solana. The same object is also sent base64-encoded in the PAYMENT-REQUIRED response
        header. Pay one of the `accepts` entries and send the request again with the X-PAYMENT header.
      properties:
        x402Version:
          type: integer
          const: 2
        error:
          type: string
          example: Payment required
        resource:
          type: object
          description: What is being sold, and its tags.
        accepts:
          type: array
          description: One entry per network. Every entry is priced identically — pick whichever chain
            you hold USDC on.
          items:
            type: object
            properties:
              scheme:
                type: string
                const: exact
              network:
                type: string
              asset:
                type: string
              amount:
                type: string
                description: Atomic USDC units (6 decimals). This equals the amount you asked to bid.
              payTo:
                type: string
              maxTimeoutSeconds:
                type: integer
        extensions:
          type: object
          description: 'Carries the `bazaar` discovery block: the request shape, with an example.'
      required:
      - x402Version
      - accepts
servers:
- url: https://ontopx402.com
  description: OnTopX402 production
tags:
- name: leaderboard
- name: ranking
- name: directory
- name: listing
- name: submit
- name: advertising
- name: paid-placement
- name: sponsored
- name: promotion
- name: marketing
- name: bidding
- name: auction
- name: outbid
- name: pay-per-rank
- name: link-listing
- name: backlink
- name: seo
- name: x402
- name: usdc
- name: base
- name: solana
- name: agent-payments
- name: agent-discovery
- name: micropayments
x402Version: 2
x-payment-accepts:
- scheme: exact
  network: eip155:8453
  asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
  payTo: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
  amount: '1000000'
  amountMode: caller-specified
  minAmount: '1000000'
  maxAmount: '1000000000000'
  amountDecimals: 6
  amountNote: The amount shown is the $1 minimum. The 402 is priced at whatever amount you send.
  maxTimeoutSeconds: 300
- scheme: exact
  network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
  asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
  payTo: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b
  amount: '1000000'
  amountMode: caller-specified
  minAmount: '1000000'
  maxAmount: '1000000000000'
  amountDecimals: 6
  amountNote: The amount shown is the $1 minimum. The 402 is priced at whatever amount you send.
  maxTimeoutSeconds: 300