describeEndpoint from @rail402.dev/sdk (also exported from @rail402.dev/seller-helpers).
What an agent sees
An agent choosing between your endpoint and someone else’s has nothing but your text, and search ranks on that same text. A parameter namedq with no description is invisible in search and unusable by an agent, because the agent cannot tell what to put in it.
So the description is the product. Compare:
describeEndpoint params
Pass one entry per parameter underparams. Each entry carries a description and optional hints an agent uses to build a valid call.
The resource-level
description is a separate field on the paywall route, not part of describeEndpoint. describeEndpoint describes the parameters; the route’s own description describes the endpoint. Both are indexed. See the Seller quickstart for where the resource description goes.What the facilitator catalogs, and when
Cataloging is automatic and settlement-gated. There is no separate registration call. A resource enters the catalog because a payment carrying its discovery metadata settles. The flow is hybrid, in two stages:1
At verify: a provisional listing
When a well-formed payment reaches
/verify, the facilitator writes a provisional listing. It is discoverable, but it carries no ranking signals, has no owner, and is pruned after a short time-to-live. This is why a resource can appear during payment verification, as the upstream reference facilitators expect. A free /verify can never lock out or spoof a real seller, because a provisional listing is always displaceable.2
At settle: a confirmed, owned listing
When the payment settles, the listing is confirmed. Settlement is the only thing that earns ownership and ranking. The owner is the
payTo that settled the payment, which is what stops anyone from rewriting your listing after the fact.Confirm your listing landed
The facilitator reports the cataloging outcome in theEXTENSION-RESPONSES header on its /verify and /settle responses. The value is base64-encoded JSON.
processing means the provisional listing is recorded. success means it is cataloged and owned. rejected carries a non-null rejectedReason you can read and a machine code you can branch on. You can also confirm from the outside once the payment settles:
How the catalog stays honest
Clients echo the resource block into the payment payload, so the facilitator treats every listing as untrusted input. You get these protections for free:- Ranking grows with distinct real payers, not with self-payments, so paying your own endpoint earns no ranking signal.
- The asset identity on your listing is derived by the facilitator from the on-chain contract, not taken from the client, so a token cannot claim to be USDC when it is not.
- A route template is percent-decoded before it is checked for path traversal, so a crafted template cannot escape its origin.
Check your own account first
Before a stranger’s payment fails on a missing trustline, runpreflight against your payTo at boot. It returns coded findings for the problems that stop a payment landing. See Preflight and testing.
Next steps
Charge for an MCP tool
List an MCP tool as a first-class Bazaar resource with describeTool.
Preflight and testing
Catch a missing trustline or bad payTo before it costs a buyer a failed payment.
How search ranks
See why the description is the product and how BM25 plus embeddings rank it.
Bazaar trust model
Understand settlement-gated ownership and why the catalog resists spam.
When it fails
A rejected listing tells you why. The rejections you are most likely to see arebazaar_stellar_fees_not_sponsored (your exact listing must carry extra.areFeesSponsored: true) and bazaar_info_schema_validation_failed (your example values do not match your declared parameters). Every code and its reason is in Errors.