Blog/x402 discovery post-mortem
Working x402 payment isn't the same as working x402 discovery
How I shipped AgentCrush to Agentic.Market, and the boring metadata that almost stopped me.
AgentCrush is now visible on Agentic.Market. Behind it are three x402 endpoints I shipped on Base mainnet over the past week. CDP merchant discovery now sees all three; the Agentic.Market UI currently surfaces one.
Getting payment to work was the part I expected to be hard. It wasn't. Getting the listing to actually appear on Agentic.Market took longer than the implementation itself.
If you're building on x402, here's what I wish I'd known going in: a route that successfully accepts payment is not the same as a route that's discoverable. The two systems are decoupled. You can have one without the other, and you won't necessarily know.
The setup
The first endpoint that surfaced in the Agentic.Market UI was:
GET /api/agent/{handle}/verification-statusIt returns verification and tier status for any agent in the AgentCrush index. Priced at $0.005 USDC. The route returned a valid 402 Payment Required, buyers could pay, settlement landed on Base mainnet, the API returned 200 after payment.
But Agentic.Market didn't show it.
The investigation
I went through the predictable wrong assumptions in order. Indexing delay. The .well-known/x402 file. Maybe one more paid settlement. None of those were the actual issue.
The lesson that finally helped: debug CDP merchant discovery directly, not the Agentic.Market UI. CDP discovery is the lower-level catalog. Agentic.Market is a UI on top of it. If CDP doesn't have correct metadata, Agentic.Market won't show anything useful — but you can lose hours debugging the wrong layer.
Three layers, three failure modes
Before going into specifics, it helps to separate the three systems involved.
Working payment means the route can be paid and called. An agent or buyer sends a valid x402 payment header, the server settles it, the endpoint returns 200. That works independently of whether anyone can find the route.
Working CDP discovery means the endpoint is indexed with complete metadata — path parameters, output examples, pricing, category. That's the catalog layer.
Working Agentic.Market UI means the endpoint is visibly surfaced to users. Agentic.Market reads from CDP discovery and renders it. If the catalog entry is incomplete, the UI won't show it cleanly — or at all.
AgentCrush currently has all three x402 routes in CDP discovery. The Agentic.Market UI is currently surfacing one of them.
Two things were wrong, both in the discovery metadata.
Gotcha 1: pathParamsSchema for dynamic routes
My route is dynamic. The {handle} segment changes per agent. But the discovery declaration didn't include a proper pathParamsSchema. The route was callable, the route was payable — but the catalog had no structured way to describe what {handle} is or what a valid example looks like.
For dynamic routes, the discovery metadata needs to declare every path parameter and provide a real example like crewai. Without it, the listing is incomplete from the catalog's perspective, regardless of how many successful payments hit it.
Gotcha 2: output.example was silently absent
This one was subtler. The declareDiscoveryExtension call only includes output metadata when output.example is explicitly passed. I had everything else — category, tags, pricing, schema — but no output example. CDP discovery saw the resource. The catalog entry was structurally incomplete.
The output example matters because agent clients and marketplaces need to know what the endpoint returns, and not in the abstract. They need a real, representative response. Once I added examples for all three endpoints, the catalog entry filled in. Here's the one for verification-status:
{
"handle": "crewai",
"name": "CrewAI",
"tier": "evidence_ranked",
"verified": false,
"claim_status": "unclaimed",
"erc8004_registered": true,
"last_updated": "2026-04-25T15:01:12.914307+00:00",
"source": "agentcrush"
}The settlement requirement
One more thing I couldn't find clearly documented anywhere I looked: deploying the metadata fix wasn't enough. CDP discovery only updated after a fresh paid settlement triggered re-indexing. I deployed, refreshed CDP discovery, saw nothing. I made a paid call from a buyer wallet, refreshed again, the entry updated.
If you're debugging a similar issue and you've fixed the metadata but discovery still looks stale: trigger a paid settlement after the deploy. That's apparently what tells the indexer to re-read.
The checklist that worked
For anyone building x402 services and trying to get indexed:
- ✓valid 402 challenge
- ✓successful paid settlement
- ✓/.well-known/x402 and /.well-known/x402.json both live and valid
- ✓Bazaar discovery extension attached to the paid route
- ✓discoverable: true
- ✓category and tags set
- ✓pathParamsSchema for any dynamic routes
- ✓representative output.example, not just a schema
- ✓a fresh paid settlement after any metadata change
Debug CDP discovery before debugging the marketplace UI.
The branding gap
One issue is still unsolved, and it appears to be separate from the endpoint and discovery configuration. Agentic.Market displays AgentCrush as www.agentcrush.xyz with a generic icon, despite favicon, OpenGraph metadata, manifest, and .well-known/x402 all being clean.
CDP merchant discovery doesn't currently expose a merchant-level name, title, logo, or icon field. The discovery response is endpoint-centric. Unless there's an undocumented curation path, Agentic.Market is deriving display name and icon from the hostname. This looks like a platform-side decision or an undocumented feature — not something addressable from my end.
I'd love to be wrong about this. If anyone reading has gotten a custom logo or merchant name to surface on Agentic.Market, I want to know how.
Closing
What stayed with me from this debugging is simple. Working payment isn't the same as working discovery, and a lot of the agent commerce stack is going to feel like that for a while. You can ship a payable resource and discover later that it's not findable. You can ship metadata and discover it doesn't propagate without a settlement. Each of these is a small surprise; together they're the texture of building on a stack that's still being shaped.
AgentCrush is market intelligence for the agent economy — rankings, reputation signals, and discovery infrastructure. x402 is how we make the data callable.
Credit where it's due — the x402 channel on Coinbase's Developer Platform (CDP) Discord was helpful while I was debugging this. Good community there if you're shipping x402.
If you're thinking about shipping an x402 endpoint of your own, my DMs are open.