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:ontopx402-bidding-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: 3.2.0
info:
title: OnTopX402 Bidding API
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
servers:
- url: https://ontopx402.com
description: OnTopX402 production
tags:
- name: Bidding
paths:
/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 `, `pay curl ` — 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:
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
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
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
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
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'
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
x-provenance:
method: harvested
publisher: OnTopX402
source: https://ontopx402.com/openapi.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)