x402 Bazaar Listing Monitor

MCP serverMonitoring & ops

This integration watches x402 Bazaar resource listings and compares them against the public discovery catalog. When a listing drops out of the catalog, your AI flags it so you know right away. It is useful for keeping an eye on changes without checking manually.

Use x402 Bazaar Listing Monitor in Claude, ChatGPT or Ahel Desktop

Free. Sign in, add x402 Bazaar Listing Monitor and connect your AI. About a minute.

Also: Claude Code · Cursor · Codex

Then ask your AI: use x402 Bazaar Listing Monitor to check listing health

Details

Available today. Use it from your connected AI after setup.

Add the integration and ask your AI to check the current x402 Bazaar listings against the discovery catalog. It will report any drops it finds.

x402 Bazaar Listing MonitorStart free

What your AI can do with it

  • Check x402 Bazaar resource listings against the public discovery catalog
  • Flag listings that drop out of the catalog
  • Monitor listing changes automatically

Install x402 Bazaar Listing Monitor

The server’s own address, for the clients that take one directly. Or connect Ahel once and every client you use reads it from one address, with the account kept on Ahel rather than in each client’s config.

  • Claude Code

    claude mcp add --transport http --scope user x402-bazaar-listing-monitor 'https://x402-listing-monitor.acjlabs.com/mcp'

    Run it once in your project, then open /mcp to approve any sign-in the server asks for.

  • Claude Desktop

    https://x402-listing-monitor.acjlabs.com/mcp

    Add a custom connector in Settings, paste this address, and approve the sign-in.

  • Cursor

    cursor://anysphere.cursor-deeplink/mcp/install?name=x402-bazaar-listing-monitor&config=eyJ1cmwiOiJodHRwczovL3g0MDItbGlzdGluZy1tb25pdG9yLmFjamxhYnMuY29tL21jcCJ9

    Open the link and Cursor adds the server at that address.

  • ChatGPT

    https://x402-listing-monitor.acjlabs.com/mcp

    In Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.

  • Codex

    codex mcp add x402-bazaar-listing-monitor --url 'https://x402-listing-monitor.acjlabs.com/mcp'

    Run it once, then sign in with codex mcp login x402-bazaar-listing-monitor if the server asks for an account.

From the project's README

As published by acjlabs/x402-listing-monitor in README.md.

Scheduled watchdog for x402 sellers: polls Coinbase CDP's public Bazaar discovery catalog for the resources you register and alerts when one drops out or comes back — instead of finding out from a revenue dip days later.

Sellers who settle real x402 payments have no reliable way to confirm their resources stay discoverable in CDP's Bazaar catalog. The discovery API has a recurring, publicly-reported class of bug where a resource silently stops appearing despite confirmed settlements — sellers currently catch this only by manually re-running GET /discovery/merchant?payTo=<address> on their own schedule.

This service automates that check: register your payTo address and the resource URLs you serve, and a scheduled poll diffs them against the live discovery catalog. State changes are recorded with timestamps, so you have a durable history you can cite if you need to escalate to CDP support.

MCP server

Endpoint: https://x402-listing-monitor.acjlabs.com/mcp (streamable HTTP)

One tool — no signup, no API key:

check_listing_health

Checks whether a seller's x402 Bazaar resources are currently listed under a given payTo address in the public discovery catalog. Runs the same per-seller diff as the scheduled poller, on demand, for any payTo/resources pair — registered here or not.

parametertypenotes
payTostring0x-prefixed, 40 hex characters
resourcesstring[]1–200 http(s) URLs

Returns each resource flagged as listed or missing, as JSON.

HTTP API

Base URL: https://x402-listing-monitor.acjlabs.com

methodpathpurpose
GET/healthliveness check
POST/registerregister a seller for scheduled polling
GET/statusread your own current status and recent alerts
POST/pollrun a poll immediately (counts only, see below)

POST /register

{
  "sellerId": "your-slug",
  "payTo": "0x0000000000000000000000000000000000000000",
  "resources": ["https://api.example.com/your-resource"],
  "alertWebhookUrl": "https://example.com/hook"
}
  • sellerId — 2–64 characters: letters, digits, -, _
  • payTo — 0x-prefixed, 40 hex characters
  • resources — 1–200 http(s) URLs, no duplicates
  • alertWebhookUrl — optional. A public https URL; alerts on your plan are POSTed to it. IP-literal, loopback, .internal/.local hosts and URLs carrying credentials are rejected.
  • alertEmail — optional, and stored but not yet used: email delivery is not enabled (see Status).

Both contact fields are optional and registration succeeds without either. Supply neither and nothing is pushed to you — use GET /status below to check on your listings yourself.

Resources are watched by self-declaration: the service checks what you tell it to check. A sellerId that already exists is rejected rather than overwritten.

GET /status

GET /status?sellerId=your-slug&payTo=0x0000000000000000000000000000000000000000

Returns your own record: every resource you registered with its current status (listed, missing, payTo-mismatch, or null if no poll has reached it yet), its consecutive-miss count and last-checked timestamp, plus your most recent alerts and whether each was delivered.

Both sellerId and payTo are required and must match your registration; anything else returns 404. This is a knowledge check, not authentication — the data it returns is a diff against a public catalog. Your alertEmail and alertWebhookUrl are never echoed back, only reported as set or not set.

POST /poll

Runs the same poll the six-hourly cron runs, immediately, for every registered seller. Takes no body and returns counts only:

{ "polled": 2, "ok": 2, "failed": 0 }

It reports nothing about any individual seller. This endpoint is unauthenticated, so anything it returned would be public — read your own state with GET /status instead.

Only one poll runs at a time. If a poll is already in progress — whether someone else triggered it or the six-hourly cron did — this returns 409 and does no work:

{ "status": "already_running" }

That is not an error to retry through: the poll you asked for is already happening, and retrying cannot make its alerts arrive sooner or arrive twice — the lock is what stops two concurrent polls from sending you the same alert. It is a guarantee against duplication, not a delivery guarantee: an alert is always recorded before it is sent, and if the send does not land it stays recorded and undelivered rather than being retried. Wait, then read GET /status, which shows each recent alert and whether it was delivered.

Per-IP rate limits apply to /register, /status, /poll and MCP tool calls.

Webhook payload

{
  "service": "x402-listing-monitor",
  "sellerId": "your-slug",
  "checkedAt": "2026-08-07T00:00:00.000Z",
  "alerts": [
    {
      "type": "listing-dropped",
      "resource": "https://api.example.com/your-resource",
      "detail": "was listed, now missing from discovery",
      "message": "⚠️ Listing dropped: https://api.example.com/your-resource — was listed, now missing from discovery"
    }
  ]
}

checkedAt is the poll's timestamp, matching created_at on the same alerts in GET /status. Any 2xx counts as delivered. Redirects are not followed — a 3xx is treated as a failed delivery, so register the final URL. Failed deliveries are not retried; the alert stays in your history marked undelivered.

Polling and alerts

The scheduled poll runs every 6 hours. Each run diffs your registered resources against the live discovery catalog and records state changes with timestamps — a history, not just a point-in-time answer.

alert typetier
resource dropped out of the catalogfree
still missing after an indexing-lag grace periodfree
resource recoveredfree
registered payTo missing from the catalog entrypaid
catalog quality/rank droppaid

"Still missing" fires once per miss streak, from the first poll at which a resource has been absent for three or more consecutive polls — long enough that indexing lag is ruled out. It does not repeat every six hours while the resource stays missing; the current state is always readable from GET /status.

Three consecutive misses is the earliest it can fire, not the only point at which it can. A resource that is already past three consecutive misses and has not yet been alerted for that streak raises its one alert on the next poll. If the resource recovers and later drops out again, that is a new streak and it alerts again.

Paid tiers also tighten the polling interval.

Status

Early release. The service is live and polling, and the recorded alert history is authoritative for what it has observed.

  • Webhook delivery is enabled. Register an https alertWebhookUrl and alerts on your plan are POSTed to it when a check produces one.
  • Email alerts are not enabled yet. alertEmail is stored against your registration and nothing is sent to it.
  • No contact is required. GET /status gives you the same information on demand.

Source availability & support

This repository hosts the documentation for the hosted service. The service implementation is not open source. Bug reports and feature requests are welcome in this repo's Issues; you can also reach us at contact@acjlabs.com.

Source availability & support

This repository hosts the documentation for the hosted service. The service implementation is not open source. Bug reports and feature requests are welcome in this repo's Issues; you can also reach us at contact@acjlabs.com.

Tools it offers (1)

What this server listed when Ahel dialed its public endpoint in Sep 2026, with no key and no account of yours. The names are the server’s own.

  • check_listing_health

Signals

GitHub stars
1
Last commit
Aug 2026
Advanced
Delivery
x402-listing-monitor MCP server → your Ahel connector (mcp.ahel.ai) → your AI.
Item type
mcp-server
Key
com-acjlabs-x402-listing-monitor
Source
github.com/acjlabs/x402-listing-monitor
Hosted endpoint
https://x402-listing-monitor.acjlabs.com/mcp