# x402 Bazaar Scraper & Monitor – Coinbase Agent API Catalog (`benelux-signals/x402-bazaar-monitor`) Actor

Scrape and monitor the x402 Bazaar, Coinbase's catalog of pay-per-call APIs for AI agents: search, full catalog export, host rankings and daily new / changed / removed listing alerts. Price in USD, networks, payTo, 30-day calls and payers.

- **URL**: https://apify.com/benelux-signals/x402-bazaar-monitor.md
- **Developed by:** [Benelux Signals](https://apify.com/benelux-signals) (community)
- **Categories:** AI, Developer tools, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 x402 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## x402 Bazaar Scraper & Monitor – Coinbase Agent API Catalog

Scrape, search and monitor the **x402 Bazaar**, the public discovery catalog of the Coinbase Developer Platform (CDP) facilitator that lists every **pay-per-call API for AI agents** paid via the [x402 protocol](https://www.x402.org/) (HTTP 402 + USDC). Get every listing as clean JSON, CSV or Excel, with the **price per call in USD, payment networks, merchant wallet (payTo), paid calls and unique payers over the last 30 days**, and get **daily alerts for new, changed, repriced and removed x402 endpoints**.

*Not affiliated with or endorsed by Coinbase or the x402 Foundation.* Data comes from the official, public, key-less Bazaar discovery API.

### Why use this Actor?

- **The whole x402 Bazaar, not just the top 20.** The Bazaar's own search returns at most 20 results. Catalog mode pages through all ~77,000 listings (Nov 2026) and filters by keyword, network, price, tags, URL and real usage.
- **Change monitor.** The catalog churns fast (tens of thousands of listings come and go each month). Turn on `monitorChanges` and schedule the Actor: each run returns only **new**, **changed**, **price_changed** (with `previousPriceUsd`) and **removed** listings.
- **Host ranking.** `hosts` mode collapses the catalog into one row per API provider: endpoints, total paid calls (30 days), peak unique payers, min/median/max price, networks, wallets and top tags. You can see at a glance who really earns from agent payments and who only spams listings.
- **Prices in dollars.** Atomic USDC amounts are converted to USD per call. Testnet-only listings are filtered out by default.
- **Official public API only.** No login, no API key, no proxies, no personal data. Requests are paced and retried politely.

### Use cases

- **x402 / agent-payments builders**: competitor and pricing research before you list your own paid API.
- **AI agent developers**: find paid tools per topic (weather, search, crypto data, scraping) with price and real usage, then feed them into your agent or MCP server.
- **Crypto and market analysts**: track x402 Bazaar growth, churn, pricing and the top hosts by paid calls.
- **Investors and BD teams**: lead lists of companies that monetise APIs through x402.

### Input examples

Search the Bazaar like an agent would:

```json
{ "mode": "search", "query": "weather forecast" }
```

All Base listings under $0.01 per call that were actually used in the last 30 days, most-called first:

```json
{ "mode": "catalog", "networks": ["base"], "maxUsdPrice": 0.01, "minCalls30d": 1, "maxResults": 500 }
```

Top 50 x402 API providers by paid calls:

```json
{ "mode": "hosts", "maxResults": 50 }
```

Daily change monitor for everything about "crypto" (schedule it daily; the first run saves a baseline):

```json
{ "mode": "catalog", "keywords": ["crypto", "token"], "monitorChanges": true, "stateKey": "crypto-watch", "maxResults": 1000 }
```

### Output example

```json
{
  "status": "ok",
  "changeType": "price_changed",
  "resource": "https://www.api-xpay.com/x402/quote",
  "host": "www.api-xpay.com",
  "serviceName": "X Pay",
  "description": "Payment quote with amount, asset, and merchant wallet",
  "tags": ["payment", "quote", "pricing"],
  "method": "GET",
  "priceUsd": 0.005,
  "previousPriceUsd": 0.01,
  "networkNames": ["base"],
  "assets": ["USD Coin"],
  "payTo": ["0x589a2314a2E05F45e40C4823Da3Ba58D421dB3d8"],
  "calls30d": 6719,
  "uniquePayers30d": 250,
  "lastCalledAt": "2026-11-01T07:21:51.728Z",
  "lastUpdated": "2026-11-01T07:21:52.059Z",
  "scrapedAt": "2026-11-02T15:00:00.000Z"
}
```

A summary (resources scanned, matched, saved, charged, change counts) is stored as `RUN_SUMMARY` in the run's key-value store.

### Pricing

Pay per event, no subscription:

| Event | Free plan | Bronze | Silver | Gold+ |
|---|---|---|---|---|
| Listing, host or change row saved (`listing`) | $0.001 | $0.0009 | $0.0008 | $0.0007 |
| Full catalog scan (`full-catalog-scan`, hosts mode and monitor mode only) | $0.01 | $0.01 | $0.01 | $0.01 |
| Actor start | $0.001 | $0.001 | $0.001 | $0.001 |

A search costs about $0.021. A daily monitor that finds 30 changes costs about $0.041 per day. **Baseline runs, "no results" rows and error rows are free.** Use `maxResults` or the maximum cost per run to cap spending.

### FAQ

**Where does the data come from?** From the public x402 Bazaar discovery API of the Coinbase Developer Platform (`/v2/x402/discovery/resources` and `/search`), the same catalog that agents and the CDP SDK use. No API key is needed.

**How fresh is it?** Live at run time. `calls30d`, `uniquePayers30d` and `lastCalledAt` come from the Bazaar's own quality data.

**Why can a "removed" listing come back?** The catalog changes while it is being paged. To avoid false alarms, a listing must be missing in two consecutive scans before it is reported as removed.

**Does it call or pay for the APIs?** No. It only reads the catalog. Nothing is paid and no endpoint is invoked.

**Why do some prices show null?** The price is only converted when the payment asset is a USD stablecoin with known decimals. Other assets keep their raw `accepts` data (`includeSchemas: true`).

### Related actors by benelux-signals

- [Technical SEO Site Crawler](https://apify.com/benelux-signals/technical-seo-site-crawler) – audit the websites behind the x402 hosts you find.
- [Bulk PageSpeed & SEO Audit](https://apify.com/benelux-signals/bulk-pagespeed-seo-audit) – Core Web Vitals and Lighthouse scores for many URLs.
- [EU & Dutch News Monitor](https://apify.com/benelux-signals/eu-news-rss-monitor) – keyword alerts across 80+ news and official RSS feeds.
- [PDF & Image to Text OCR](https://apify.com/benelux-signals/pdf-image-to-text-ocr) – turn PDFs into text for RAG and AI agents.
- [EU Career Site Jobs API](https://apify.com/benelux-signals/eu-career-site-jobs-api) – jobs from Greenhouse, Lever, Recruitee, Personio and more.
- [Remote Jobs Aggregator](https://apify.com/benelux-signals/remote-jobs-aggregator) – Europe-friendly remote jobs from five boards, deduplicated.

# Actor input Schema

## `mode` (type: `string`):

<b>search</b>: the Bazaar's own relevance search, max 20 results per query. <b>catalog</b>: page through the full catalog (~77,000 listings) and filter. <b>hosts</b>: aggregate the full catalog per host (endpoints, calls, payers, prices).

## `query` (type: `string`):

Natural-language query, e.g. "weather forecast", "token price", "web scraping". Used in search mode only.

## `keywords` (type: `array`):

Keep listings whose name, description, URL or tags contain any of these words (case-insensitive substring). Leave empty for everything.

## `networks` (type: `array`):

Only listings that accept payment on one of these networks. Use names (base, base-sepolia, polygon, solana, arbitrum, optimism, avalanche, bsc, sei) or CAIP-2 ids like eip155:8453.

## `maxUsdPrice` (type: `number`):

Only listings whose cheapest price per call is at or below this amount, e.g. 0.01. Leave empty for no limit.

## `urlContains` (type: `string`):

Only listings whose endpoint URL contains this text (min. 3 characters), e.g. a domain.

## `tags` (type: `array`):

Only listings carrying at least one of these provider tags (exact, case-sensitive), e.g. weather, crypto, search.

## `minCalls30d` (type: `integer`):

Skip listings with fewer paid calls in the last 30 days. 1 = only listings that were actually used.

## `excludeTestnets` (type: `boolean`):

Skip listings that only accept testnet payments (e.g. Base Sepolia, Solana devnet).

## `sortBy` (type: `string`):

Sort order. Any order except 'Catalog order' scans the full catalog first.

## `monitorChanges` (type: `boolean`):

Compare with the previous run (same state key) and return only <b>new</b>, <b>changed</b>, <b>price_changed</b> and <b>removed</b> listings. The first run saves a baseline and returns no billable rows. Schedule it daily for alerts.

## `includeRemoved` (type: `boolean`):

In monitor mode, also output listings that disappeared (missing in two consecutive scans).

## `stateKey` (type: `string`):

Name of the saved snapshot. Use a different key per monitor (letters, digits, - and \_).

## `includeSchemas` (type: `boolean`):

Add the input example, output example and raw payment requirements (accepts) to each row. Makes rows much bigger.

## `maxResults` (type: `integer`):

Maximum number of rows saved (and charged).

## Actor input object example

```json
{
  "mode": "search",
  "query": "weather forecast",
  "keywords": [],
  "networks": [],
  "tags": [],
  "minCalls30d": 0,
  "excludeTestnets": true,
  "sortBy": "calls",
  "monitorChanges": false,
  "includeRemoved": true,
  "stateKey": "default",
  "includeSchemas": false,
  "maxResults": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

All rows in the overview table view.

## `runSummary` (type: `string`):

JSON summary (scanned, matched, saved, charged, changes) under RUN_SUMMARY.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "query": "weather forecast",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("benelux-signals/x402-bazaar-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "query": "weather forecast",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("benelux-signals/x402-bazaar-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "query": "weather forecast",
  "maxResults": 50
}' |
apify call benelux-signals/x402-bazaar-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benelux-signals/x402-bazaar-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/o8TamBMhVOng5Hu8S/builds/KY7ndHzLGhiM0HfyZ/openapi.json
