x402 API Directory — Paid Agent Endpoints & Usage Stats
Pricing
from $0.70 / 1,000 endpoint returneds
x402 API Directory — Paid Agent Endpoints & Usage Stats
Directory of live x402 (HTTP 402 stablecoin micropayment) API endpoints that AI agents pay for, from Coinbase CDP discovery: search by keyword, tag, category or domain; filter by network, asset, price, 30-day usage and liveness; optional HTTP probe and per-domain rollups.
Pricing
from $0.70 / 1,000 endpoint returneds
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Every x402 endpoint (APIs that charge per call in USDC over HTTP 402) listed in Coinbase's CDP discovery / Bazaar — about 23,000 listings in October 2026 — flattened into clean JSON with the price in USD, payment networks and assets, method and example input, and the real 30-day usage (paid calls, unique payers, last call). Search by keyword, tag, category or domain; filter by network, asset, price and traction; optionally probe each endpoint to confirm it still answers 402. Aggregate by seller domain for market research. No API key, no browser, no proxy.
Use cases
- Tool discovery for agents — "find a web-search / Twitter / SEC-filings endpoint under $0.01 on Base with ≥5 real payers", then feed
inputExample/inputSchemastraight into a tool definition. - Competitive pricing — pull every endpoint in a category (
query: "sentiment"), comparepriceUsd,calls30d,payers30d. - Seller lead-gen —
mode: "domains"gives the seller list with endpoint counts, 30-day calls and price range;sortBy: "calls"puts the sellers who actually earn first. - Market sizing / research — how many endpoints per network, share of Solana vs Base, median price, curated share (see
SUMMARY). - Uptime & liveness monitoring — schedule
checkLive: trueon your own domain(s) and alert whenisLiveflips to false. - New-listing watch —
updatedWithinDays: 1,sortBy: "updated"on a daily schedule.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
mode | endpoints | domains | endpoints | domains aggregates matching endpoints per host, ordered by sortBy. |
query | string | — | All words must appear in description/tags/service name/category/URL (case-insensitive substring). |
category | string | — | Substring match on the seller-declared category (free-form). |
tags | string[] | [] | Any-of match on seller tags (lower-cased). |
domains / domain | string[] / string | — | Only these hosts (subdomains included). |
excludeDomains | string[] | [] | Drop these hosts. |
curatedOnly | boolean | false | Only Coinbase-curated listings (~80). |
networks | string[] | — | Picked from the list in Reference (base, solana, polygon…); the platform refuses any other value before the run starts. |
network | string | — | One more network as free text, merged with networks: a list key, a short name (eth, arb, sol), a display name (Ethereum, Arbitrum One), a CAIP-2 id (eip155:8453) or a bare EVM chain id (8453). A CAIP-2 id or chain id not in the list is used as given (named in the status); any other unknown value (bsae) stops the run with a suggestion — it never turns into "all networks". |
excludeTestnets | boolean | false | Drop listings that only accept Base Sepolia / Solana Devnet / Polygon Amoy. |
assets | string[] | [] | Symbols: USDC, USDT, USDT0, USD1, USDG, EURC, RLUSD… |
minPriceUsd, maxPriceUsd | string | — | Per-call price bounds in US dollars as a plain number in a string, e.g. "0.05" (no $, no comma). Endpoints with unknown/non-USD price are excluded when a bound is set. |
minPayers | integer | 1 | Unique payers in the last 30 days. 2+ removes about three quarters of the directory (self-tested listings). |
minCalls | integer | 1 | Paid calls in the last 30 days. |
calledWithinDays | integer | — | Last paid call at most N days ago. |
updatedWithinDays | integer | — | Listing (re)published at most N days ago. |
checkLive | boolean | false | HTTP-probe the returned endpoints (endpoints mode); adds liveStatus, isLive, liveLatencyMs, liveNote. See Limits. |
methods | string[] | [] | GET / POST … |
sortBy | enum | payers | payers, calls, price, price_desc, recent, updated, domain. In domains mode: payers = the domain's best endpoint, calls = its total, price / price_desc = its cheapest / dearest endpoint. |
limit | integer 1–5000 | 50 | Endpoints or domains returned: the top ones by sortBy across the whole directory. |
includeExamples | boolean | true | Keep inputExample / outputExample. |
includeSchemas | boolean | false | Add inputSchema / outputSchema (JSON Schema from the seller). |
includeAccepts | boolean | false | Add accepts[] with every payment option. |
maxScan | integer 500–100000 | empty = all | Optional cap on listings read (1,000 per request). The status says when it left listings unread. |
fields | string[] | [] | Output only these fields, in this order (id always kept). Names: Reference → Output fields. Letter case is forgiven; an unknown name stops the run with a suggestion; a field of the other mode, or one whose option is off (isLive without checkLive), is left out and named in the status. |
The original inputs query, domain, network, minPayers, minCalls, maxPriceUsd, sortBy, limit still work. Since October 2026 an unknown network value stops the run (it used to be dropped, which returned every network), maxScan reads the whole directory unless you set it, and domains follow sortBy.
Reference
Networks (CAIP-2 ids seen in the directory, share of payment options)
| Value | CAIP-2 | Share | Value | CAIP-2 | Share |
|---|---|---|---|---|---|
base | eip155:8453 | 49 % | worldchain | eip155:480 | 3.5 % |
solana | solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp | 15 % | bsc | eip155:56 | 3 % |
polygon | eip155:137 | 8 % | xlayer | eip155:196 | 3 % |
arbitrum | eip155:42161 | 7 % | algorand | algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8= | 4.5 % |
xrpl | xrpl:0 | 5 % | hyperevm | eip155:999 | 2.6 % |
monad | eip155:143 | 5 % | optimism | eip155:10 | 2 % |
avalanche | eip155:43114 | 2 % | sei | eip155:1329 | 2 % |
celo | eip155:42220 | 2 % | stellar | stellar:pubnet | 2 % |
base-sepolia (testnet) | eip155:84532 | 1.5 % | ethereum | eip155:1 | <1 % |
hedera | hedera:mainnet | <1 % | hyperliquid | hyperliquid:mainnet | <1 % |
noble | cosmos:noble-1 | <1 % | lightning | lightning:mainnet | <1 % |
Also recognised: unichain (eip155:130), sonic (146), xdc (50), etherlink (42793), peaq (3338), megaeth (4326), xrpl-evm (1440000), solana-devnet, polygon-amoy, animica, zeroclick, alipay. Legacy names some sellers still publish (base, solana, polygon) are normalised to CAIP-2 in the output.
The networks list is a fixed choice: Apify refuses any other value before the run starts. The free-text network field also takes each network's display name, its CAIP-2 id and (EVM) its chain number; letter case, spaces and dashes do not matter, and nothing else is guessed.
Assets (resolved from the on-chain address; decimals used for priceUsd)
USDC on all EVM chains + Solana + Algorand ASA 31566704 + Noble uusdc + Stellar + Hedera + Hyperliquid (6–7 dec) · USDT (Base, Polygon, Solana 6 dec; BSC 18 dec) · USDT0 (X Layer) · USD1 (World Liberty, BSC, 18 dec) · USDG (Global Dollar) · USDU (United Stables) · USDm · RLUSD and USDC on XRPL · EURC (Base) · JPYC (Polygon) · XRP, XLM, SOL, ANM (non-USD → priceUsd: null). When a seller publishes extra.totalUsd that value wins.
Categories & tags (seller-declared, free-form)
Top categories: AI, finance, agent-ops-math, chain-primitives-local, utility, Infra, trading-signals, search, signal-normalize, sports, api, data-provider, marketing, financial-data, defi, domain-intelligence, security, social, news, prediction-markets, sec-filings, weather. Only a small share of listings declare a category (~1,200 of 15k in September 2026) — prefer query for recall.
Top tags: crypto, base, defi, x402, search, twitter, market-data, web, data, research, usdc, sec, hyperliquid, analytics, oracle, reddit, github, x, agents, smart-money, ai, on-chain, price, gas, compliance, company, derivatives, llm, trading, ethereum, social, risk, bitcoin, sanctions, enrichment, edgar, weather, travel, funding-rate, wallet, ofac.
Directory shape (snapshot, Sept 2026)
The directory grows fast (14,632 listings on 13.09, about 23,000 on 02.10). On 13.09: 14,632 listings · 1,972 hosts · 81 curated · unique payers (30d): 1 → 73 %, 2–4 → 20 %, 5–19 → 5.5 %, 20–99 → 0.7 %, 100+ → 32 endpoints · methods: GET 54 %, POST 46 %.
Output fields
Endpoint rows: id, url, domain, path, serviceName, description, category, tags, type, method, inputExample, outputExample, inputSchema and outputSchema (with includeSchemas), priceUsd, priceMinUsd, priceMaxUsd, asset, network, networkName, networks, networkNames, assets, schemes, payTo, accepts (with includeAccepts), calls30d, payers30d, lastCalledAt, daysSinceLastCall, curated, bundleSlugs, iconUrl, x402Version, lastUpdated, discoveryUrl, fetchedAt, and with checkLive: liveStatus, isLive, liveLatencyMs, liveNote.
Domain rows: id, domain, endpoints, serviceNames, categories, topTags, calls30d, payers30dMax, payers30dSum, priceMinUsd, priceMaxUsd, priceMedianUsd, networks, assets, curatedEndpoints, lastCalledAt, lastUpdated, sampleUrls, fetchedAt.
Examples
Cheap, proven web-search / Twitter tools for an agent (Base or Solana)
{ "query": "twitter", "networks": ["base", "solana"], "minPayers": 3, "maxPriceUsd": "0.05", "checkLive": true, "sortBy": "calls", "limit": 12, "includeExamples": false }
Seller landscape — who actually earns
{ "mode": "domains", "minPayers": 5, "excludeTestnets": true, "limit": 100 }
Compliance / sanctions endpoints with tool schemas
{ "tags": ["sanctions", "ofac", "compliance"], "minPayers": 2, "includeSchemas": true }
Curated only, most expensive first
{ "curatedOnly": true, "sortBy": "price_desc", "minPayers": 0, "minCalls": 0 }
Monitor my own listings
{ "domains": ["api.mycompany.com"], "minPayers": 0, "minCalls": 0, "checkLive": true, "fields": ["url", "priceUsd", "payers30d", "calls30d", "lastCalledAt", "isLive", "liveStatus", "liveLatencyMs"] }
New listings in the last 24 h
{ "updatedWithinDays": 1, "sortBy": "updated", "minPayers": 0, "minCalls": 0, "limit": 200 }
Output
mode: "endpoints" — one item per endpoint (trimmed):
{"id": "b9a43b48","url": "https://api.onesource.io/api/chain/erc20-balance","domain": "api.onesource.io","path": "/api/chain/erc20-balance","serviceName": null,"description": "ERC20 token balance for any Ethereum wallet ... via balanceOf (eth_call)","category": null,"tags": [],"type": "http","method": "GET","inputExample": { "method": "GET", "queryParams": { "address": "0xd8da...", "contract": "0xdac1...", "network": "ethereum" }, "type": "http" },"outputExample": { "data": { "balance": "1234567890", "symbol": "USDT" } },"priceUsd": 0.003, "priceMinUsd": 0.003, "priceMaxUsd": 0.003,"asset": "USDC", "network": "eip155:8453", "networkName": "Base","networks": ["eip155:8453"], "networkNames": ["Base"], "assets": ["USDC"], "schemes": ["exact", "batch-settlement"],"payTo": "0x52E29e0d2Aa49bfBfC548C0A9F2196F4aa51f3ea","calls30d": 1077, "payers30d": 1070, "lastCalledAt": "2026-09-12T18:37:41.411Z", "daysSinceLastCall": 0.2,"curated": false, "bundleSlugs": [], "iconUrl": null, "x402Version": 1,"lastUpdated": "2026-09-12T20:01:11.000Z","discoveryUrl": "https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources","fetchedAt": "2026-09-12T23:40:02.041Z"}
| Field | Meaning |
|---|---|
id | Stable 8-hex hash of the URL. |
url, domain, path | Endpoint address split for grouping. |
serviceName, description, category, tags, type | Seller metadata (tags lower-cased); type is the resource type (http). |
method, inputExample, outputExample | From the Bazaar extension; inputSchema / outputSchema with includeSchemas. |
priceUsd | Price of the primary USD-stablecoin option; priceMinUsd / priceMaxUsd across all options; null if unknown or non-USD. |
asset, network, networkName, payTo | Primary payment option; networks, networkNames, assets, schemes list every option; accepts[] with includeAccepts. |
calls30d, payers30d, lastCalledAt, daysSinceLastCall | Facilitator usage stats. |
curated, bundleSlugs, iconUrl, x402Version, lastUpdated | Listing metadata. |
liveStatus, isLive, liveLatencyMs, liveNote | Only with checkLive. isLive: true = answered HTTP 402; false = another answer (200, 404, 5xx, redirect) or none (timeout, DNS); null = not checked because the host rate-limited the probe or was unavailable (429/503). |
mode: "domains" — one item per host, ordered by sortBy: domain, endpoints, serviceNames, categories, topTags, calls30d (sum), payers30dMax, payers30dSum, priceMinUsd/priceMaxUsd/priceMedianUsd, networks, assets, curatedEndpoints, lastCalledAt, lastUpdated, sampleUrls (top-3 by payers), fetchedAt.
The run's status message says what was saved, how much of the directory was read and what was left out (a maxScan cap, the run timeout, an API failure, the spending limit, ignored options). Key-value store SUMMARY: directory total, listings scanned (scanComplete, scanEnd), matched, returned, live-check counts, notes and the criteria used.
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~x402-endpoints/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' -d '{"query":"web search","minPayers":3,"maxPriceUsd":"0.02"}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/x402-endpoints').call({ mode: 'domains', minPayers: 5, limit: 100 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/x402-endpoints").call(run_input={"tags": ["sec", "edgar"], "includeSchemas": True})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: connect https://mcp.apify.com and call the yadroo/x402-endpoints tool with the same JSON — an agent can discover a paid tool, read inputSchema, and pay for it in one loop.
Pricing
Pay per event: $0.001 per run start + $0.001 per item returned (endpoint or domain row). Store discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the item price; the start event is the same on every plan; platform usage is included. The default run (50 endpoints) costs $0.051 on the free plan; a 500-row market scan $0.501. The whole directory is read on every run regardless of limit (about 23 requests, ~40–90 s) — cost only depends on rows returned, so use limit and filters. With a "Maximum cost per run" set, the run stops at that cost and says so in the status ("Stopped at your spending limit: N rows delivered").
Limits & FAQ
- Freshness — read live from Coinbase CDP discovery on every run; usage stats are the facilitator's rolling 30-day counters.
- Coverage — only endpoints registered with the Coinbase facilitator / Bazaar. x402 servers using other facilitators are not listed. Every run reads the whole directory: it is not sorted by usage (listings with 5+ payers turn up deep in it), so the run never stops early on a usage filter;
maxScancaps the scan only when you set it. - Price accuracy — computed from the raw token amount and the asset's decimals (dictionary above). Unknown assets →
priceUsd: null; setincludeAcceptsto see the raw amount. - Liveness probe — one unpaid request per returned endpoint (GET, or POST with
{}), 10 s timeout, up to 6 at a time and never two at once to the same host (250 ms apart). A healthy endpoint answers 402;200means it served without payment;404/5xx/timeout means dead or moved; a429/503is retried once after a shortRetry-After, then reported asisLive: null("not checked"), never as dead. Rows are saved in batches of 50 as their probes finish. Nothing is paid. A largelimitwith many slow hosts can need more than the 15-minute default timeout: endpoints not probed before the run ends are not delivered (or charged), and the status says how many. - Run timeout — the run stops starting new requests shortly before its timeout and ends SUCCEEDED with "Stopped before the run timeout: N rows saved"; if the scan was cut, the status says how many listings were read and results cover only those.
- Errors — the discovery API is retried 4× with backoff on 429/5xx. If it fails before anything is read, the run fails with a clear status (nothing charged beyond the start); if it fails part-way, the run returns the results from the listings read and the status names the failure.
- Memory — pages are shaped and filtered as they stream; endpoints mode keeps only the best
limitrows and domains mode only the fields it aggregates, so the full scan fits the 512 MB default. - Roadmap — historical snapshots (price/usage deltas between runs), facilitator-agnostic sources, category normalisation.
Made by Yadroo — more data actors for agents: wallet-intel · base-token-intel · dexscreener-tokens · coingecko-markets · defillama-protocols · crypto-news

