x402 API Directory - pay-per-call APIs with live prices avatar

x402 API Directory - pay-per-call APIs with live prices

Pricing

from $2.00 / 1,000 resource rows

Go to Apify Store
x402 API Directory - pay-per-call APIs with live prices

x402 API Directory - pay-per-call APIs with live prices

Every pay-per-call API on the x402 discovery board, one row per resource: URL, host, description, price in USD, network, payee, scheme, and an optional live probe for the HTTP 402 that says the price is still being asked. Filter by network and price.

Pricing

from $2.00 / 1,000 resource rows

Rating

0.0

(0)

Developer

Stephen Psaradellis

Stephen Psaradellis

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

x402 API Directory

A dataset of every pay-per-call API on the x402 discovery board: one row per HTTP 402 resource with its URL, price in USD, network, payee and payment scheme, plus an optional live probe that records whether the resource still answers 402 Payment Required today. Run it with the defaults for a 200-row sample, or set maxResources to 0 for the whole board.

x402 is the HTTP 402 payment protocol: an API answers a plain request with 402 Payment Required and its price, and a client that pays (USDC on Base, usually) gets the response. Coinbase runs a public discovery board of these resources. This Actor reads the board, normalises every row, and optionally sends each resource one plain GET to record what it answers.

What you get

One dataset row per x402 resource:

fieldmeaning
url, host, paththe resource
descriptionthe publisher's own description
price_usdthe price in USD when the asset is USDC, else null
price_atomic, asset, asset_namethe raw price as listed
networke.g. eip155:8453 (Base mainnet)
pay_tothe payee address
scheme, schemesthe payment scheme(s) accepted
http_method, input_type, output_typefrom the board's bazaar extension, when present
board_last_updated, board_qualityas the board reports them: 30-day call and payer counts
probe{status, live_402, latency_ms, checked_at} when probing is on
read_atwhen this row was read

The key-value store also gets a RUN_SUMMARY with counts: board rows read, rows kept after filters, probed, live 402s, pushed.

Example output

Two rows from a run on 2026-09-06, exactly as the dataset holds them:

[
{
"url": "https://api.onesource.io/api/chain/erc20-balance",
"host": "api.onesource.io",
"path": "/api/chain/erc20-balance",
"description": "ERC20 token balance for any Ethereum wallet - USDC, USDT, DAI, or any token - via balanceOf (eth_call) on OneSource live Ethereum RPC",
"type": "http",
"price_usd": 0.003,
"price_atomic": "3000",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"asset_name": "USD Coin",
"network": "eip155:8453",
"pay_to": "0x52E29e0d2Aa49bfBfC548C0A9F2196F4aa51f3ea",
"scheme": "exact",
"schemes": [
"exact",
"batch-settlement"
],
"max_timeout_secs": 3600,
"http_method": "GET",
"input_type": "http",
"output_type": "json",
"board_last_updated": "2026-09-06T18:22:29.009Z",
"board_quality": {
"l30DaysTotalCalls": 1153,
"l30DaysUniquePayers": 1147,
"lastCalledAt": "2026-09-06T18:22:28.786Z"
},
"x402_version": 2,
"probe": {
"status": 402,
"live_402": true,
"latency_ms": 97,
"checked_at": "2026-09-06T19:52:35.274Z",
"payment_required_header": true
},
"read_at": "2026-09-06T19:52:35.273Z"
},
{
"url": "https://api.onesource.io/api/chain/ens/:input",
"host": "api.onesource.io",
"path": "/api/chain/ens/:input",
"description": "ENS resolve - turn a .eth name into an address, or an address into its primary .eth name, via eth_call on OneSource live Ethereum RPC",
"type": "http",
"price_usd": 0.005,
"price_atomic": "5000",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"asset_name": "USD Coin",
"network": "eip155:8453",
"pay_to": "0x52E29e0d2Aa49bfBfC548C0A9F2196F4aa51f3ea",
"scheme": "exact",
"schemes": [
"exact",
"batch-settlement"
],
"max_timeout_secs": 3600,
"http_method": "GET",
"input_type": "http",
"output_type": "json",
"board_last_updated": "2026-09-06T18:22:32.04Z",
"board_quality": {
"l30DaysTotalCalls": 1134,
"l30DaysUniquePayers": 1131,
"lastCalledAt": "2026-09-06T18:22:31.883Z"
},
"x402_version": 2,
"probe": {
"status": 402,
"live_402": true,
"latency_ms": 112,
"checked_at": "2026-09-06T19:52:35.275Z",
"payment_required_header": true
},
"read_at": "2026-09-06T19:52:35.273Z"
}
]

How to run it

  1. Open the Actor in Apify Console and press Start with the defaults: a 200-row sample, each resource probed once, about 30 seconds.
  2. Set Max resources to 0 for the whole board (about 15,000 rows on 2026-09-06), or narrow it with the filters below.
  3. Read the dataset in Console, export it as JSON or CSV, or fetch it from the API with the run's defaultDatasetId.

Input

  • maxResources - stop after this many rows pass the filters. The default of 200 is a quick sample; 0 is the whole board.
  • probe - send each resource one plain GET with no payment and record the status. 402 means the price is live. On by default.
  • probeConcurrency, probeTimeoutSecs - how the probing is paced.
  • network - keep only one network, e.g. eip155:8453.
  • minPriceUsd, maxPriceUsd - keep only USDC-priced rows in a range.

Pricing

Pay per event, with no charge for platform usage. resource-row is $0.002 per row pushed; probed-row is $0.005 per row probed (only when probing is on). What a run costs:

runeventsprice
50 rows, probed50 + 50$0.35
default: 200 rows, probed200 + 200$1.40
200 rows, no probe200$0.40
whole board (about 15,000 rows), probed15,000 + 15,000about $105

Set maxResources or a price range to bound a run.

Use it from code

The API tab on this page has ready-made snippets for Node.js, Python and curl, including run-sync-get-dataset-items, which starts a run and returns the rows in one call. The Actor also works through the Apify MCP server.

FAQ

Does the Actor pay any of these APIs? No. It never pays a resource and never sends a payment header. The probe is one unauthenticated GET per resource, the same request any browser would make.

Where do the rows come from? From Coinbase's public x402 discovery board (api.cdp.coinbase.com, the x402 discovery endpoint) and, when probing is on, from the resource's own answer to one GET. Rows are what the board and the resource said; nothing is ranked or judged.

Is price_usd ever missing? It is null when the listed asset is not a USDC contract the Actor recognises; the raw price_atomic and asset are always kept.

What does probe.status other than 402 mean? The resource answered something else to a plain GET: a 200 (it serves without payment), a 404 or 5xx (it is gone or broken), or timeout. live_402 is true only for a 402.

Running locally

npm install
npm start

Input is read from storage/key_value_stores/default/INPUT.json; the dataset lands under storage/datasets/default/.