402Signal
OfficialThis server lets agents discover, validate, and paid-check paid API endpoints before paying, with signed evidence and safe billing.
route / check: paid preflight check ($0.003 USDC, success-only) that probes candidates by need or URL, applies hard/soft filters (networks, max price, latency, reputation, invocability, transparency, route binding), returns a live winner with
selected_payment, billing/settlement state, typed miss reasons, and optional Ed25519-signed route-binding receipt with transparency log proof.preview: free catalog discovery by capability, no seller contact or payment; shows claimed listings and prior observations.
validate: free readiness check for one exact already-listed seller URL; compares claimed vs observed payment and readiness flags.
Billing safety: completed misses are free;
settlement_statedistinguishes settled/not_attempted/rejected/unknown, andunknownmeans never reuse the authorization.Evidence and trust: supports proof-carrying receipts, pinned log-key verification, transparency anchoring, and treats
route_binding_unavailableas an expected policy result, not a crash.Operational extras: trial check credits, admission keys (
GET /keys/usage), signed change alerts viaPOST /alerts, and offline receipt verification.
Supports Algorand as an x402 payment rail, allowing USDC payments to be verified and settled via the GoPlausible facilitator.
Integrates with Coinbase CDP to verify and settle Base USDC x402 payments and to discover x402-enabled resources.
Supports Solana as an x402 payment rail, allowing USDC payments to be verified and settled via the PayAI facilitator.
402Signal
Signed proof of what your agent was offered before it paid. 402Signal checks supported seller offers against buyer rules. On supported bound profiles, the local guard verifies signed evidence before your wallet signs; generic MPP offer observation does not itself provide a signed execution binding. Your application keeps its wallet, signing authority and final payment decision.
A qualifying check costs $0.003 USDC, paid over x402 with the same wallet. Completed normal misses are not settled: a check that finds no qualifying offer is free. Opening a hosted session costs $0.005 and lets you reuse one observation for 20 hops or 10 minutes. Seller payment, channel funding and network costs are separate, and a check is not a guarantee of delivery or output quality. Platform plans are quoted monthly on agreed receipt volume, workloads, capacity and support, with supported integration help and observation-triggered signed alerts. Start with a scoped evaluation. The quote states whether checking fees are included or separate. Private evidence stays in customer-owned storage; hosted retention is not included by default. See pricing.
Website · Try a sample check · Developer guides · Trust · OpenAPI · MCP · Changelog · Security policy
The service is also listed in third-party catalogues such as PayAPI Market (https://payapi.market/mcp); agents still pay https://402signal.com/route directly, and a listing is not an endorsement.
Three doors
You are | Start here | You get |
A buyer or a platform embedding payments | Checks in your configured payment path; signed evidence on supported bound profiles; alerts when a new observation detects a seller change | |
A seller | Your listing as buyers see it, a readiness badge, and the same public numbers as everyone else | |
An auditor or compliance reviewer | The receipt format, the public log, the anchor, and the Offer Evidence Record specification |
Related MCP server: GoldBean
Start in a minute
Official x402 client. One hook adds the check to your configured seller-payment path. It pays the fee with your own wallet, re-reads the seller's challenge, verifies the signed receipt with your pinned log key, and aborts a payment whose terms differ from what was verified:
npm install @402signal/route-guard@0.7.6 && npm audit signaturesimport { signalGuard } from "@402signal/route-guard/x402";
client.onBeforePaymentCreation(signalGuard({ fetchWithPayment, trustedLogVkey }));mppx. The same guard as an onChallenge hook: import { mppGuard } from "@402signal/route-guard/mpp".
Any language. Ask for the checking-fee terms without paying anything, then resend the identical request with the payment authorization:
curl -sS -D - https://402signal.com/route \
-H 'Content-Type: application/json' \
--data '{"need":"web search","networks":["base"],"max_price_usd":0.02,"require_route_binding":true}'The HTTP 402 lists the fee requirements on Base, Solana and Algorand. Use url for an exact endpoint or need to discover candidates; networks is a hard filter and prefer_network only ranks. Over MCP, call the check tool with the same arguments (route, its former name, is still accepted).
Python. pip install 402signal gives you the unpaid challenge, the paid check, read-only recovery and an offline receipt verifier (signal402.verify.verify_route_receipt).
No wallet yet? Run a sample check in the browser against a listed endpoint, ask for free check credits at ross@402signal.com (listed endpoints only), or run the offline checks with Node.js 22 or newer:
node integration/buyer-checks/run.mjsThe client and guard are published on npm with a provenance attestation and as GitHub release archives with checksums; from a reviewed checkout node scripts/install_route_guard.mjs downloads, verifies and installs the current release.
What a check returns
Result | Meaning |
HTTP 402 before authorization | Checking-fee requirements; nothing has been checked yet |
HTTP 200, | A qualifying offer, |
HTTP 200, | A completed miss with a typed |
HTTP 503, | No probed candidate could be bound; a completed answer, not an outage. The reference wrap |
HTTP 503, other | Inspect |
HTTP 409, | The same authorization was already final; the state and billing are disclosed, the private output is not |
Read live, payable, selected_payment and billing together. A settled fee is not reversed if the seller's offer later changes.
Keys, credits and alerts
Check credits (
X-402Signal-Trial): operator-issued, listed endpoints only, for evaluation without a funded wallet.Admission keys (
X-402Signal-Key): agreed ingress and capacity for platforms; never a wallet key.GET /keys/usageanswers only for the credentials you present: remaining credits, ceiling, expiry, or the key's recognized capacity.Change alerts: with a key,
POST /alertssubscribes a public HTTPS webhook to up to 20 seller hosts and delivers signedprice_changed,recipient_changedandliveness_changedevents drawn from the same public observations the endpoint pages count. Guide: docs/customer/alerts.md.
Evidence
Every qualifying check with require_route_binding returns an Ed25519-signed receipt bound to the exact URL, method, body hash and the seller's current x402 envelope, with an inclusion proof in an append-only log whose checkpoints are anchored on Algorand MainNet with a Falcon-1024 signature. Clients that need later verification must securely retain the complete paid /route response, including pq_trust.transparency.receipt and pq_trust.transparency.reveal, together with the original request. Private replay outcomes are short-term recovery, not long-term evidence storage. The reveal contains private request and decision evidence; do not put it in public logs.
The record format is documented as the Offer Evidence Record, version 1, with a draft x402 extension proposal. Verify a saved record with verifyReceipt from the guard, with the Python package, or in the browser at 402signal.com/verify; inspect the public log at 402signal.com/transparency.
What is in this repository
Path | Contents |
| The hosted service: check pipeline, replay authority, keys and alerts, MCP server, transparency log |
| Zero-dependency Node client and offline verifier, plus the |
| The |
| Reference buyer, MPP clients, offline buyer checks, MCP interoperability tests and the controlled lab |
| Contracts, the evidence-record specification, operating procedures and the documentation index |
| Database migrations, load test, report and release tooling |
Develop
Python 3.12.14 and Node 24, matching CI. Fixture mode keeps every catalog and seller response synthetic; no test needs a wallet, a facilitator or the network.
python3 -m pip install --require-hashes -r requirements.txt
LIVE402_FIXTURE=1 PYTHONPATH=. python3 -m live402 # http://127.0.0.1:8081
LIVE402_FIXTURE=1 PYTHONPATH=. python3 -m unittest discover -s tests
npm --prefix sdk/route-guard testLOCAL_FREE=1 skips the paywall for local development and must never be set in production. See CONTRIBUTING.md for branches, reviews and the release train, and the documentation index for the replay authority, readiness, backups and scaling plans. Historical TestNet broadcasting is a 402signal (router) env capability: a security review must approve before anyone sets it to 1. Signer never reads BROADCAST, and the flag does not enable MainNet anchoring, which has its own reviewed runbook.
Contact
MIT license · Security reports · ross@402signal.com · @402Signal
Available Tools
3 toolscheckA
Runs the paid pre-flight check on a live paid API endpoint: probes one exact HTTPS url, or the candidates discovered for a need, applies the buyer's price, network and readiness rules, and returns the selected offer with signed evidence of what the seller quoted (price, recipient, asset, network, expiry) before the agent pays the seller. Does not buy the seller's service, hold keys or pay anything for the agent; the agent keeps its wallet and pays the seller separately.
Use preview to discover candidates without paying, validate for a free readiness check of one listed URL, and check when a fresh live observation or a signed receipt is needed before a seller payment. Never call check to pay a seller. After billing.settlement_state=unknown, stop and reconcile; never create another authorization. route is the former name of this tool and is still accepted.
Cost and outcomes: the first unsigned call answers HTTP 402 with the $0.003 USDC checking-fee terms (Base, Solana or Algorand), which an x402-capable HTTP client pays. The fee settles only when a qualifying live offer is found; a completed miss (HTTP 200, live=false, typed miss_reason) is free; a settled fee is not reversed if the offer later changes. HTTP 503 with binding_error=route_binding_unavailable means the seller answered but no probed candidate could be bound to a signed receipt: a completed unpaid answer, not an outage (the reference wrapExactAuthorize reports state=binding_unavailable with keep_calling_route true).
Parameter interactions: need or url is required; with both, url is probed directly and no discovery runs. policy is plain English compiled into the structured fields; an explicit structured field wins over the compiled value, and phrases that do not compile are echoed in unresolved_constraints, never guessed. networks is a hard allowlist judged on the current 402; prefer_network only orders results and never filters. Three independent price bounds: max_price_usd (seller price in USD), max_amount_atomic (atomic units of the seller's asset) and max_total_cost_usd (seller price plus known fees); every bound fails closed when its value is unknown. require_route_binding=true implies require_transparency and may select the next bindable candidate. Defaults: objective best, search_depth standard (up to 7 probes; thorough up to 15; hard ceiling 20), accept_payTo_change false, require_route_binding false. Guide: https://402signal.com/developers#route-binding
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional https URL to probe instead of discovery. need or url (or both) is required. | |
| need | No | What the caller wants routed (plain English). | |
| policy | No | Natural-language constraints compiled into structured values. Unresolved phrases are returned, never guessed. | |
| networks | No | Hard policy lock. Restricts discovery and selection to this set. A HTTP 200 winner must have selected_payment.network in this set from the CURRENT observed 402, never a catalog claim. Unlike prefer_network, this is not a ranking preference. | |
| objective | No | Best-of-N among currently probed eligible candidates, not every discovered endpoint. cheapest, fastest, and most_reliable rank that probed survivor set. fastest is this-request probe RTT, not settlement latency. fastest_settlement is a separate settlement/finality objective. lowest_total_cost fails closed when a fee is unknown. | |
| search_depth | No | standard: first 3 then expand 2-4 (typical cap 7). thorough may expand further. Hard server ceiling is 20. | |
| max_price_usd | No | Drop live hits whose known normalized USD exceeds this bound. Unknown USD fails closed. | |
| max_latency_ms | No | Compatibility alias for max_probe_latency_ms (this request's probe RTT). Unknown latency fails closed. | |
| prefer_network | No | Weak ranking preference only. Ranks this seller network first but still searches and selects across all supported networks. Not a filter. Use networks for a hard policy lock. Observed networks: base, solana, algorand and the EVM chains polygon, arbitrum, monad, worldchain, xlayer, bnb, hyperevm, ethereum, optimism, avalanche, tempo, sei, celo, robinhood (CAIP-2 ids such as eip155:137 are accepted); the checking fee itself is paid on base, solana or algorand. | |
| min_observations | No | Require history n_7d at least this large. Unknown or smaller fails closed. | |
| max_amount_atomic | No | Drop live hits whose known atomic amount exceeds this bound. Unknown or cross-asset amount fails closed. | |
| require_invocable | No | If true, drop live hits without an input schema. An explicit empty-object schema (type object, no properties or required fields) advertises no required inputs and counts as present. A bazaar HTTP GET with empty queryParams and no required body is the same signal. It does not guarantee the seller call succeeds. Absent or refused schema is not invocable. | |
| max_total_cost_usd | No | Merchant price plus known fees. Unknown fee fails closed. | |
| accept_payTo_change | No | If true, allow selecting a destination whose payTo just changed for the first time. Default false: the first unexpected payTo change is not selectable; a second later independent observation of the same destination can establish it. | |
| max_probe_latency_ms | No | Drop live hits whose known probe RTT exceeds this bound. Not historical service/p50 latency. | |
| min_observed_success | No | Require observed success_7d when n_7d >= 3. Unknown fails closed. | |
| min_reputation_score | No | Require V1 reputation_score. Unknown fails closed. Never guessed from vague NL. | |
| require_transparency | No | If true, a settled /route winner fails when a signed checkpoint receipt cannot be produced. This requires delivery of verifiable evidence on HTTP 200, not server-side recovery. To verify the routing decision later, securely retain the complete paid /route response, especially pq_trust.transparency.receipt and pq_trust.transparency.reveal. Private replay outcomes support bounded recovery of the original response; they are not long-term evidence storage. Keep your own copy. Modified evidence fails verification against the public log. Default false (SEC-ROUTER-004 / A-14): a settled winner does not require a durable signed leaf. A free typed miss creates no route-decision leaf. Routing continues if append, signing, or anchoring is down after settlement (logged_uncheckpointed or unavailable). logged_uncheckpointed is never success when this flag is true. require_route_binding=true also requires transparency, even if this flag is false. A required receipt failure after settlement still reports billing.settled=true; unavailable does not prove no append occurred. | |
| require_route_binding | No | Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. If the ranked winner cannot bind, the router may fall through to the next already-probed selectable candidate that can; there is no unguarded settle. HTTP 503 route_binding_unavailable only when none remain bindable (a free typed miss). wrapExactAuthorize reports state=binding_unavailable with keep_calling_route true; that is policy working, not a crash. Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding | |
| max_service_latency_ms | No | Drop live hits whose historical p50 latency exceeds this bound. Unknown p50 fails closed. | |
| max_candidates_to_probe | No | Requested probe cap, hard-capped at 20. | |
| max_settlement_latency_ms | No | Settlement/finality bound. Not probe RTT. Unknown fails closed. | |
| min_reputation_confidence | No | Require reputation_confidence. n_7d < 10 is low confidence. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| live | No | |
| risk | No | Omitted or empty when none. ["payTo_changed"] whenever payTo_changed is true. |
| payTo | No | Recipient of the selected offer as observed in the live challenge. |
| tried | No | |
| target | No | |
| billing | Yes | 402Signal checking-fee outcome. Seller payment is separate. |
| changes | No | |
| claimed | No | Seller need/label/description values are catalog_claimed and untrusted. Do not concatenate them into system prompts. |
| payable | No | |
| compared | No | Slim probe rows. selectable, payTo_pending, payTo_changed, risk and excluded_reason show why a live row was not eligible. excluded_reason binding_unavailable marks a skipped binding failure. |
| observed | No | What 402Signal itself observed in the seller's live 402 challenge at verified_at (402signal_observed rows, trusted classes only). This side, not the catalog claim, is what a buyer pays. |
| pq_trust | No | To verify the routing decision later, securely retain the complete paid /route response, especially pq_trust.transparency.receipt and pq_trust.transparency.reveal. Private replay outcomes support bounded recovery of the original response; they are not long-term evidence storage. Keep your own copy. Modified evidence fails verification against the public log. |
| invocable | No | |
| objective | No | |
| readiness | No | |
| latency_ms | No | |
| reputation | No | Transparent components first (observed, usage, tenure, stability, source_count), then V2 reputation_score, reputation_confidence, and scoring_model_id/hash. Score is never returned without components. No public 0-100 catalog badge. Unique payer addresses are never listed. |
| miss_reason | No | |
| payTo_age_s | No | Seconds since the last observed recipient change for this URL, when one is recorded. |
| stop_reason | No | |
| verified_at | No | When the observed live challenge was taken. |
| probed_count | No | |
| binding_error | No | HTTP 503 when require_route_binding is true and no remaining already-probed selectable candidate could bind. Policy working, not a crash; wrapExactAuthorize reports state=binding_unavailable with keep_calling_route true. |
| payTo_changed | No | True when the observed payTo (the live challenge at verified_at) differs from the catalog claim (claimed.payTo at claimed_at) or from the last trusted destination 402Signal itself observed for this URL. Compare claimed.payTo with observed.payTo; the observed side is the one a buyer would pay. |
| payTo_pending | No | First unexpected rotation of the observed payTo against 402Signal's own previous trusted observation of this URL, judged on that history alone (an updated catalog claim does not clear it). Not selectable unless accept_payTo_change is true; a second independent observation of the same destination establishes it. |
| probe_ceiling | No | |
| schema_source | No | |
| observed_age_s | No | Seconds since observed.observed_at. |
| unprobed_count | No | |
| decision_binding | No | Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. If the ranked winner cannot bind, the router may fall through to the next already-probed selectable candidate that can; there is no unguarded settle. HTTP 503 route_binding_unavailable only when none remain bindable (a free typed miss). wrapExactAuthorize reports state=binding_unavailable with keep_calling_route true; that is policy working, not a crash. Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding |
| discovered_count | No | |
| selected_payment | No | |
| candidates_probed | No | |
| discovery_matches | No | |
| unmet_constraints | No | |
| challenge_observed | No | |
| applied_constraints | No | |
| claimed_payTo_match | No | Whether observed.payTo equals claimed.payTo, compared per rail (case-insensitive on EVM). False on a mismatch; null when either side is unknown. Independent of payTo_pending, which judges against 402Signal's own observation history. |
| evaluation_complete | No | |
| candidates_considered | No | |
| candidates_discovered | No | |
| probe_budget_exhausted | No | |
| unresolved_constraints | No | |
| interpreted_constraints | No | |
| candidate_evaluation_complete | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly=false, destructive=false, openWorld=true, idempotent=false); the description adds the economics and failure semantics an agent cannot infer: the HTTP 402 / $0.003 USDC fee flow, fee settles only on a qualifying live offer, a completed miss is free, settled fees are not reversed, and 503 binding_error=route_binding_unavailable is a completed unpaid answer rather than an outage. This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then cost/outcomes, then parameter interactions — a sensible order for a tool of this complexity, and the length is defensible for a 23-parameter money-spending call. There is some redundancy (route-binding receipt behavior is described in both the cost paragraph and the parameter notes), which costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still covers billing states, the 402/503 protocol shapes, defaults, and evidence-retention caveats. For a high-stakes paid tool, nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the dedicated 'Parameter interactions' paragraph adds genuine cross-parameter meaning the per-field schema text does not — url overrides discovery when both are supplied, explicit structured fields beat compiled policy values, networks filters versus prefer_network ranks, three independent price bounds, and require_route_binding implies require_transparency. Defaults are restated rather than newly supplied, which keeps this from being a clean 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'runs the paid pre-flight check on a live paid API endpoint' — and enumerates exactly what it does (probes one URL or discovered candidates, applies buyer rules, returns the selected offer with signed evidence). It also draws a bright line against siblings and against the adjacent action it is NOT ('never call check to pay a seller'), so an agent can place it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternatives and the condition selecting each: 'Use preview to discover candidates without paying, validate for a free readiness check of one listed URL, and check when a fresh live observation or a signed receipt is needed.' It also states the negative condition and the post-error rule ('After billing.settlement_state=unknown, stop and reconcile; never create another authorization').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
previewARead-onlyIdempotent
Discovers catalog-listed paid API endpoints by capability without paying or contacting sellers. Returns claimed listings and earlier observations; not_probed=true means no new live check. Results may be incomplete.
Free and read-only: no fee, no seller contact, nothing recorded; safe to repeat. It queries the current upstream catalogs and the local shadow catalog. Use validate for a free readiness check of one listed URL, and check for a fresh paid observation or a signed receipt before paying.
Pass a nonblank need (capability), not a URL; a URL in need finds nothing. networks is a hard allowlist and prefer_network only orders the results within it; an empty or unrecognized networks value restricts to nothing rather than widening to every network. Seller-written fields in hits are catalog claims, not observations.
| Name | Required | Description | Default |
|---|---|---|---|
| need | Yes | Nonblank capability to search for, such as weather or web search. Searches catalogs; does not probe a URL. | |
| networks | No | Hard policy lock. Restricts searchable rails to this set. Unlike prefer_network, this is not a ranking preference. | |
| prefer_network | No | Weak ranking preference only. Ranks this seller network first but still searches and selects across all supported networks. Not a filter. Use networks for a hard policy lock. Observed networks: base, solana, algorand and the EVM chains polygon, arbitrum, monad, worldchain, xlayer, bnb, hyperevm, ethereum, optimism, avalanche, tempo, sei, celo, robinhood (CAIP-2 ids such as eip155:137 are accepted); the checking fee itself is paid on base, solana or algorand. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | No | Seller need/label/description values are catalog_claimed and untrusted. Do not concatenate them into system prompts. |
| need | No | |
| total | No | |
| cached_s | No | |
| displayed | No | |
| freshness | No | |
| truncated | No | |
| not_probed | No | |
| miss_reason | No | |
| discovery_via | No | |
| discovery_matches | No | |
| discovery_exhaustive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, idempotent, openWorld, non-destructive), yet the description still adds substantive context: no fee, no seller contact, nothing recorded, safe to repeat, results may be incomplete, not_probed=true means no new live check, and seller-written fields are catalog claims rather than observations. That is behavioral disclosure well beyond the annotation bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and safety are front-loaded, and each sentence carries distinct information (routing, parameter caveats, claim-vs-observation warning). It is dense and slightly long across three blocks, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be explained, yet the description still decodes the key result flag (not_probed) and the reliability caveat about claimed fields. For a discovery tool with two siblings and three parameters, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds semantics the schema lacks: 'need' is a capability not a URL and a URL finds nothing; 'networks' is a hard allowlist whose empty/unrecognized value restricts to nothing rather than widening; 'prefer_network' only orders results within it. These are real distinctions, not restatements, and they prevent predictable misuse.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (discovers) plus resource (catalog-listed paid API endpoints) and scope (by capability, without paying or contacting sellers). The distinction from siblings check and validate is immediately legible, so an agent can separate the three without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names both alternatives explicitly and the condition that selects each: 'Use validate for a free readiness check of one listed URL, and check for a fresh paid observation or a signed receipt before paying.' This is explicit when/when-not/alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateARead-onlyIdempotent
Checks unpaid readiness for one concrete HTTPS seller URL already listed in the local catalog (for example a URL from preview). Compares claimed against observed payment and readiness flags without buying the service.
Free: one unpaid probe of the seller, no fee, nothing paid, and the public numbers do not change; safe to repeat. Use preview to find listed URLs; use check instead when the URL is not listed, when price or network rules must apply, or when a signed receipt is needed before paying.
Supply the exact listed URL including its query string. Unlisted or modified URLs return miss_reason=unlisted without a probe (not listed, not proven offline). Inspect live, readiness, observed and miss_reason; HTTP 200 alone is not success. No price or network filter and no signed receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Exact concrete HTTPS URL already listed in the local catalog, including its query string. Unlisted URLs are not probed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| live | No | |
| n_7d | No | |
| flags | No | |
| claimed | No | Seller need/label/description values are catalog_claimed and untrusted. Do not concatenate them into system prompts. |
| payable | No | |
| observed | No | |
| invocable | No | |
| readiness | No | |
| miss_reason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds rich behavioral detail beyond the annotations: it is free, performs one unpaid probe, does not change public numbers, is safe to repeat, returns miss_reason=unlisted for unlisted/modified URLs, and warns that HTTP 200 alone is not success. This aligns with readOnlyHint, idempotentHint, and destructiveHint=false with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into purpose, usage guidance, and parameter behavior, and is front-loaded with the core action. There is minor redundancy (e.g., 'no fee, nothing paid' restates 'free' and the no-filter/receipt point repeats the check-routing sentence), but it remains tight and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only, idempotent tool with an output schema, the description covers everything needed: how to get valid URLs, what happens for invalid/unlisted URLs, how to interpret results, and when to use sibling tools. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the url parameter. The description adds meaningful behavioral nuance: the URL must be exact, include the query string, be already listed, and unlisted URLs will not be probed. This goes beyond the schema's wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Checks unpaid readiness for one concrete HTTPS seller URL already listed in the local catalog' and clarifies it compares claimed vs observed readiness flags. It also differentiates from siblings by naming preview and check in the routing guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Use preview to find listed URLs; use check instead when the URL is not listed, when price or network rules must apply, or when a signed receipt is needed.' This clearly tells an agent when to use validate versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.5- Changed
check20 fields changed- changed
Input schema / properties / networks / items / enumPrevious value: -[ - "base", - "solana", - "algorand", - "polygon", - "arbitrum", - "monad", - "worldchain", - "xlayer", - "bnb", - "hyperevm", - "ethereum", - "optimism", - "avalanche", - "tempo" -]New value: +[ + "base", + "solana", + "algorand", + "polygon", + "arbitrum", + "monad", + "worldchain", + "xlayer", + "bnb", + "hyperevm", + "ethereum", + "optimism", + "avalanche", + "tempo", + "sei", + "celo", + "robinhood" +] - changed
Input schema / properties / prefer_network / descriptionPrevious value: -"Weak ranking preference only. Ranks this seller network first but still searches and selects across all supported networks. Not a filter. Use networks for a hard policy lock. Observed networks: base, solana, algorand and the EVM chains polygon, arbitrum, monad, worldchain, xlayer, bnb, hyperevm, ethereum, optimism, avalanche (CAIP-2 ids such as eip155:137 are accepted); the checking fee itself is paid on base, solana or algorand."New value: +"Weak ranking preference only. Ranks this seller network first but still searches and selects across all supported networks. Not a filter. Use networks for a hard policy lock. Observed networks: base, solana, algorand and the EVM chains polygon, arbitrum, monad, worldchain, xlayer, bnb, hyperevm, ethereum, optimism, avalanche, tempo, sei, celo, robinhood (CAIP-2 ids such as eip155:137 are accepted); the checking fee itself is paid on base, solana or algorand." - changed
Input schema / properties / prefer_network / enumPrevious value: -[ - "base", - "solana", - "algorand", - "polygon", - "arbitrum", - "monad", - "worldchain", - "xlayer", - "bnb", - "hyperevm", - "ethereum", - "optimism", - "avalanche", - "tempo" -]New value: +[ + "base", + "solana", + "algorand", + "polygon", + "arbitrum", + "monad", + "worldchain", + "xlayer", + "bnb", + "hyperevm", + "ethereum", + "optimism", + "avalanche", + "tempo", + "sei", + "celo", + "robinhood" +] - added
Output schema / properties / claimed / properties / amount / descriptionAdded value: +"The price the catalog listing claimed, as of claimed_at." - added
Output schema / properties / claimed / properties / claimed_atAdded value: +{ + "description": "When the discovery feed last presented these claimed values for this URL.", + "type": [ + "string", + "integer", + "null" + ] +} - added
Output schema / properties / claimed / properties / facilitatorAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / claimed / properties / payTo / descriptionAdded value: +"The recipient the catalog listing claimed, as of claimed_at. Compare with observed.payTo." - added
Output schema / properties / claimed_payTo_matchAdded value: +{ + "description": "Whether observed.payTo equals claimed.payTo, compared per rail (case-insensitive on EVM). False on a mismatch; null when either side is unknown. Independent of payTo_pending, which judges against 402Signal's own observation history.", + "type": [ + "boolean", + "null" + ] +} - changed
Output schema / properties / miss_reason / enumPrevious value: -[ - "no_candidates", - "no_402_envelope", - "no_payto", - "reachable_200", - "probe_timeout", - "quote_expired", - "invalid_need", - "upstream_5xx", - "ssrf", - "unlisted", - "no_input_schema", - "constraints_unmet", - "probe_budget_exhausted", - "probe_limit_reached", - "unsafe_to_probe", - "settlement_unknown", - "authorization_used", - "probe_capacity", - "window_spent", - "fingerprint_miss", - "scheme_mismatch", - "network_mismatch", - "invalid_session_shape", - null -]New value: +[ + "no_candidates", + "no_402_envelope", + "no_payto", + "reachable_200", + "probe_timeout", + "quote_expired", + "invalid_need", + "upstream_5xx", + "ssrf", + "unlisted", + "no_input_schema", + "constraints_unmet", + "binding_unavailable", + "probe_budget_exhausted", + "probe_limit_reached", + "unsafe_to_probe", + "settlement_unknown", + "authorization_used", + "probe_capacity", + "window_spent", + "fingerprint_miss", + "scheme_mismatch", + "network_mismatch", + "invalid_session_shape", + null +] - added
Output schema / properties / observedAdded value: +{ + "description": "What 402Signal itself observed in the seller's live 402 challenge at verified_at (402signal_observed rows, trusted classes only). This side, not the catalog claim, is what a buyer pays.", + "properties": { + "amount": { + "description": "Price in the observed challenge at verified_at.", + "type": [ + "string", + "null" + ] + }, + "http_status": { + "type": [ + "integer", + "null" + ] + }, + "invocable": { + "type": [ + "boolean", + "integer", + "null" + ] + }, + "latency_ms": { + "type": [ + "integer", + "null" + ] + }, + "observed_at": { + "description": "When that observation was made.", + "type": [ + "string", + "integer", + "null" + ] + }, + "payTo": { + "description": "Recipient in the observed challenge at verified_at.", + "type": [ + "string", + "null" + ] + }, + "payable": { + "type": [ + "boolean", + "integer", + "null" + ] + }, + "schema_present": { + "type": [ + "boolean", + "integer", + "null" + ] + } + }, + "type": "object" +} - added
Output schema / properties / observed_age_sAdded value: +{ + "description": "Seconds since observed.observed_at.", + "type": [ + "integer", + "null" + ] +} - added
Output schema / properties / payToAdded value: +{ + "description": "Recipient of the selected offer as observed in the live challenge.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / payTo_age_sAdded value: +{ + "description": "Seconds since the last observed recipient change for this URL, when one is recorded.", + "type": [ + "integer", + "null" + ] +} - added
Output schema / properties / payTo_changedAdded value: +{ + "description": "True when the observed payTo (the live challenge at verified_at) differs from the catalog claim (claimed.payTo at claimed_at) or from the last trusted destination 402Signal itself observed for this URL. Compare claimed.payTo with observed.payTo; the observed side is the one a buyer would pay.", + "type": "boolean" +} - added
Output schema / properties / payTo_pendingAdded value: +{ + "description": "First unexpected rotation of the observed payTo against 402Signal's own previous trusted observation of this URL, judged on that history alone (an updated catalog claim does not clear it). Not selectable unless accept_payTo_change is true; a second independent observation of the same destination establishes it.", + "type": "boolean" +} - added
Output schema / properties / readinessAdded value: +{ + "enum": [ + "discovered", + "payable", + "invocable", + "recently_verified" + ], + "type": "string" +} - added
Output schema / properties / reputation / descriptionAdded value: +"Transparent components first (observed, usage, tenure, stability, source_count), then V2 reputation_score, reputation_confidence, and scoring_model_id/hash. Score is never returned without components. No public 0-100 catalog badge. Unique payer addresses are never listed." - added
Output schema / properties / reputation / propertiesAdded value: +{ + "stability": { + "description": "Observed changes to this URL's terms (402signal_observed, not catalog claims): a change is a live challenge whose recipient, price, schema or rail differed from the previous trusted observation of the same URL.", + "properties": { + "payTo_changes": { + "properties": { + "changed_at": { + "description": "RFC3339 time of the last observed change, or null.", + "type": [ + "string", + "null" + ] + }, + "count": { + "description": "Observed changes in the window; null when unknown.", + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" + }, + "price_changes": { + "properties": { + "changed_at": { + "description": "RFC3339 time of the last observed change, or null.", + "type": [ + "string", + "null" + ] + }, + "count": { + "description": "Observed changes in the window; null when unknown.", + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" + }, + "rail_changes": { + "properties": { + "changed_at": { + "description": "RFC3339 time of the last observed change, or null.", + "type": [ + "string", + "null" + ] + }, + "count": { + "description": "Observed changes in the window; null when unknown.", + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" + }, + "schema_changes": { + "properties": { + "changed_at": { + "description": "RFC3339 time of the last observed change, or null.", + "type": [ + "string", + "null" + ] + }, + "count": { + "description": "Observed changes in the window; null when unknown.", + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" + } + }, + "type": "object" + } +} - added
Output schema / properties / riskAdded value: +{ + "description": "Omitted or empty when none. [\"payTo_changed\"] whenever payTo_changed is true.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / verified_atAdded value: +{ + "description": "When the observed live challenge was taken.", + "type": [ + "string", + "null" + ] +}
- Changed
preview4 fields changed- changed
Input schema / properties / networks / items / enumPrevious value: -[ - "base", - "solana", - "algorand", - "polygon", - "arbitrum", - "monad", - "worldchain", - "xlayer", - "bnb", - "hyperevm", - "ethereum", - "optimism", - "avalanche", - "tempo" -]New value: +[ + "base", + "solana", + "algorand", + "polygon", + "arbitrum", + "monad", + "worldchain", + "xlayer", + "bnb", + "hyperevm", + "ethereum", + "optimism", + "avalanche", + "tempo", + "sei", + "celo", + "robinhood" +] - changed
Input schema / properties / prefer_network / descriptionPrevious value: -"Weak ranking preference only. Ranks this seller network first but still searches and selects across all supported networks. Not a filter. Use networks for a hard policy lock. Observed networks: base, solana, algorand and the EVM chains polygon, arbitrum, monad, worldchain, xlayer, bnb, hyperevm, ethereum, optimism, avalanche (CAIP-2 ids such as eip155:137 are accepted); the checking fee itself is paid on base, solana or algorand."New value: +"Weak ranking preference only. Ranks this seller network first but still searches and selects across all supported networks. Not a filter. Use networks for a hard policy lock. Observed networks: base, solana, algorand and the EVM chains polygon, arbitrum, monad, worldchain, xlayer, bnb, hyperevm, ethereum, optimism, avalanche, tempo, sei, celo, robinhood (CAIP-2 ids such as eip155:137 are accepted); the checking fee itself is paid on base, solana or algorand." - changed
Input schema / properties / prefer_network / enumPrevious value: -[ - "base", - "solana", - "algorand", - "polygon", - "arbitrum", - "monad", - "worldchain", - "xlayer", - "bnb", - "hyperevm", - "ethereum", - "optimism", - "avalanche", - "tempo" -]New value: +[ + "base", + "solana", + "algorand", + "polygon", + "arbitrum", + "monad", + "worldchain", + "xlayer", + "bnb", + "hyperevm", + "ethereum", + "optimism", + "avalanche", + "tempo", + "sei", + "celo", + "robinhood" +] - changed
Output schema / properties / miss_reason / enumPrevious value: -[ - "no_candidates", - "no_402_envelope", - "no_payto", - "reachable_200", - "probe_timeout", - "quote_expired", - "invalid_need", - "upstream_5xx", - "ssrf", - "unlisted", - "no_input_schema", - "constraints_unmet", - "probe_budget_exhausted", - "probe_limit_reached", - "unsafe_to_probe", - "settlement_unknown", - "authorization_used", - "probe_capacity", - "window_spent", - "fingerprint_miss", - "scheme_mismatch", - "network_mismatch", - "invalid_session_shape", - null -]New value: +[ + "no_candidates", + "no_402_envelope", + "no_payto", + "reachable_200", + "probe_timeout", + "quote_expired", + "invalid_need", + "upstream_5xx", + "ssrf", + "unlisted", + "no_input_schema", + "constraints_unmet", + "binding_unavailable", + "probe_budget_exhausted", + "probe_limit_reached", + "unsafe_to_probe", + "settlement_unknown", + "authorization_used", + "probe_capacity", + "window_spent", + "fingerprint_miss", + "scheme_mismatch", + "network_mismatch", + "invalid_session_shape", + null +]
- Removed
route - Changed
validate5 fields changed- added
Output schema / properties / claimed / properties / amount / descriptionAdded value: +"The price the catalog listing claimed, as of claimed_at." - added
Output schema / properties / claimed / properties / claimed_atAdded value: +{ + "description": "When the discovery feed last presented these claimed values for this URL.", + "type": [ + "string", + "integer", + "null" + ] +} - added
Output schema / properties / claimed / properties / facilitatorAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / claimed / properties / payTo / descriptionAdded value: +"The recipient the catalog listing claimed, as of claimed_at. Compare with observed.payTo." - changed
Output schema / properties / miss_reason / enumPrevious value: -[ - "no_candidates", - "no_402_envelope", - "no_payto", - "reachable_200", - "probe_timeout", - "quote_expired", - "invalid_need", - "upstream_5xx", - "ssrf", - "unlisted", - "no_input_schema", - "constraints_unmet", - "probe_budget_exhausted", - "probe_limit_reached", - "unsafe_to_probe", - "settlement_unknown", - "authorization_used", - "probe_capacity", - "window_spent", - "fingerprint_miss", - "scheme_mismatch", - "network_mismatch", - "invalid_session_shape", - null -]New value: +[ + "no_candidates", + "no_402_envelope", + "no_payto", + "reachable_200", + "probe_timeout", + "quote_expired", + "invalid_need", + "upstream_5xx", + "ssrf", + "unlisted", + "no_input_schema", + "constraints_unmet", + "binding_unavailable", + "probe_budget_exhausted", + "probe_limit_reached", + "unsafe_to_probe", + "settlement_unknown", + "authorization_used", + "probe_capacity", + "window_spent", + "fingerprint_miss", + "scheme_mismatch", + "network_mismatch", + "invalid_session_shape", + null +]
4 tool updates
v0.1.4- Added
check - Changed
preview4 fields changed- changed
Input schema / properties / networks / items / enumPrevious value: -[ - "base", - "solana", - "algorand" -]New value: +[ + "base", + "solana", + "algorand", + "polygon", + "arbitrum", + "monad", + "worldchain", + "xlayer", + "bnb", + "hyperevm", + "ethereum", + "optimism", + "avalanche", + "tempo" +] - changed
Input schema / properties / prefer_network / descriptionPrevious value: -"Weak ranking preference only. Ranks this pay-in rail first but still searches and selects across all supported rails. Not a filter. Use networks for a hard policy lock."New value: +"Weak ranking preference only. Ranks this seller network first but still searches and selects across all supported networks. Not a filter. Use networks for a hard policy lock. Observed networks: base, solana, algorand and the EVM chains polygon, arbitrum, monad, worldchain, xlayer, bnb, hyperevm, ethereum, optimism, avalanche (CAIP-2 ids such as eip155:137 are accepted); the checking fee itself is paid on base, solana or algorand." - changed
Input schema / properties / prefer_network / enumPrevious value: -[ - "base", - "solana", - "algorand" -]New value: +[ + "base", + "solana", + "algorand", + "polygon", + "arbitrum", + "monad", + "worldchain", + "xlayer", + "bnb", + "hyperevm", + "ethereum", + "optimism", + "avalanche", + "tempo" +] - changed
Output schema / properties / miss_reason / enumPrevious value: -[ - "no_candidates", - "no_402_envelope", - "no_payto", - "reachable_200", - "probe_timeout", - "quote_expired", - "invalid_need", - "upstream_5xx", - "ssrf", - "no_input_schema", - "constraints_unmet", - "probe_budget_exhausted", - "probe_limit_reached", - "unsafe_to_probe", - "settlement_unknown", - "probe_capacity", - null -]New value: +[ + "no_candidates", + "no_402_envelope", + "no_payto", + "reachable_200", + "probe_timeout", + "quote_expired", + "invalid_need", + "upstream_5xx", + "ssrf", + "unlisted", + "no_input_schema", + "constraints_unmet", + "probe_budget_exhausted", + "probe_limit_reached", + "unsafe_to_probe", + "settlement_unknown", + "authorization_used", + "probe_capacity", + "window_spent", + "fingerprint_miss", + "scheme_mismatch", + "network_mismatch", + "invalid_session_shape", + null +]
- Changed
route14 fields changed- changed
Input schema / properties / networks / items / enumPrevious value: -[ - "base", - "solana", - "algorand" -]New value: +[ + "base", + "solana", + "algorand", + "polygon", + "arbitrum", + "monad", + "worldchain", + "xlayer", + "bnb", + "hyperevm", + "ethereum", + "optimism", + "avalanche", + "tempo" +] - changed
Input schema / properties / prefer_network / descriptionPrevious value: -"Weak ranking preference only. Ranks this pay-in rail first but still searches and selects across all supported rails. Not a filter. Use networks for a hard policy lock."New value: +"Weak ranking preference only. Ranks this seller network first but still searches and selects across all supported networks. Not a filter. Use networks for a hard policy lock. Observed networks: base, solana, algorand and the EVM chains polygon, arbitrum, monad, worldchain, xlayer, bnb, hyperevm, ethereum, optimism, avalanche (CAIP-2 ids such as eip155:137 are accepted); the checking fee itself is paid on base, solana or algorand." - changed
Input schema / properties / prefer_network / enumPrevious value: -[ - "base", - "solana", - "algorand" -]New value: +[ + "base", + "solana", + "algorand", + "polygon", + "arbitrum", + "monad", + "worldchain", + "xlayer", + "bnb", + "hyperevm", + "ethereum", + "optimism", + "avalanche", + "tempo" +] - changed
Input schema / properties / require_route_binding / descriptionPrevious value: -"Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. If the ranked winner cannot bind, the router may fall through to the next already-probed selectable candidate that can; there is no unguarded settle. HTTP 503 route_binding_unavailable only when none remain bindable (a free typed miss). Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding"New value: +"Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. If the ranked winner cannot bind, the router may fall through to the next already-probed selectable candidate that can; there is no unguarded settle. HTTP 503 route_binding_unavailable only when none remain bindable (a free typed miss). wrapExactAuthorize reports state=binding_unavailable with keep_calling_route true; that is policy working, not a crash. Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding" - changed
Output schema / properties / billing / descriptionPrevious value: -"402Signal routing-fee outcome. Seller payment is separate."New value: +"402Signal checking-fee outcome. Seller payment is separate." - removed
Output schema / properties / billing / properties / amount_atomic / constRemoved value: -"3000" - added
Output schema / properties / billing / properties / amount_atomic / enumAdded value: +[ + "3000", + "5000" +] - removed
Output schema / properties / billing / properties / display_amount / constRemoved value: -"$0.003" - added
Output schema / properties / billing / properties / display_amount / enumAdded value: +[ + "$0.003", + "$0.005" +] - changed
Output schema / properties / binding_error / descriptionPrevious value: -"HTTP 503 when require_route_binding is true and no remaining already-probed selectable candidate could bind."New value: +"HTTP 503 when require_route_binding is true and no remaining already-probed selectable candidate could bind. Policy working, not a crash; wrapExactAuthorize reports state=binding_unavailable with keep_calling_route true." - changed
Output schema / properties / decision_binding / descriptionPrevious value: -"Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. If the ranked winner cannot bind, the router may fall through to the next already-probed selectable candidate that can; there is no unguarded settle. HTTP 503 route_binding_unavailable only when none remain bindable (a free typed miss). Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding"New value: +"Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. If the ranked winner cannot bind, the router may fall through to the next already-probed selectable candidate that can; there is no unguarded settle. HTTP 503 route_binding_unavailable only when none remain bindable (a free typed miss). wrapExactAuthorize reports state=binding_unavailable with keep_calling_route true; that is policy working, not a crash. Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding" - changed
Output schema / properties / miss_reason / enumPrevious value: -[ - "no_candidates", - "no_402_envelope", - "no_payto", - "reachable_200", - "probe_timeout", - "quote_expired", - "invalid_need", - "upstream_5xx", - "ssrf", - "no_input_schema", - "constraints_unmet", - "probe_budget_exhausted", - "probe_limit_reached", - "unsafe_to_probe", - "settlement_unknown", - "probe_capacity", - null -]New value: +[ + "no_candidates", + "no_402_envelope", + "no_payto", + "reachable_200", + "probe_timeout", + "quote_expired", + "invalid_need", + "upstream_5xx", + "ssrf", + "unlisted", + "no_input_schema", + "constraints_unmet", + "probe_budget_exhausted", + "probe_limit_reached", + "unsafe_to_probe", + "settlement_unknown", + "authorization_used", + "probe_capacity", + "window_spent", + "fingerprint_miss", + "scheme_mismatch", + "network_mismatch", + "invalid_session_shape", + null +] - changed
Output schema / properties / pq_trust / properties / transparency / properties / state / enumPrevious value: -[ - "logged_uncheckpointed", - "checkpoint_signed", - "authorized", - "submitted", - "confirmed", - "unavailable" -]New value: +[ + "outbox_queued", + "logged_uncheckpointed", + "checkpoint_signed", + "authorized", + "submitted", + "confirmed", + "unavailable" +] - changed
Output schema / properties / pq_trust / properties / transparency / properties / status / enumPrevious value: -[ - "pending", - "logged_uncheckpointed", - "unavailable" -]New value: +[ + "pending", + "queued", + "logged_uncheckpointed", + "unavailable" +]
- Changed
validate1 field changed- changed
Output schema / properties / miss_reason / enumPrevious value: -[ - "no_candidates", - "no_402_envelope", - "no_payto", - "reachable_200", - "probe_timeout", - "quote_expired", - "invalid_need", - "upstream_5xx", - "ssrf", - "no_input_schema", - "constraints_unmet", - "probe_budget_exhausted", - "probe_limit_reached", - "unsafe_to_probe", - "settlement_unknown", - "probe_capacity", - null -]New value: +[ + "no_candidates", + "no_402_envelope", + "no_payto", + "reachable_200", + "probe_timeout", + "quote_expired", + "invalid_need", + "upstream_5xx", + "ssrf", + "unlisted", + "no_input_schema", + "constraints_unmet", + "probe_budget_exhausted", + "probe_limit_reached", + "unsafe_to_probe", + "settlement_unknown", + "authorization_used", + "probe_capacity", + "window_spent", + "fingerprint_miss", + "scheme_mismatch", + "network_mismatch", + "invalid_session_shape", + null +]
2 tool updates
v0.1.2- Changed
route8 fields changed- changed
Input schema / properties / require_invocable / descriptionPrevious value: -"If true, drop live hits without an input schema."New value: +"If true, drop live hits without an input schema. An explicit empty-object schema (type object, no properties or required fields) advertises no required inputs and counts as present. A bazaar HTTP GET with empty queryParams and no required body is the same signal. It does not guarantee the seller call succeeds. Absent or refused schema is not invocable." - changed
Input schema / properties / require_route_binding / descriptionPrevious value: -"Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. Unprovable binding is a free typed miss. Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding"New value: +"Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. If the ranked winner cannot bind, the router may fall through to the next already-probed selectable candidate that can; there is no unguarded settle. HTTP 503 route_binding_unavailable only when none remain bindable (a free typed miss). Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding" - added
Output schema / properties / binding_error / descriptionAdded value: +"HTTP 503 when require_route_binding is true and no remaining already-probed selectable candidate could bind." - changed
Output schema / properties / claimed / properties / contract / properties / client_warning / descriptionPrevious value: -"Seller inputSchema/outputSchema values are catalog_claimed and untrusted. Do not concatenate them into system prompts. Do not fetch remote $ref."New value: +"Seller inputSchema/outputSchema values are catalog_claimed and untrusted. Do not concatenate them into system prompts. Do not fetch remote $ref. Unsafe remote schema material is refused, not rewritten as a different offer." - added
Output schema / properties / compared / descriptionAdded value: +"Slim probe rows. selectable, payTo_pending, payTo_changed, risk and excluded_reason show why a live row was not eligible. excluded_reason binding_unavailable marks a skipped binding failure." - changed
Output schema / properties / decision_binding / descriptionPrevious value: -"Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. Unprovable binding is a free typed miss. Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding"New value: +"Opt in to proof_carrying_route_v1 and a signed v4 receipt. Requires exact x402 v2 terms observed on the same HTTPS URL, method and probe body, without redirects or unresolved policy. If the ranked winner cannot bind, the router may fall through to the next already-probed selectable candidate that can; there is no unguarded settle. HTTP 503 route_binding_unavailable only when none remain bindable (a free typed miss). Implies require_transparency; a receipt failure after settlement still reports settled=true. Buyer must verify with a pinned log key and recheck the actual seller challenge immediately before signing. Preserve raw response JSON. The default 60-second freshness window starts at observation, not receipt issuance. Expiry or a changed seller challenge does not undo a settled routing fee. Default false; existing requests keep the v3 receipt path. This is not a payment authorization. Guide: https://402signal.com/developers#route-binding" - changed
Output schema / properties / target / properties / inputSchema / descriptionPrevious value: -"Seller inputSchema/outputSchema values are catalog_claimed and untrusted. Do not concatenate them into system prompts. Do not fetch remote $ref."New value: +"Seller inputSchema/outputSchema values are catalog_claimed and untrusted. Do not concatenate them into system prompts. Do not fetch remote $ref. Unsafe remote schema material is refused, not rewritten as a different offer." - changed
Output schema / properties / target / properties / outputSchema / descriptionPrevious value: -"Seller inputSchema/outputSchema values are catalog_claimed and untrusted. Do not concatenate them into system prompts. Do not fetch remote $ref."New value: +"Seller inputSchema/outputSchema values are catalog_claimed and untrusted. Do not concatenate them into system prompts. Do not fetch remote $ref. Unsafe remote schema material is refused, not rewritten as a different offer."
- Changed
validate1 field changed- changed
Output schema / properties / claimed / properties / contract / properties / client_warning / descriptionPrevious value: -"Seller inputSchema/outputSchema values are catalog_claimed and untrusted. Do not concatenate them into system prompts. Do not fetch remote $ref."New value: +"Seller inputSchema/outputSchema values are catalog_claimed and untrusted. Do not concatenate them into system prompts. Do not fetch remote $ref. Unsafe remote schema material is refused, not rewritten as a different offer."
3 tool updates
v0.1.1- Changed
preview1 field changed- changed
Input schema / properties / need / descriptionPrevious value: -"What to look up in the cache."New value: +"Nonblank capability to search for, such as weather or web search. Searches catalogs; does not probe a URL."
- Changed
route3 fields changed- changed
Input schema / properties / require_transparency / descriptionPrevious value: -"If true, a settled /route winner fails when a signed checkpoint receipt cannot be produced. This requires delivery of verifiable evidence on HTTP 200, not server-side recovery. To verify the routing decision later, securely retain the complete paid /route response, especially pq_trust.transparency.receipt and pq_trust.transparency.reveal. Private replay outcomes can retain the reveal; they are not a recovery service. Keep your own copy. Modified evidence fails verification against the public log. Default false (SEC-ROUTER-004 / A-14): a settled winner does not require a durable signed leaf. A free typed miss creates no route-decision leaf. Routing continues if append, signing, or anchoring is down after settlement (logged_uncheckpointed or unavailable). logged_uncheckpointed is never success when this flag is true. require_route_binding=true also requires transparency, even if this flag is false. A required receipt failure after settlement still reports billing.settled=true; unavailable does not prove no append occurred."New value: +"If true, a settled /route winner fails when a signed checkpoint receipt cannot be produced. This requires delivery of verifiable evidence on HTTP 200, not server-side recovery. To verify the routing decision later, securely retain the complete paid /route response, especially pq_trust.transparency.receipt and pq_trust.transparency.reveal. Private replay outcomes support bounded recovery of the original response; they are not long-term evidence storage. Keep your own copy. Modified evidence fails verification against the public log. Default false (SEC-ROUTER-004 / A-14): a settled winner does not require a durable signed leaf. A free typed miss creates no route-decision leaf. Routing continues if append, signing, or anchoring is down after settlement (logged_uncheckpointed or unavailable). logged_uncheckpointed is never success when this flag is true. require_route_binding=true also requires transparency, even if this flag is false. A required receipt failure after settlement still reports billing.settled=true; unavailable does not prove no append occurred." - changed
Output schema / properties / pq_trust / descriptionPrevious value: -"To verify the routing decision later, securely retain the complete paid /route response, especially pq_trust.transparency.receipt and pq_trust.transparency.reveal. Private replay outcomes can retain the reveal; they are not a recovery service. Keep your own copy. Modified evidence fails verification against the public log."New value: +"To verify the routing decision later, securely retain the complete paid /route response, especially pq_trust.transparency.receipt and pq_trust.transparency.reveal. Private replay outcomes support bounded recovery of the original response; they are not long-term evidence storage. Keep your own copy. Modified evidence fails verification against the public log." - changed
Output schema / properties / pq_trust / properties / transparency / descriptionPrevious value: -"To verify the routing decision later, securely retain the complete paid /route response, especially pq_trust.transparency.receipt and pq_trust.transparency.reveal. Private replay outcomes can retain the reveal; they are not a recovery service. Keep your own copy. Modified evidence fails verification against the public log."New value: +"To verify the routing decision later, securely retain the complete paid /route response, especially pq_trust.transparency.receipt and pq_trust.transparency.reveal. Private replay outcomes support bounded recovery of the original response; they are not long-term evidence storage. Keep your own copy. Modified evidence fails verification against the public log."
- Changed
validate1 field changed- changed
Input schema / properties / url / descriptionPrevious value: -"https URL of the seller endpoint to probe."New value: +"Exact concrete HTTPS URL already listed in the local catalog, including its query string. Unlisted URLs are not probed."
3 tool updates
v0.1.0- First observed
preview - First observed
route - First observed
validate
TDQS
Scored across 3 tools
Each tool has a distinct role: preview discovers candidates without contacting sellers, validate probes a listed URL for free, and check performs a paid pre-flight with price/network rules and signed receipt. The descriptions explicitly distinguish when to use which, so misselection is unlikely.
All three names are lowercase single verbs (preview, validate, check), forming a consistent imperative convention. Although they do not follow verb_noun, the pattern is uniform and predictable.
Three tools map cleanly to the discovery → validation → paid pre-flight workflow, with no redundancy. This is a well-scoped set for the server's purpose.
The set covers the full pre-purchase path: free discovery (preview), free single-URL readiness (validate), and paid live observation/signed receipt (check). Payment and reconciliation are intentionally outside the tool boundary, so there are no dead ends within the stated purpose.
Maintenance
Related MCP Connectors
Fail-closed live-endpoint x402 router. POST /route, $0.01 USDC on Base, Solana, Algorand.
Live x402 endpoint trust/diligence check before you pay it. $0.02/call via x402.
AI-operated. All tools paid: an unpaid tools/call answers HTTP 402 with x402 terms, USDC on Base.
Pay for HTTP APIs and charge for your own: x402 micropayments in USDC on Base.
Related MCP Servers
AlicenseNot gradedqualityCmaintenancePay for any x402-gated content or API with USDC micropayments on Base. Discover payment gates, execute payments, and view transaction history.1MIT- AlicenseCqualityCmaintenancex402 Micropaid MCP Server — 120+ paid API endpoints for AI Agents. Pay per call with USDC on Base network. No signup, no API key needed.551MIT
- AlicenseAqualityBmaintenanceBefore an AI agent pays an x402 endpoint, checks whether it's safe to pay: liveness, scam/anomaly scan (payTo hijack, bait-and-switch, honeypot), and on-chain receiver verification. ~70% of x402 endpoints are dead or scams.3MIT
- FlicenseNot gradedqualityCmaintenanceProduction-grade Model Context Protocol (MCP) server delivering paywalled Web3 micro-services powered by autonomous x402 payment challenges on Base Mainnet.-