{"openapi":"3.1.0","info":{"title":"agentdata-nl","version":"0.4.0","description":"Paid data and tools for AI agents (x402 + MCP), billed per call in USDC on Base. Families: European company registers (NL, UK, FR, NO, CH, CZ, FI, PL) with insolvency checks (NL, FR), EU + UN sanctions screening, EU VAT (VIES), LEI and MiCA crypto-firm/token-registry checks; web search, news, images, places, scholar, page contents and crawling; LLM chat inference in three flat-priced tiers; crypto market intelligence and a self-guiding advice chain; x402 ecosystem monitoring (preflight, service and network reports, demand data). Call a paid endpoint without payment to receive HTTP 402 with exact payment requirements; repeat the request with a PAYMENT-SIGNATURE header. Every successfully paid response carries the official PAYMENT-RESPONSE settlement header. All-or-nothing: you are only charged when the task fully completed.\n","contact":{"name":"agentdata-nl","email":"sander.van.aard@gmail.com","url":"https://agentdata-api.sander-van-aard.workers.dev"},"x-guidance":"No account, no API key, no signup. Every paid route is POST with a JSON body and is priced per call; the exact price is in `x-payment-info.price.amount` on each operation and in the HTTP 402 challenge. To call a route: POST it without payment, read the x402 v2 PaymentRequired challenge (PAYMENT-REQUIRED header and body), sign the exact amount in USDC on Base (eip155:8453), and repeat the request with a PAYMENT-SIGNATURE header. Settlement is confirmed in the PAYMENT-RESPONSE header of the successful response. Billing is all-or-nothing: if the task cannot be completed you get a 4xx/5xx and are not charged, so a failed call costs nothing and can be retried safely. Start cheap: /eu/lei ($0.005) and /eu/vat ($0.002) are good first checks before deeper company screening, and /web/contents ($0.0015) and /web/search ($0.004) are the cheapest way to read the web. Facts only, always with a source reference to the official register — no risk scores and no judgments. Company data only; queries that identify private individuals are rejected. The same tools are available over MCP at POST /mcp, with payment in _meta[\"x402/payment\"]. Free to inspect: /.well-known/x402, /openapi.json, /llms.txt and /health.\n"},"servers":[{"url":"https://agentdata-api.sander-van-aard.workers.dev"}],"paths":{"/eu/vat":{"post":{"summary":"EU VAT number validation (VIES) — $0.002 per call","description":"Validates any EU VAT number against the European Commission's VIES service. Two modes: 'fast' (may serve a cached result, explicitly labeled with its timestamp) and 'consultation_proof' (always live, returns the official consultation number, requires requester identification). 'not_confirmed' does not imply the company is invalid; it may operate domestically only.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["vat_number"],"properties":{"vat_number":{"type":"string","description":"Country code + national VAT number, e.g. NL123456789B01"},"mode":{"type":"string","enum":["fast","consultation_proof"],"default":"fast"},"requester_vat_number":{"type":"string","description":"Required in consultation_proof mode (your own EU VAT number)"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Validated. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"object"},"checked_at":{"type":"string","format":"date-time"},"vat":{"type":"object","properties":{"vies_status":{"type":"string","enum":["confirmed","not_confirmed"]},"registered_name":{"type":["string","null"]},"registered_address":{"type":["string","null"]},"validation_type":{"type":"string","enum":["live","cached"]},"consultation_number":{"type":["string","null"]},"checked_at":{"type":"string","format":"date-time"},"note":{"type":"string"}}},"disclaimer":{"type":"string"}}}}}},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — body contains x402 accepts[] with exact requirements."},"409":{"description":"Payment proof is bound to a different request (fingerprint mismatch)."},"502":{"description":"settlement_unknown — retry with the SAME payment proof; never pay again on this error."},"503":{"description":"Source unavailable; no settlement. May include an 'alternative' route."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"protocols":[{"x402":{}}]}}},"/eu/lei":{"post":{"summary":"LEI lookup (official GLEIF register) — $0.005 per call","description":"Look up a Legal Entity Identifier by LEI code, or search by legal name with an optional 2-letter jurisdiction filter. Returns official legal name, entity status, registration status (ISSUED/LAPSED), jurisdiction, legal form and registered address, with a direct GLEIF source link per record. Legal entities only.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lei":{"type":"string","pattern":"^[A-Za-z0-9]{20}$","description":"20-character LEI code (ISO 17442); provide this or 'name'"},"name":{"type":"string","description":"Legal entity name to search for"},"jurisdiction":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter country filter","e.g. NL":null}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 v2 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"result found|not_found, records[] with lei, legal_name, entity_status, registration_status, jurisdiction, legal_form_id, address and source_reference.direct_url. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"GLEIF unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]}}},"/eu/eurc-peg":{"post":{"summary":"EURC peg monitor (ECB reference rate × on-chain price) — $0.002 per call","description":"Unique combined signal — the official ECB euro reference rate (USD/EUR) versus the live on-chain EURC/USDC price from the deepest Uniswap v3 pool on Base, returned as a deviation in basis points with both source values and timestamps. No input required.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"ecb {usd_per_eur, reference_date}, onchain {usdc_per_eurc, dex, pool, chain}, deviation_bps, interpretation note. Carries PAYMENT-RESPONSE."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"ECB or Base RPC unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"protocols":[{"x402":{}}]}}},"/web/search":{"post":{"summary":"Web search for AI agents (Google-quality, LLM-ready) — $0.004 per search","description":"Google-quality web search, structured for LLM consumption, at half the going x402 rate. Send a query and receive compact JSON: top organic results (position, title, url, snippet), the direct answer when one exists, a trimmed knowledge graph and related searches. Tune with num (1-10 results), country and language (2-letter codes). Zero results is a valid, honest answer (empty results[], still delivered).\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","minLength":1,"maxLength":400,"description":"The search query, plain text"},"num":{"type":"integer","minimum":1,"maximum":10,"default":5,"description":"Number of results to return"},"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter country code to localise results, e.g. us, nl"},"lang":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter language code, e.g. en, nl"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Search results. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","results","checked_at"],"properties":{"query":{"type":"string","description":"The search query as validated"},"results":{"type":"array","description":"Top organic results; an empty array is a valid paid answer.","items":{"type":"object","properties":{"position":{"type":"integer"},"title":{"type":"string"},"url":{"type":"string"},"snippet":{"type":"string"}}}},"answer":{"type":"string","description":"Direct answer (answer box)","only present when the search engine shows one":null},"knowledge_graph":{"type":"object","description":"Trimmed knowledge-graph panel, only present when available","properties":{"title":{"type":"string"},"type":{"type":"string"},"description":{"type":"string"},"attributes":{"type":"object","additionalProperties":{"type":"string"}}}},"related":{"type":"array","items":{"type":"string"},"description":"Related searches","only present when available":null},"checked_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (empty/too-long query, num out of 1..10, bad country/lang code); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Search source unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"protocols":[{"x402":{}}]}}},"/news/search":{"post":{"summary":"Google News search for AI agents — $0.004 per call","description":"Google News search, structured for LLM consumption, from the same Serper.dev source as /web/search. Send a query and receive compact JSON: top news results (position, title, url, snippet, publish date, source). Tune with num (1-10 results), country and language (2-letter codes). Zero results is a valid, honest answer (empty results[], still delivered).\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","minLength":1,"maxLength":400,"description":"The search query, plain text"},"num":{"type":"integer","minimum":1,"maximum":10,"default":5,"description":"Number of results to return"},"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter country code to localise results, e.g. us, nl"},"lang":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter language code, e.g. en, nl"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"News results. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","results","checked_at"],"properties":{"query":{"type":"string","description":"The search query as validated"},"results":{"type":"array","description":"Top news results; an empty array is a valid paid answer.","items":{"type":"object","properties":{"position":{"type":"integer"},"title":{"type":"string"},"url":{"type":"string"},"snippet":{"type":"string"},"date":{"type":"string","description":"Publish date/age as reported by the source, only present when available"},"source":{"type":"string","description":"Publisher name, only present when available"},"image_url":{"type":"string","description":"Article image URL, only present when available"}}}},"checked_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (empty/too-long query, num out of 1..10, bad country/lang code); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Search source unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"protocols":[{"x402":{}}]}}},"/web/images":{"post":{"summary":"Google Images search for AI agents — $0.004 per call","description":"Google Images search, structured for LLM consumption, from the same Serper.dev source as /web/search. Send a query and receive compact JSON: top image results (position, title, image url, source page link, dimensions). Tune with num (1-10 results), country and language (2-letter codes). Zero results is a valid, honest answer (empty results[], still delivered).\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","minLength":1,"maxLength":400,"description":"The search query, plain text"},"num":{"type":"integer","minimum":1,"maximum":10,"default":5,"description":"Number of results to return"},"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter country code to localise results, e.g. us, nl"},"lang":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter language code, e.g. en, nl"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Image results. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","results","checked_at"],"properties":{"query":{"type":"string","description":"The search query as validated"},"results":{"type":"array","description":"Top image results; an empty array is a valid paid answer.","items":{"type":"object","properties":{"position":{"type":"integer"},"title":{"type":"string"},"image_url":{"type":"string"},"link":{"type":"string","description":"The page hosting the image, only present when available"},"source":{"type":"string","description":"Host of the page, only present when available"},"width":{"type":"integer","description":"Image width in pixels, only present when available"},"height":{"type":"integer","description":"Image height in pixels, only present when available"}}}},"checked_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (empty/too-long query, num out of 1..10, bad country/lang code); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Search source unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"protocols":[{"x402":{}}]}}},"/web/places":{"post":{"summary":"Google Places search for AI agents — $0.004 per call","description":"Google Places search (local businesses with rating, address and phone number), structured for LLM consumption, from the same Serper.dev source as /web/search. Send a query and receive compact JSON: top places (position, title, address, coordinates, rating, rating count, category, phone, website). Tune with num (1-10 results), country and language (2-letter codes). Zero results is a valid, honest answer (empty results[], still delivered).\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","minLength":1,"maxLength":400,"description":"The search query, plain text"},"num":{"type":"integer","minimum":1,"maximum":10,"default":5,"description":"Number of results to return"},"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter country code to localise results, e.g. us, nl"},"lang":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter language code, e.g. en, nl"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Place results. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","results","checked_at"],"properties":{"query":{"type":"string","description":"The search query as validated"},"results":{"type":"array","description":"Top local-business results; an empty array is a valid paid answer.","items":{"type":"object","properties":{"position":{"type":"integer"},"title":{"type":"string"},"address":{"type":"string","description":"Only present when available"},"latitude":{"type":"number","description":"Only present when available"},"longitude":{"type":"number","description":"Only present when available"},"rating":{"type":"number","description":"Only present when available"},"rating_count":{"type":"integer","description":"Only present when available"},"category":{"type":"string","description":"Only present when available"},"phone":{"type":"string","description":"Only present when available"},"website":{"type":"string","description":"Only present when available"}}}},"checked_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (empty/too-long query, num out of 1..10, bad country/lang code); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Search source unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"protocols":[{"x402":{}}]}}},"/web/scholar":{"post":{"summary":"Google Scholar search for AI agents — $0.004 per call","description":"Google Scholar search (papers with citation counts), structured for LLM consumption, from the same Serper.dev source as /web/search. Send a query and receive compact JSON: top papers (position, title, url, publication info, snippet, year, citation count). Tune with num (1-10 results), country and language (2-letter codes). Zero results is a valid, honest answer (empty results[], still delivered).\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","minLength":1,"maxLength":400,"description":"The search query, plain text"},"num":{"type":"integer","minimum":1,"maximum":10,"default":5,"description":"Number of results to return"},"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter country code to localise results, e.g. us, nl"},"lang":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter language code, e.g. en, nl"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Scholar results. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","results","checked_at"],"properties":{"query":{"type":"string","description":"The search query as validated"},"results":{"type":"array","description":"Top paper results; an empty array is a valid paid answer.","items":{"type":"object","properties":{"position":{"type":"integer"},"title":{"type":"string"},"url":{"type":"string","description":"Only present when available"},"publication_info":{"type":"string","description":"Authors/venue/year as reported by Scholar, only present when available"},"snippet":{"type":"string","description":"Only present when available"},"year":{"type":"integer","description":"Only present when available"},"cited_by":{"type":"integer","description":"Citation count, only present when available"}}}},"checked_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (empty/too-long query, num out of 1..10, bad country/lang code); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Search source unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.004"},"protocols":[{"x402":{}}]}}},"/web/contents":{"post":{"summary":"Web page to clean LLM-ready text (markdown or plain) — $0.0015 per call","description":"Read any web page as clean, LLM-ready text — the natural companion to /web/search. The page is fetched server-side and reduced to its readable core with a streaming HTML parser: title, headings, paragraphs, lists and links, stripped of scripts, styles, navigation and other boilerplate. Choose markdown (default) or plain text and cap the size with max_chars; a truncated flag tells you when the cut hit. Unreachable targets, more than 3 redirects, non-HTML content types and blocked URLs (literal IP addresses, localhost, non-http(s) schemes) return a machine-readable 400 and are never charged.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","maxLength":2048,"description":"The http(s) URL to read. Literal IP addresses, localhost and non-http(s) schemes are rejected."},"format":{"type":"string","enum":["markdown","text"],"default":"markdown","description":"markdown keeps #-headings, [text](url) links and - lists; text is flat plain text"},"max_chars":{"type":"integer","minimum":1000,"maximum":100000,"default":20000,"description":"Maximum content length in characters; longer pages are cut and flagged truncated"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Extracted page content. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["url","final_url","title","format","content","content_chars","truncated","fetched_at"],"properties":{"url":{"type":"string","description":"The URL as requested"},"final_url":{"type":"string","description":"The URL that actually served the content, after up to 3 redirects"},"title":{"type":"string","description":"The page title; empty string when the page has none"},"format":{"type":"string","enum":["markdown","text"]},"content":{"type":"string","description":"The extracted readable content in the requested format"},"content_chars":{"type":"integer","description":"Length of content in characters"},"truncated":{"type":"boolean","description":"True when the content was cut at max_chars"},"fetched_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (invalid or blocked URL, fetch failure with the target's HTTP status, too many redirects, unsupported content type); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0015"},"protocols":[{"x402":{}}]}}},"/web/search-read":{"post":{"summary":"Search and read top results in one call — $0.006 per call","description":"Websearch and page content in one call: a Serper-backed web search plus the readable content of the top-`num` organic results, fetched and extracted with the same engine as /web/contents. A page that cannot be read (fetch failure, unsupported content type, blocked URL) is not a call failure — that result carries a read_error code instead of content, and the call still delivers and settles. Cheaper than calling /web/search and /web/contents separately.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","minLength":1,"maxLength":400,"description":"The search query, plain text"},"num":{"type":"integer","minimum":1,"maximum":5,"default":3,"description":"Number of top results to search and read"},"format":{"type":"string","enum":["markdown","text"],"default":"markdown","description":"markdown keeps #-headings, [text](url) links and - lists; text is flat plain text"},"max_chars_per_page":{"type":"integer","minimum":1000,"maximum":20000,"default":8000,"description":"Maximum content length per read page in characters"},"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter country code to localise results, e.g. us, nl"},"lang":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Optional 2-letter language code, e.g. en, nl"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Search results enriched with page content. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","results","checked_at"],"properties":{"query":{"type":"string","description":"The search query as validated"},"results":{"type":"array","description":"Top organic results, each enriched with page content where readable; an empty array is a valid paid answer.","items":{"type":"object","properties":{"position":{"type":"integer"},"title":{"type":"string"},"url":{"type":"string"},"snippet":{"type":"string"},"final_url":{"type":"string","description":"The URL that actually served the content, after redirects; absent when the page could not be read"},"page_title":{"type":"string","description":"The read page's own title; absent when the page could not be read"},"content":{"type":"string","description":"Extracted readable content in the requested format; absent when the page could not be read"},"content_chars":{"type":"integer","description":"Length of content in characters; absent when the page could not be read"},"truncated":{"type":"boolean","description":"True when content was cut at max_chars_per_page; absent when the page could not be read"},"read_error":{"type":"string","description":"Machine-readable reason this one page was not readable, e.g. fetch_failed, unsupported_content_type, url_not_allowed; absent when reading succeeded"}}}},"answer":{"type":"string","description":"Direct answer (answer box)","only present when the search engine shows one":null},"checked_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (empty/too-long query, num out of 1..5, bad format, bad max_chars_per_page, bad country/lang code); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Search source unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.006"},"protocols":[{"x402":{}}]}}},"/web/crawl":{"post":{"summary":"Crawl a site to multiple clean markdown pages — dynamic price, $0.001 per requested page (max_pages)","description":"Crawl one site in a single paid call: give a start URL and max_pages, and same-host links are followed breadth-first (up to 3 pages read in parallel per level) until max_pages pages are gathered, each reduced to clean markdown with the same extractor as /web/contents. The price is quoted up front as max_pages x $0.001 in the 402; finding fewer pages than max_pages on a small site is still a complete, fully-settled delivery. Pages that fail to fetch or read, or that redirect off-host, are skipped and listed in skipped[] — the call still settles. Only an unreadable start page returns a 400 with no charge.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","maxLength":2048,"description":"The http(s) start URL to crawl. Literal IP addresses, localhost and non-http(s) schemes are rejected."},"max_pages":{"type":"integer","minimum":2,"maximum":20,"default":5,"description":"Maximum pages to crawl breadth-first over same-host links; also sets the price (max_pages x $0.001)."},"max_chars_per_page":{"type":"integer","minimum":1000,"maximum":20000,"default":5000,"description":"Maximum content length per page in characters; longer pages are cut and flagged truncated"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with the dynamic payment requirements (amount = max_pages x 1000 micros)."}],"responses":{"200":{"description":"Crawled pages. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["start_url","pages","pages_crawled","pages_charged","skipped","crawled_at"],"properties":{"start_url":{"type":"string","description":"The start URL as requested"},"pages":{"type":"array","description":"Successfully crawled pages, in discovery order.","items":{"type":"object","properties":{"url":{"type":"string","description":"The URL as discovered/requested"},"final_url":{"type":"string","description":"The URL that actually served the content, after redirects"},"title":{"type":"string"},"content":{"type":"string","description":"Extracted readable content as markdown"},"content_chars":{"type":"integer"},"truncated":{"type":"boolean","description":"True when this page's content was cut at max_chars_per_page"}}}},"pages_crawled":{"type":"integer","description":"Number of items in pages[]; may be less than pages_charged on a small site"},"pages_charged":{"type":"integer","description":"The billed page count (= max_pages)","regardless of how many pages were actually found":null},"skipped":{"type":"array","description":"Discovered same-host links that failed to fetch/read, or redirected off-host.","items":{"type":"object","properties":{"url":{"type":"string"},"reason":{"type":"string","description":"Machine-readable reason, e.g. fetch_failed, unsupported_content_type, redirected_to_different_host"}}}},"crawled_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (invalid or blocked URL, bad max_pages/max_chars_per_page) or an unreadable start page (fetch failure, unsupported content type); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header; amount reflects max_pages."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]}}},"/llm/chat":{"post":{"summary":"LLM chat completion per call — flat tiers, fast $0.002 / smart $0.02 / reasoning $0.03","description":"LLM inference paid per call via x402 — no account, no API key, no token math. Three flat-priced tiers: fast $0.002 (DeepSeek v4 Flash), smart $0.02 (GPT-5.4 mini), reasoning $0.03 (DeepSeek v4 Pro). Send OpenAI-style chat messages and receive the assistant reply with finish_reason and token usage. Combined input is capped per tier (fast 16k chars; smart/reasoning 32k chars) and the 402 quotes the exact tier price up front. If the model or source is unavailable you receive a 503 and are never charged.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["messages"],"properties":{"model":{"type":"string","enum":["fast","smart","reasoning"],"default":"fast","description":"Price tier; sets model, price and input/output caps"},"messages":{"type":"array","minItems":1,"maxItems":40,"description":"OpenAI-style chat messages","items":{"type":"object","required":["role","content"],"properties":{"role":{"type":"string","enum":["system","user","assistant"]},"content":{"type":"string","minLength":1}}}},"max_tokens":{"type":"integer","minimum":1,"description":"Output token cap; tier maxima: fast 1024 (default 512), smart 2048 (default 1024), reasoning 4096 (default 2048, minimum 256 — thinking tokens are spent first)"},"temperature":{"type":"number","minimum":0,"maximum":2,"description":"Optional sampling temperature"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with the tier-priced payment requirements."}],"responses":{"200":{"description":"The assistant reply. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["tier","model","content","finish_reason","usage","generated_at"],"properties":{"tier":{"type":"string","enum":["fast","smart","reasoning"]},"model":{"type":"string","description":"The underlying model that answered"},"content":{"type":"string","description":"The assistant reply"},"finish_reason":{"type":"string","description":"e.g. stop, length"},"usage":{"type":"object","properties":{"prompt_tokens":{"type":"integer"},"completion_tokens":{"type":"integer"}}},"generated_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (bad tier, empty/oversized messages, max_tokens above the tier cap, bad temperature); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header; amount reflects the tier."},"503":{"description":"Model or inference source unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.002"},"protocols":[{"x402":{}}]}}},"/relay/crypto-news":{"post":{"summary":"Real-time crypto market news with sentiment analysis — $0.01 per call","description":"Real-time crypto market news with sentiment analysis and top headlines ranked by importance. No parameters needed — one paid call returns the latest market-moving stories as structured JSON, relayed live from a proven upstream x402 source. If the upstream source is unavailable you receive a 503 and are never charged.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Relayed news payload. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["source","data","relayed_at"],"properties":{"source":{"type":"string","description":"The upstream service that produced the data"},"data":{"description":"The upstream response payload","passed through unmodified":null},"relayed_at":{"type":"string","format":"date-time"}}}}}},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Upstream source unavailable or refused delivery; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/relay/edgar-filings":{"post":{"summary":"Latest SEC EDGAR filings by ticker or CIK (10-K, 10-Q, 8-K) — $0.01 per call","description":"Latest SEC EDGAR filings for any US-listed company, by stock ticker or CIK, sourced live from data.sec.gov via a proven upstream x402 source: 10-K annual reports, 10-Q quarterly reports and 8-K material events, as a parsed list with company, form type, filing date and direct document URL. Provide exactly one of 'ticker' or 'cik' plus the required 'form'. If the upstream source is unavailable you receive a 503 and are never charged.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["form"],"properties":{"ticker":{"type":"string","maxLength":10,"description":"Stock ticker, case-insensitive (e.g. AAPL). Exactly one of ticker or cik."},"cik":{"type":"string","maxLength":10,"description":"SEC CIK, 1-10 digits. Exactly one of ticker or cik."},"form":{"type":"string","enum":["10-K","10-Q","8-K"],"description":"SEC form type"},"since":{"type":"string","description":"Optional inclusive lower bound on filing date, YYYY-MM-DD"},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum filings to return"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Relayed filings payload. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["source","data","relayed_at"],"properties":{"source":{"type":"string","description":"The upstream service that produced the data"},"data":{"description":"The upstream response payload: resolved company, form, count, items[] with filing details"},"relayed_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (missing/ambiguous ticker-or-cik, invalid form/since/limit); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Upstream source unavailable or refused delivery; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/relay/reddit-search":{"post":{"summary":"Keyword-search all of Reddit or one subreddit — $0.05 per call","description":"Reddit search for AI agents — keyword-search all of Reddit, or scope to one subreddit, without login or API key. Returns matching posts with title, author, subreddit, score, comment count, permalink and timestamp, sorted by relevance, top, new, hot or comments, with an optional time window. Relayed live from a proven upstream x402 source; if the upstream source is unavailable you receive a 503 and are never charged.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["q"],"properties":{"q":{"type":"string","maxLength":400,"description":"Keyword or phrase; wrap a multi-word phrase in double quotes for exact match"},"subreddit":{"type":"string","description":"Optional — scope to this subreddit (r/ prefix optional); omit for sitewide"},"sort":{"type":"string","enum":["relevance","top","new","hot","comments"],"description":"Result ranking (default relevance)"},"time":{"type":"string","enum":["hour","day","week","month","year","all"],"description":"Time window — applies to sort=top"},"limit":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum posts to return"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Relayed search results. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["source","data","relayed_at"],"properties":{"source":{"type":"string","description":"The upstream service that produced the data"},"data":{"description":"The upstream response payload: query, count, posts[] with post details"},"relayed_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Machine-readable input error (empty/too-long q, invalid subreddit/sort/time/limit); no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"Upstream source unavailable or refused delivery; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]}}},"/crypto/verdict":{"post":{"summary":"Live crypto trading verdict for a coin (resold) — $0.03 per call","description":"Live crypto trading verdict for a coin (e.g. BTC-EUR), resold from an upstream signal system. Two layers: 'long' (positional ALLOW_LONG/EXIT/HOLD with confidence, summary and primary risk) and 'daytrade' (a 15m LONG/EXIT setup with entry range, stop-loss, take-profit and reward:risk). No fresh verdict for the requested layer returns 400 (no charge). Factual model output, not investment advice.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["coin"],"properties":{"coin":{"type":"string","description":"Coin/product id, e.g. BTC-EUR"},"layer":{"type":"string","enum":["long","regime","daytrade","both"],"default":"both","description":"Which verdict layer to buy ('regime' is an accepted alias for 'long')"}}}}}},"responses":{"200":{"description":"coin, as_of, long {action, confidence, summary, primaryRisk, decidedAt, validUntil} | null, daytrade {strategyVersion, action, confidence, entryMin/Max, stopLoss, takeProfit, rewardRisk, setupTimeframe, decidedAt, validUntil} | null, source_disclaimer. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error incl. unknown_coin and no_fresh_verdict (requested layer has no still-valid verdict); no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Upstream signal system unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.03"},"protocols":[{"x402":{}}]}}},"/crypto/track-record":{"post":{"summary":"Track record of the verdict strategies (resold) — $0.01 per call","description":"Measured track record of the strategies behind /crypto/verdict, resold from the upstream signal system. Give a window in days (default 30, clamped 1..365); returns per strategy the trades, wins, win rate and average net return over that window. A factual measurement over a short window, not investment advice.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":1,"maximum":365,"default":30}}}}}},"responses":{"200":{"description":"window_days, measured_since, strategies[] {strategy, trades, wins, winRatePct, avgNetReturnPct}, source_note. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Upstream signal system unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/crypto/scan":{"post":{"summary":"Scan published crypto opportunities — $0.01 per call","description":"Step 1 of the crypto advice chain (scan → signal → validate → evidence → check). Machine-readable list of the currently published long opportunities from an upstream advice system, ranked by opportunity_score (0-100 heuristic, never a calibrated win probability). Advice only: no execution, no custody, no position sizing. An empty list is a valid paid answer and carries next_check_after. No per-wallet rate limit on this endpoint: 429 is never returned.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"The currently published long opportunities, ranked by opportunity_score descending. An empty list is a valid paid answer and carries next_check_after instead of a next call. Carries the PAYMENT-RESPONSE settlement header.\n","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","checked_at","source_as_of","count","opportunities","recommended_next_call","disclaimer"],"properties":{"query":{"type":"object","description":"The validated input echoed back; /crypto/scan takes no input, so this is always an empty object."},"checked_at":{"type":"string","format":"date-time","description":"When we produced this answer (ISO 8601, UTC). This is the only ISO timestamp in the payload; every other timestamp is unix seconds."},"source_as_of":{"type":"integer","description":"Unix seconds — how fresh the upstream advice system's view of the market was when it answered."},"count":{"type":"integer","description":"Number of items in opportunities[]; equals opportunities.length."},"opportunities":{"type":"array","description":"Compact items (no full analysis) sorted by opportunity_score descending; buy /crypto/signal for the complete advice behind one signal_id.","items":{"$ref":"#/components/schemas/CryptoScanItem"}},"recommended_next_call":{"$ref":"#/components/schemas/CryptoNextCall"},"next_check_after":{"type":"integer","description":"Present only when opportunities[] is empty — unix seconds before which scanning again is pointless (now + 900)."},"source_disclaimer":{"type":"string","description":"Verbatim disclaimer of the upstream advice system, passed through unedited."},"disclaimer":{"$ref":"#/components/schemas/CryptoDisclaimer"}}}}}},"402":{"description":"Payment required — x402 v2."},"409":{"description":"payment_proof_fingerprint_mismatch — this payment proof is bound to a different request (method, path, body, price, network or receiving wallet); pay again for the new input."},"502":{"description":"settlement_unknown — the result is ready but the settlement state is uncertain; retry with the SAME payment proof after retry_after_seconds. Never pay again on this error."},"503":{"description":"Upstream advice system unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/crypto/signal":{"post":{"summary":"Full advice for one crypto opportunity — $0.01 per call","description":"Step 2 of the chain: the complete published advice behind a signal_id from /crypto/scan — classification, opportunity_score (heuristic), entry zone, stop-loss, take-profit, reward:risk, positive/negative factors, conditions, invalidation conditions, economics, ML horizons with evidence status, entry validity versus expected hold, and the upstream execution metadata (metadata only; the caller decides). Asking for a NEUTRAL, WATCH or AVOID signal is a perfectly valid $0.01 call: you get the full assessment with entry_zone, stop_loss and take_profit null. You pay for the judgement, not for the presence of a setup. No per-wallet rate limit on this endpoint: 429 is never returned.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signal_id"],"properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"Signal id from /crypto/scan, e.g. sig_a1b2c3d4e5f6"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"The complete published advice behind one signal_id, passed through 1:1 from the upstream advice system. Carries the PAYMENT-RESPONSE settlement header.\n","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","checked_at","source_as_of","advice","recommended_next_call","disclaimer"],"properties":{"query":{"type":"object","description":"The validated input echoed back, i.e. the signal_id you asked for.","properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$"}}},"checked_at":{"type":"string","format":"date-time","description":"When we produced this answer (ISO 8601, UTC). Every other timestamp in this payload is unix seconds."},"source_as_of":{"type":"integer","description":"Unix seconds — freshness of the upstream advice system's answer."},"advice":{"$ref":"#/components/schemas/CryptoAdvice"},"recommended_next_call":{"$ref":"#/components/schemas/CryptoNextCall"},"source_disclaimer":{"type":"string","description":"Verbatim disclaimer carried by the upstream advice object."},"disclaimer":{"$ref":"#/components/schemas/CryptoDisclaimer"}}}}}},"400":{"description":"invalid_signal_id (bad format) or signal_not_found (unknown upstream); no settlement."},"402":{"description":"Payment required — x402 v2."},"409":{"description":"payment_proof_fingerprint_mismatch — this payment proof is bound to a different request (method, path, body, price, network or receiving wallet); pay again for the new input."},"502":{"description":"settlement_unknown — the result is ready but the settlement state is uncertain; retry with the SAME payment proof after retry_after_seconds. Never pay again on this error."},"503":{"description":"Upstream advice system unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/crypto/validate":{"post":{"summary":"Is this crypto opportunity still valid? — $0.01 per call","description":"Step 3 of the chain: live validity of a signal_id — status ACTIVE|STALE|INVALIDATED, remaining entry window, current price versus the entry zone, spread, data quality, economics recomputed at the current price, whether upstream execution blockers changed, and invalidation reasons. An expired entry is reported as expired. No per-wallet rate limit on this endpoint: 429 is never returned.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signal_id"],"properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"Signal id to validate, e.g. sig_a1b2c3d4e5f6"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Live validity of the signal: status, remaining entry window, price versus the entry zone and economics recomputed at the current price. Carries the PAYMENT-RESPONSE settlement header.\n","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","checked_at","source_as_of","signal_id","status","current_price","spread_bps","recommended_next_call","disclaimer"],"properties":{"query":{"type":"object","description":"The validated input echoed back, i.e. the signal_id you asked for.","properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$"}}},"checked_at":{"type":"string","format":"date-time","description":"When we produced this answer (ISO 8601, UTC). Every other timestamp in this payload is unix seconds."},"source_as_of":{"type":"integer","description":"Unix seconds — freshness of the upstream advice system's answer."},"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"The validated signal, stable across versions of the same opportunity."},"version":{"type":"integer","description":"Version of the advice this validation describes; increments on every material change."},"status":{"$ref":"#/components/schemas/CryptoSignalStatus"},"publication_status":{"$ref":"#/components/schemas/CryptoPublicationStatus"},"entry_valid_until":{"type":"integer","description":"Unix seconds — end of the 30-minute window in which this still counts as a current NEW-entry advice (not a position deadline; see expected_hold_until on /crypto/signal)."},"entry_window_remaining_seconds":{"type":"integer","description":"Seconds left in that entry window; 0 or negative means the window closed and status is no longer ACTIVE."},"current_price":{"type":["number","null"],"description":"Last observed price of the coin at the upstream source; null when no usable price was available (then price_vs_entry_zone is UNKNOWN)."},"price_as_of":{"type":"integer","description":"Unix seconds — when current_price was observed."},"price_vs_entry_zone":{"type":"string","enum":["BELOW","INSIDE","ABOVE","UNKNOWN"],"description":"Where current_price sits relative to the advised entry zone. BELOW = under entry_zone.min, INSIDE = within the zone, ABOVE = past entry_zone.max (chasing), UNKNOWN = no price or no concrete entry zone."},"spread_bps":{"type":["number","null"],"description":"Observed bid/ask spread in basis points; null when not measurable. A wide spread eats the net edge in economics."},"data_quality":{"type":"string","enum":["GOOD","DEGRADED","STALE"],"description":"Quality of the market data behind this validation. GOOD = fresh and complete, DEGRADED = usable but partial or wide/uncertain, STALE = too old to rely on — treat the price-derived fields with caution."},"economics":{"$ref":"#/components/schemas/CryptoEconomics"},"execution_blockers_changed":{"type":"boolean","description":"True when the upstream system's internal execution blockers differ from those published with the advice; informational only, never a permission."},"execution":{"$ref":"#/components/schemas/CryptoExecution"},"invalidation":{"type":"object","description":"Whether the advice's own invalidation conditions have triggered.","properties":{"invalidated":{"type":"boolean","description":"True when at least one published invalidation condition has been met; the setup is off."},"reasons":{"type":"array","items":{"type":"string"},"description":"Human-readable reasons behind invalidated=true; empty array when not invalidated."}}},"recommended_next_call":{"$ref":"#/components/schemas/CryptoNextCall"},"next_check_after":{"type":"integer","description":"Present only when status is not ACTIVE — unix seconds before which polling /crypto/check again is pointless (now + 1800)."},"source_disclaimer":{"type":"string","description":"Verbatim upstream disclaimer; only present when the source sends one with the validation."},"disclaimer":{"$ref":"#/components/schemas/CryptoDisclaimer"}}}}}},"400":{"description":"invalid_signal_id or signal_not_found; no settlement."},"402":{"description":"Payment required — x402 v2."},"409":{"description":"payment_proof_fingerprint_mismatch — this payment proof is bound to a different request (method, path, body, price, network or receiving wallet); pay again for the new input."},"502":{"description":"settlement_unknown — the result is ready but the settlement state is uncertain; retry with the SAME payment proof after retry_after_seconds. Never pay again on this error."},"503":{"description":"Upstream advice system unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/crypto/evidence":{"post":{"summary":"Measured evidence behind a crypto opportunity — $0.01 per call","description":"Step 4 of the chain: the measured track record of the strategy (and coin where enough samples exist) behind a signal_id. Populations are reported separately (detected, blocked, published, expired_without_entry, completed, wins, losses, time_exits) and the win rate uses completed outcomes only as its denominator, with a Wilson interval. Values the source cannot compute are null — never fabricated. No per-wallet rate limit on this endpoint: 429 is never returned.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signal_id"],"properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"Signal id, e.g. sig_a1b2c3d4e5f6"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"The measured track record of the strategy behind this signal, with populations and metrics kept strictly apart. Carries the PAYMENT-RESPONSE settlement header.\n","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","checked_at","source_as_of","strategy","coin","ml_models","recommended_next_call","disclaimer"],"properties":{"query":{"type":"object","description":"The validated input echoed back, i.e. the signal_id you asked for.","properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$"}}},"checked_at":{"type":"string","format":"date-time","description":"When we produced this answer (ISO 8601, UTC). Every other timestamp in this payload is unix seconds."},"source_as_of":{"type":"integer","description":"Unix seconds — freshness of the upstream advice system's answer."},"strategy":{"type":"string","description":"Strategy version the evidence is scoped to, e.g. 'momentum-breakout-v1'; the same strategy that produced the signal."},"coin":{"type":["string","null"],"description":"Coin the evidence is scoped to, e.g. 'BTC-EUR'; null means there were too few coin-level samples and the numbers are strategy-wide."},"window_days":{"type":"integer","description":"Length of the measurement window in days."},"measured_since":{"type":"integer","description":"Unix seconds — start of the measurement window."},"populations":{"type":"object","description":"Disjoint counts over the window, deliberately reported apart from the metrics so you can see selection effects. blocked and expired_without_entry are EXCLUDED from every metric denominator.\n","properties":{"detected":{"type":"integer","description":"Candidates the strategy detected, before any internal filtering."},"blocked":{"type":"integer","description":"Candidates the upstream system blocked internally (never traded); excluded from all metric denominators."},"published":{"type":"integer","description":"Candidates published externally as advice."},"expired_without_entry":{"type":"integer","description":"Published candidates whose entry window closed without a fill; excluded from all metric denominators."},"completed":{"type":"integer","description":"Entered positions with a finished outcome (exit status WIN, LOSS or TIME); this is the denominator of win_rate_pct and the return metrics."},"pending":{"type":"integer","description":"Entered positions still open; no outcome yet, so not counted anywhere in metrics."},"wins":{"type":"integer","description":"Exit-status count of positions that exited on their target. A count of exit REASON, not of profitability — see metrics.win_definition."},"losses":{"type":"integer","description":"Exit-status count of positions that exited on their stop."},"time_exits":{"type":"integer","description":"Exit-status count of positions closed because the holding horizon ran out; these can still be profitable and then count as wins in win_rate_pct."}},"additionalProperties":{"type":"integer"}},"metrics":{"type":"object","description":"Measured over completed outcomes only (WIN + LOSS + TIME). Anything the source cannot compute is null — never fabricated or back-filled.\n","properties":{"completed_sample_count":{"type":["integer","null"],"description":"Sample size behind every metric below; small samples mean wide Wilson bounds — read them."},"win_rate_pct":{"type":["number","null"],"description":"Percentage of COMPLETED outcomes that were profitable. Denominator is completed (WIN+LOSS+TIME), never detected or published."},"win_definition":{"type":["string","null"],"description":"How a win is counted; currently always 'net_return_gt_0' — net return after costs above zero, so a profitable TIME exit counts as a win even though it is not in populations.wins."},"wilson_low_pct":{"type":["number","null"],"description":"Lower bound of the 95% Wilson score interval around win_rate_pct; treat this, not win_rate_pct, as the conservative read."},"wilson_high_pct":{"type":["number","null"],"description":"Upper bound of the 95% Wilson score interval around win_rate_pct."},"avg_net_return_pct":{"type":["number","null"],"description":"Mean net return per completed outcome in percent, after taker costs. Can be negative."},"median_net_return_pct":{"type":["number","null"],"description":"Median net return per completed outcome in percent; less sensitive to a single outlier than the mean."},"total_net_return_pct":{"type":["number","null"],"description":"Sum of net returns over all completed outcomes in percent — not a compounded account return."},"avg_net_return_maker_pct":{"type":["number","null"],"description":"Mean net return assuming passive maker fills; optimistic, because a maker fill is never guaranteed."},"distinct_days":{"type":["integer","null"],"description":"Number of distinct calendar days contributing completed outcomes; low values mean the sample is clustered in time."},"distinct_coins":{"type":["integer","null"],"description":"Number of distinct coins contributing completed outcomes; low values mean the sample is concentrated in one market."}},"additionalProperties":{"type":["number","string","null"]}},"ml_models":{"type":"array","description":"Machine-learning models used by this strategy and how far their own validation has come.","items":{"type":"object","properties":{"model_version":{"type":"string","description":"Identifier of the model, e.g. 'gbdt-intraday-v1-1h'."},"evidence_status":{"$ref":"#/components/schemas/CryptoEvidenceStatus"},"sample_count":{"type":"integer","description":"Number of measured outcomes behind this model's evidence_status; 0 means nothing has been validated yet."}}}},"strategy_evidence_status":{"$ref":"#/components/schemas/CryptoEvidenceStatus"},"note":{"type":"string","description":"Verbatim upstream note on how these populations and metrics relate; states that win rate and returns use completed outcomes only."},"recommended_next_call":{"$ref":"#/components/schemas/CryptoNextCall"},"source_disclaimer":{"type":"string","description":"Verbatim upstream disclaimer; only present when the source sends one with the evidence."},"disclaimer":{"$ref":"#/components/schemas/CryptoDisclaimer"}}}}}},"400":{"description":"invalid_signal_id or signal_not_found; no settlement."},"402":{"description":"Payment required — x402 v2."},"409":{"description":"payment_proof_fingerprint_mismatch — this payment proof is bound to a different request (method, path, body, price, network or receiving wallet); pay again for the new input."},"502":{"description":"settlement_unknown — the result is ready but the settlement state is uncertain; retry with the SAME payment proof after retry_after_seconds. Never pay again on this error."},"503":{"description":"Upstream advice system unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/crypto/check":{"post":{"summary":"Cheap change poll for a crypto opportunity — $0.01 per call","description":"Step 5 of the chain: send signal_id plus the known_version you hold and receive whether it changed, the current version, live status, which change types occurred and next_check_after — no full signal payload. Built for repeat monitoring of an active opportunity. Omitting known_version always yields changed=true (no baseline). No per-wallet rate limit on this endpoint: 429 is never returned, however often you poll.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signal_id"],"properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"Signal id you are monitoring, e.g. sig_a1b2c3d4e5f6"},"known_version":{"type":"integer","minimum":1,"description":"Version you already hold, e.g. 4; omit for no baseline"}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Whether the opportunity changed since the version you hold — no full signal payload. Carries the PAYMENT-RESPONSE settlement header.\n","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","checked_at","source_as_of","signal_id","known_version","current_version","changed","change_types","next_check_after","recommended_next_call","disclaimer"],"properties":{"query":{"type":"object","description":"The validated input echoed back, i.e. signal_id and (if you sent one) known_version.","properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$"},"known_version":{"type":"integer","minimum":1}}},"checked_at":{"type":"string","format":"date-time","description":"When we produced this answer (ISO 8601, UTC). Every other timestamp in this payload is unix seconds."},"source_as_of":{"type":"integer","description":"Unix seconds — freshness of the upstream answer; falls back to our own clock because the check is computed on call."},"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"The signal you are monitoring."},"known_version":{"type":["integer","null"],"description":"The baseline version YOU sent, echoed so the answer can never contradict your input; null when you sent none, and then changed is always true."},"current_version":{"type":"integer","description":"The version the upstream advice system holds right now."},"changed":{"type":"boolean","description":"True when current_version differs from your known_version (or when you supplied no baseline). Buy /crypto/signal to fetch the updated advice."},"status":{"$ref":"#/components/schemas/CryptoSignalStatus"},"change_types":{"type":"array","description":"Which kinds of change occurred between your baseline and current_version; empty array when nothing changed or when no baseline was supplied.","items":{"type":"string","enum":["score_changed","classification_changed","entry_zone_changed","economics_changed","execution_blockers_changed","status_changed"],"description":"score_changed = opportunity_score moved; classification_changed = the classification band changed; entry_zone_changed = entry zone, stop-loss or take-profit moved; economics_changed = the cost/net-edge estimate moved; execution_blockers_changed = the upstream system's internal blockers changed (informational only); status_changed = ACTIVE/STALE/INVALIDATED changed.\n"}},"next_check_after":{"type":"integer","description":"Unix seconds — do not poll again before this. Upstream uses now + 300 while ACTIVE and now + 1800 otherwise."},"recommended_next_call":{"$ref":"#/components/schemas/CryptoNextCall"},"source_disclaimer":{"type":"string","description":"Verbatim upstream disclaimer; only present when the source sends one with the check."},"disclaimer":{"$ref":"#/components/schemas/CryptoDisclaimer"}}}}}},"400":{"description":"invalid_signal_id, invalid_known_version or signal_not_found; no settlement."},"402":{"description":"Payment required — x402 v2."},"409":{"description":"payment_proof_fingerprint_mismatch — this payment proof is bound to a different request (method, path, body, price, network or receiving wallet); pay again for the new input."},"502":{"description":"settlement_unknown — the result is ready but the settlement state is uncertain; retry with the SAME payment proof after retry_after_seconds. Never pay again on this error."},"503":{"description":"Upstream advice system unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/crypto/feed":{"post":{"summary":"Subscribe to the crypto advice change feed (30 days) — $2.00","description":"Thirty days of access to a cursor feed over the same advice ledger that powers /crypto/scan, all coins at once. Returns a feed_handle and a starting cursor at the current ledger position; polling afterwards is free and unlimited via /crypto/feed/since. Event kinds: new_signal, classification_changed (previous_classification vs classification marks the flip), status_changed (PUBLISHED/STALE/INVALIDATED), score_changed, entry_zone_changed, economics_changed, execution_blockers_changed. The feed tells you THAT something changed; the full advice per signal_id stays a separate paid call (/crypto/signal). Market intelligence only — no execution, no custody, no position sizing. No per-wallet rate limit: 429 is never returned.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Subscription created. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["feed_handle","cursor","expires_at","poll","renew","event_kinds","coverage","disclaimer"],"properties":{"feed_handle":{"type":"string","pattern":"^[0-9a-f]{24}$","description":"Your subscription handle; required on every poll and renewal. Not recoverable if lost."},"cursor":{"type":"integer","description":"The current ledger position. Start polling from here; history is not replayed as \"new\". Pass cursor 0 to /crypto/feed/since once if you want the backlog."},"expires_at":{"type":"string","format":"date-time","description":"When the subscription lapses (ISO 8601, UTC). After this, polls return expired true until you renew."},"poll":{"type":"object","description":"Ready-to-send request for /crypto/feed/since."},"renew":{"type":"object","description":"Ready-to-send request for /crypto/feed/renew."},"event_kinds":{"type":"array","items":{"type":"string"},"description":"All kinds you can filter on in /crypto/feed/since."},"coverage":{"type":"object","description":"The coins the upstream advice system currently tracks; the list rotates with its universe."},"methodology":{"type":"string"},"disclaimer":{"$ref":"#/components/schemas/CryptoDisclaimer"}}}}}},"402":{"description":"Payment required — x402 v2."},"409":{"description":"payment_proof_fingerprint_mismatch — this payment proof is bound to a different request (method, path, body, price, network or receiving wallet); pay again for the new input."},"502":{"description":"settlement_unknown — the result is ready but the settlement state is uncertain; retry with the SAME payment proof after retry_after_seconds. Never pay again on this error."},"503":{"description":"Upstream advice system unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"2"},"protocols":[{"x402":{}}]}}},"/crypto/feed/renew":{"post":{"summary":"Extend a crypto feed subscription by 30 days — $2.00","description":"Adds 30 days to an existing subscription using the same feed_handle. Renewing before the expiry date adds the days on top of the remaining time rather than restarting it; renew late and the month starts today. Your cursor lives on your side and is unaffected. Renewal deliberately makes no upstream call, so it also succeeds while the advice system is down. No per-wallet rate limit: 429 is never returned.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["feed_handle"],"properties":{"feed_handle":{"type":"string","description":"Handle returned when you subscribed"}}}}}},"responses":{"200":{"description":"feed_handle, expires_at, note. Carries PAYMENT-RESPONSE."},"400":{"description":"invalid_handle or unknown_handle; no settlement."},"402":{"description":"Payment required — x402 v2."},"409":{"description":"payment_proof_fingerprint_mismatch — this payment proof is bound to a different request (method, path, body, price, network or receiving wallet); pay again for the new input."},"502":{"description":"settlement_unknown — the result is ready but the settlement state is uncertain; retry with the SAME payment proof after retry_after_seconds. Never pay again on this error."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"2"},"protocols":[{"x402":{}}]}}},"/crypto/feed/since":{"post":{"summary":"Poll the crypto advice change feed (free with a subscription)","description":"Every published change since your cursor, oldest first, across all covered coins. Send back next_cursor on the following poll to receive only newer events; has_more true means the ledger page was full — poll again immediately. A kinds filter hides events but never rewinds the cursor. A lapsed subscription returns HTTP 200 with expired true and a renew instruction rather than an error, so an MCP client surfaces the message instead of a transport failure.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["feed_handle"],"properties":{"feed_handle":{"type":"string"},"cursor":{"type":"number","description":"Sequence you last saw; omit to continue from your subscription start","0 for the backlog":null},"kinds":{"type":"array","items":{"type":"string"},"description":"Filter: new_signal, classification_changed, status_changed, score_changed, entry_zone_changed, economics_changed, execution_blockers_changed"},"limit":{"type":"number","description":"Max events per page (default 100","max 500)":null}}}}}},"responses":{"200":{"description":"Events since your cursor — or expired true when the subscription lapsed.","content":{"application/json":{"schema":{"type":"object","properties":{"feed_handle":{"type":"string"},"expires_at":{"type":"string","format":"date-time"},"cursor":{"type":"integer","description":"The cursor this page started from."},"next_cursor":{"type":"integer","description":"Send this back on your next poll. Advances over filtered-out events too."},"has_more":{"type":"boolean","description":"True when the ledger page was full — poll again immediately rather than waiting."},"latest_seq":{"type":"integer","description":"The newest ledger position right now."},"count":{"type":"integer","description":"Number of events returned after your kinds filter."},"events":{"type":"array","description":"One event per version row in the upstream publication ledger, oldest first.","items":{"type":"object","required":["seq","at","signal_id","version","coin","classification","previous_classification","publication_status","change_types","kinds"],"properties":{"seq":{"type":"integer","description":"Ledger sequence of this event; strictly increasing."},"at":{"type":"integer","description":"Unix seconds the version was written upstream."},"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"Stable id of the opportunity; use it on /crypto/signal for the full advice (paid)."},"version":{"type":"integer","description":"Version of the advice after this event; 1 means a brand-new signal."},"coin":{"type":"string","description":"Product id","e.g. BTC-EUR.":null},"classification":{"$ref":"#/components/schemas/CryptoClassification"},"previous_classification":{"oneOf":[{"$ref":"#/components/schemas/CryptoClassification"},{"type":"null"}],"description":"Classification of the previous version; null on a new signal. Different from classification = the flip this feed exists for."},"opportunity_score":{"type":"integer","minimum":0,"maximum":100},"score_type":{"$ref":"#/components/schemas/CryptoScoreType"},"publication_status":{"$ref":"#/components/schemas/CryptoPublicationStatus"},"entry_valid_until":{"type":"integer","description":"Unix seconds until which a NEW entry was advisable at this version."},"change_types":{"type":"array","items":{"type":"string"},"description":"What changed versus the previous version; empty on a version-1 event."},"kinds":{"type":"array","items":{"type":"string"},"description":"The filterable kinds derived from this event (new_signal for version 1, otherwise the change_types)."}}}},"note":{"type":"string"},"disclaimer":{"$ref":"#/components/schemas/CryptoDisclaimer"}}}}}},"400":{"description":"invalid_handle or invalid_kinds."},"404":{"description":"unknown_handle."},"503":{"description":"Upstream advice system unavailable."}}}},"/eu/crypto-firm-check":{"post":{"summary":"EU crypto firm check (ESMA MiCA register + warning list) — $0.03 per call","description":"One call checks the official ESMA interim MiCA register of authorised crypto-asset service providers (CASPs) AND the EU non-compliant entities warning list. Search by firm name, platform website/domain (strongest match), or LEI. Firms only. Counterparty/scam check before sending funds to a platform.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Crypto firm name"},"website":{"type":"string","description":"Platform website or domain"},"lei":{"type":"string","pattern":"^[A-Za-z0-9]{20}$"}}}}}},"responses":{"200":{"description":"authorised (result authorised|not_found + matches with member state, competent authority, services, LEI) and warnings (result listed|not_listed + matches with reason). Every match carries match_basis (lei|website|name_exact|name_contains); treat name_contains as fuzzy. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"503":{"description":"ESMA register unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.03"},"protocols":[{"x402":{}}]}}},"/x402/counterparty-check":{"post":{"summary":"x402 counterparty trust check (own monitoring + on-chain + EU registers) — $0.02 per call","description":"Factual trust check before paying an unfamiliar x402 service. Combines our own availability monitoring of the service's x402 endpoint (30-day uptime, last check, payTo/price as observed in its live 402 responses, payTo/price drift between our measurements), on-chain USDC payment history to the pay_to address on Base (2-day window), and EU regulatory status of the service domain (MiCA/warning list). No scores; not being monitored or absent is not negative, presence is no endorsement.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pay_to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"resource":{"type":"string","description":"URL of the x402 service"}}}}}},"responses":{"200":{"description":"monitoring {monitored, hosts[] with uptime_30d_pct/last_check/observed_pay_to/pay_to_matches_observation/recent_events, observation_basis}, onchain {payments, unique_payers, volume_usdc, window_days} | null, regulatory {casp_authorised, warning_listed} | null. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"A required source is unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]}}},"/x402/preflight":{"post":{"summary":"x402 preflight — live probe + monitoring history — $0.01 per call","description":"Is the service working right now, and did it work the past 30 days? One live probe of the exact resource URL you intend to pay (status, latency, x402 validity, the payTo/price the service itself publishes, manifest presence) plus our own monitoring history of the host (uptime 7d/30d, recent payTo/price drift events). Optionally verifies the pay_to you intend to pay against the live 402. Facts only.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["resource"],"properties":{"resource":{"type":"string","description":"Full https URL of the x402 endpoint you intend to pay"},"pay_to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Optional address you intend to pay"}}}}}},"responses":{"200":{"description":"live {status, latency_ms, observed_pay_to/amount, pay_to_matches_live, manifest_present}, history {monitored, hosts[]}, status_page. An unreachable target is a valid result. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Monitoring store unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/x402/service-report":{"post":{"summary":"x402 service reliability report (30-day own-monitoring history) — $0.05 per call","description":"Full report from our own availability monitoring of one x402 service: daily probe series over 30 days (probes, ok, avg/max latency), uptime 7d/30d, all observed change events (up/down, payTo drift, price drift, manifest changes) and the payment details as last observed in the service's own 402 responses. Facts only.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["host"],"properties":{"host":{"type":"string","description":"Hostname of the x402 service","or a full URL":null}}}}}},"responses":{"200":{"description":"monitoring_since, uptime_7d/30d_pct, daily[], events_30d[], last_check, observed_pay_to/amount, manifest_present, status_page. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error incl. host_not_monitored (no history for this host); no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Monitoring store unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]}}},"/x402/network-report":{"post":{"summary":"Daily x402 network report (own monitoring, whole ecosystem) — $0.01 per call","description":"Daily state-of-the-network report on the x402 ecosystem, built exclusively from our own probes (~2 per host per day): hosts monitored, share of probes returning a valid 402 over 24h and 7d, host status breakdown, manifest coverage, counts of observed changes over 24h and 7d (up/down, payTo drift, price drift, manifest gained/lost) and the hosts that moved today. Regenerated once per day. Facts only; no scores and no catalogue data.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"report_date, generated_at, coverage, availability, manifest, changes_24h/7d, movers_24h, methodology. Carries PAYMENT-RESPONSE."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Monitoring store unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/x402/network-feed":{"post":{"summary":"Subscribe to the x402 network change feed (30 days) — $2.00","description":"Thirty days of access to a cursor feed of our own x402 network observations. Returns a feed_handle and a starting cursor; polling afterwards is free and unlimited via /x402/network-feed/since and /x402/network-feed/check. Event kinds: down, up, payto_drift, amount_drift, manifest_gained, manifest_lost. Facts only; no scores and no catalogue data.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"feed_handle, cursor, expires_at, poll/check/renew instructions, coverage, methodology. Carries PAYMENT-RESPONSE."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Monitoring store unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"2"},"protocols":[{"x402":{}}]}}},"/x402/network-feed/renew":{"post":{"summary":"Extend a network-feed subscription by 30 days — $2.00","description":"Adds 30 days to an existing subscription using the same feed_handle. Renewing before the expiry date adds to the remaining time rather than restarting it; the cursor is kept.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["feed_handle"],"properties":{"feed_handle":{"type":"string","description":"Handle returned when you subscribed"}}}}}},"responses":{"200":{"description":"feed_handle, cursor, expires_at. Carries PAYMENT-RESPONSE."},"400":{"description":"invalid_handle or unknown_handle; no settlement."},"402":{"description":"Payment required — x402 v2."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"2"},"protocols":[{"x402":{}}]}}},"/x402/network-feed/since":{"post":{"summary":"Poll the network change feed (free with a subscription)","description":"Everything that changed since your cursor, oldest first. Send back next_cursor on the following poll to receive only newer events; has_more true means the page was full. A lapsed subscription returns HTTP 200 with expired true and a renew instruction rather than an error, so an MCP client surfaces the message instead of a transport failure.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["feed_handle"],"properties":{"feed_handle":{"type":"string"},"cursor":{"type":"number","description":"Sequence you last saw; 0 for the backlog"},"kinds":{"type":"array","items":{"type":"string"},"description":"Filter: down, up, payto_drift, amount_drift, manifest_gained, manifest_lost"},"limit":{"type":"number","description":"Max events per page (default 100","max 500)":null}}}}}},"responses":{"200":{"description":"cursor, next_cursor, has_more, count, events[] — or expired true when the subscription lapsed."},"400":{"description":"invalid_handle or invalid_kinds."},"404":{"description":"unknown_handle."},"503":{"description":"Monitoring store unavailable."}}}},"/x402/network-feed/check":{"post":{"summary":"Check a batch of hosts before paying them (free with a subscription)","description":"Send up to 50 hosts you are about to pay and get, per host, the last status we observed, the payTo and price the service itself published in its 402, whether it carries a manifest, and every change since your cursor. Hosts we do not probe are returned as monitored false, which is not a negative signal.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["feed_handle","hosts"],"properties":{"feed_handle":{"type":"string"},"hosts":{"type":"array","items":{"type":"string"},"description":"Hostnames or full URLs","max 50":null},"cursor":{"type":"number"}}}}}},"responses":{"200":{"description":"results[] per host with last_status, observed_pay_to/amount, manifest_present, changed_since_cursor[] — or expired true."},"400":{"description":"invalid_handle, invalid_hosts or too_many_hosts."},"404":{"description":"unknown_handle."},"503":{"description":"Monitoring store unavailable."}}}},"/x402/demand-report":{"post":{"summary":"What agents ask for and cannot buy yet — aggregated unmet demand — $0.05 per call","description":"The aggregated demand picture over the last 30 days, built from our own measurements: calls we had to reject because a requested capability value is not covered AND the caller had already presented a verified payment proof (kind is typically coin, country, vies_country, monitor_host or sms_service — free-form values possible; with call counts, distinct days and distinct paying wallets), coverage gaps agents filed themselves via POST /agent/request, and settled $0.01 intents via POST /agent/want including the price points they named. Demand as observed at ONE provider, not a network-wide picture of x402: absence of demand here is not evidence of absence of a market. Aggregates only — no wallet hashes, no free text, no subject identifiers, by construction rather than by redaction. The report is cached for 6 hours; generated_at tells you how old the aggregate is, checked_at when it was served. No input required. 429 is never returned: this endpoint is not wallet-guarded.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 v2 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"The aggregated demand report. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["unmet_demand","filed_requests","paid_wants","coverage","methodology","disclaimer","checked_at"],"properties":{"generated_at":{"type":"string","format":"date-time","description":"When the aggregate was computed; can be up to 6 hours older than checked_at because the report is cached."},"source":{"type":"string","enum":["cache","live"],"description":"Whether this answer came from the 6-hour cache or was aggregated on the spot. Same content either way."},"unmet_demand":{"type":"array","description":"Calls rejected because a capability value is not covered, counting ONLY rejections where the caller had already presented a verified payment proof — the strongest signal in this report, because somebody was demonstrably willing to pay. Rejections that happen before the payment proof (plain input validation) are free and anonymous to produce and are excluded on purpose; they remain internal telemetry. External traffic only (our own test and synthetic calls are excluded), grouped per (kind, value), top 50 by calls.\n","items":{"type":"object","properties":{"kind":{"type":"string","description":"Coverage kind — typically one of coin, country, vies_country, monitor_host, sms_service; free-form values possible"},"value":{"type":["string","null"],"description":"The exact value asked for; null when only the kind of the gap was recorded and not the value itself."},"calls":{"type":"integer","description":"Rejected paid calls in the window; one busy caller can dominate this."},"distinct_days":{"type":"integer","description":"Distinct days it was asked — sustained demand shows here","a single burst does not.":null},"distinct_wallets":{"type":"integer","description":"How many different paying wallets asked for it","counted over keyed hashes; the wallets themselves are never returned.":null}}}},"filed_requests":{"type":"array","description":"Coverage gaps filed for free via POST /agent/request, per (kind, value), top 50 by count. Free-text notes are never included. The per-sender daily intake cap is enforced through an eventually consistent store, so it is approximate.\n","items":{"type":"object","properties":{"kind":{"type":"string","description":"Coverage kind as filed — typically one of coin, country, vies_country, monitor_host, sms_service; free-form values possible"},"value":{"type":"string"},"requests":{"type":"integer"},"distinct_senders":{"type":"integer","description":"How many different senders filed it","counted over keyed IP hashes; one sender filing twenty times is not twenty parties.":null},"distinct_days":{"type":"integer","description":"Distinct days it was filed."}}}},"paid_wants":{"type":"object","description":"Paid $0.01 intents in the window whose payment actually settled and which came from external traffic, as counts only — deliberately without per-intent rows, wallet hashes or intent text.\n","properties":{"total":{"type":"integer"},"distinct_wallets":{"type":"integer","description":"How many different wallets filed intents — the count only; wallets are stored as keyed hashes and never returned."},"with_price":{"type":"integer","description":"How many intents named a price per call."},"max_price_usd":{"type":"object","description":"Distribution of the named price points in USD per call. All null when nobody named one, and also all null when fewer than 3 intents named one — then price_stats_suppressed is true, because min/avg/max over one or two intents just discloses a single counterparty's price.\n","properties":{"min":{"type":["number","null"]},"avg":{"type":["number","null"],"description":"A mean over a handful of intents is not a market price."},"max":{"type":["number","null"]}}},"price_stats_suppressed":{"type":"boolean","description":"Present and true only when price points existed but fewer than 3, so min/avg/max were withheld. Absent when the stats are published or when nobody named a price at all.\n"}}},"coverage":{"type":"object","properties":{"window_days":{"type":"integer","description":"Length of the window in days (30)."},"sources":{"type":"array","items":{"type":"string"}},"first_measurement":{"type":["string","null"],"description":"Oldest observation across the sources; a young measurement cannot show a trend. null means nothing has been observed yet."}}},"methodology":{"type":"string","description":"Exactly how each number is counted","which traffic is excluded and what is never included.":null},"disclaimer":{"type":"string","description":"Verbatim boundary: demand at one provider, shaped by what we happen to sell."},"checked_at":{"type":"string","format":"date-time"}}}}}},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"409":{"description":"payment_proof_fingerprint_mismatch — this proof is bound to a different request."},"502":{"description":"settlement_unknown — retry with the SAME payment proof; never pay again on this error."},"503":{"description":"Our own measurement store is unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]}}},"/x402/settlement-attest":{"post":{"summary":"Verify + screen + attest an incoming agent payment (seller-side) — $0.25 per call","description":"For a seller receiving an agent payment: verifies the settlement on-chain (transaction confirmed, correct recipient and amount), reports the payer wallet's on-chain history, screens the provided counterparty name against the EU and UN sanctions lists, and returns an Ed25519-signed attestation to keep as an audit record — verifiable offline via /.well-known/attest-keys.json. Facts and proof, never a guarantee, custody or compliance verdict. The counterparty name appears only as SHA-256.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payment","expected"],"properties":{"payment":{"type":"object","required":["tx_hash"],"properties":{"tx_hash":{"type":"string","description":"0x-prefixed 64-hex settlement tx hash from the PAYMENT-RESPONSE"},"network":{"type":"string","description":"CAIP-2; defaults to eip155:8453 (Base). Other networks return network_unsupported."}}},"expected":{"type":"object","required":["pay_to"],"properties":{"pay_to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"the address that should have received the payment (yours)"},"amount":{"type":"string","description":"expected amount in atomic USDC (6 decimals); optional"}}},"payer":{"type":"object","properties":{"wallet":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"the paying wallet, for on-chain history"}}},"counterparty_name":{"type":"string","description":"name you know for the payer (e.g. from your KYC); screened against sanctions, stored only as SHA-256"},"purpose":{"type":"string","description":"optional non-identifying label"}}}}}},"responses":{"200":{"description":"settlement {status: confirmed|not_found|failed|network_unsupported, to_matches_expected, amount_matches, payer}, payer_onchain {payments, unique_payers, volume_usdc, window_days} | null, sanctions {name_screened, name_hit, lists_checked, matches[]}, attestation {key_id, algorithm, signature, verify}. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"A required source (sanctions lists) unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.25"},"protocols":[{"x402":{}}]}}},"/agent/phone-number":{"post":{"summary":"Buy a disposable phone number for SMS verification (resold for agents) — dynamic price from $0.30","description":"Buys a disposable phone number for one-time SMS verification, resold wholesale for AI agents. Provide a service (e.g. telegram, whatsapp, google, discord, openai) and optionally a country/operator; returns a reachable number plus an opaque handle. Poll the free POST /agent/phone-code with that handle for the incoming code (usually within a minute). Settle-on-delivery: no number available means no charge. Disposable use only — no guarantee that a given platform accepts it or that a code arrives. Lawful one-time verification only; every response carries an acceptable_use block listing prohibited uses (fraud, impersonation, sanctions evasion, etc.). Use constitutes acceptance and we do not knowingly facilitate criminal activity.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["service"],"properties":{"service":{"type":"string","pattern":"^[a-z0-9_]{1,32}$","description":"Platform to verify for, lowercase, e.g. telegram, whatsapp, google, discord, openai"},"country":{"type":"string","pattern":"^[a-z0-9_]{1,32}$","description":"Optional country slug (e.g. england, usa); default is server-configured"},"operator":{"type":"string","pattern":"^[a-z0-9_]{1,32}$","description":"Optional operator slug; default 'any'"}}}}}},"responses":{"200":{"description":"{handle, number, service, country, operator, order_status, expires_at, poll{endpoint, body{handle}}}. Use handle with POST /agent/phone-code. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"429":{"description":"Wallet rate-limited; no settlement."},"503":{"description":"No number available or provider unavailable; no charge."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.3"},"protocols":[{"x402":{}}]}}},"/agent/phone-code":{"post":{"summary":"Free — poll the incoming SMS code for a bought number","description":"Free companion to POST /agent/phone-number. Give the handle returned there; returns the order status (pending|received|finished|canceled|timeout|banned) and, once arrived, the SMS code. Repeat until status is 'received'. The handle is a capability token, so only the buyer can read the code. Numbers live ~15 minutes; after that the handle expires.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["handle"],"properties":{"handle":{"type":"string","pattern":"^[0-9a-f]{16,64}$","description":"The handle returned by POST /agent/phone-number"}}}}}},"responses":{"200":{"description":"{status, code, number, sms[], expires_at}. status one of pending|received|finished|canceled|timeout|banned|unknown."},"400":{"description":"Invalid or missing handle."},"404":{"description":"Unknown or expired handle."},"503":{"description":"Number provider unavailable; retry shortly."}}}},"/agent/board":{"post":{"summary":"A shared kanban board your agents work on and your human steers — $2.00 for 30 days","description":"Buys a live kanban board that AI agents and the human behind them share for 30 days. One call returns an MCP endpoint, one key per agent, a board URL and a one-click access link for your human — no signup form, no password. Agents create, move and comment on cards over MCP under their own name, so the audit log shows who did what.\nThe human gets the same MCP endpoint, not a cut-down view of it. Connected to their own chat client — Claude, Gemini, Cursor, anything that speaks MCP — they can read every card, note and audit-log line their agents produced and steer from that conversation: assign work, move cards, leave notes, clear blockers. No separate dashboard to learn and no polling: they ask their assistant what the agents are doing and get a straight answer. The browser view is there for whoever prefers dragging cards, showing the same board live.\nWIP limits and the audit log are enforced by database rules, not by prompt, so no agent can route around them. Access links are single-use and free to replace via POST /agent/board/access; extend the board with POST /agent/board/renew. A private workspace for coordinating your own work — every response carries an acceptable_use block.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"board_name":{"type":"string","maxLength":120,"description":"Name of the board; defaults to 'Agent board'"},"agents":{"type":"array","maxItems":8,"items":{"type":"string"},"description":"One name per agent, each gets its own key and shows up by name in the audit log; defaults to ['agent']"},"human_name":{"type":"string","description":"Display name for the human who steers the board"},"human_email":{"type":"string","description":"Optional; only used as the account name. Leave it out and an unroutable address is generated — the access link works either way"}}}}}},"responses":{"200":{"description":"{board_handle, board_url, mcp_url, columns[], agents[{name, key}], human{access_url, board_url, mcp_url, note}, expires_at, renew{endpoint, body}, acceptable_use}. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Board application unavailable; no charge."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"2"},"protocols":[{"x402":{}}]}}},"/agent/board/renew":{"post":{"summary":"Extend an agent board by 30 days — $2.00","description":"Extends a board bought via POST /agent/board by another 30 days. Give the board_handle you were issued. Renewing before the end date adds the days on top; renewing after a lapse starts the month today. An expired board is frozen rather than deleted: the human keeps seeing it, every card, note and log line survives, and agents get a readable message telling them to renew instead of a transport error.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["board_handle"],"properties":{"board_handle":{"type":"string","pattern":"^[0-9a-f]{16,64}$","description":"The handle returned by POST /agent/board"}}}}}},"responses":{"200":{"description":"{board_handle, expires_at, checked_at}. Carries PAYMENT-RESPONSE."},"400":{"description":"Invalid or unknown handle; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Board application unavailable; no charge."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"2"},"protocols":[{"x402":{}}]}}},"/agent/board/access":{"post":{"summary":"Free — a fresh one-click access link for your human","description":"Free companion to POST /agent/board. The access link that signs your human in works once, so hand out a new one whenever they lose their session or want to open the board on another device. The board_handle is a capability token: nobody can request a link for somebody else's board.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["board_handle"],"properties":{"board_handle":{"type":"string","pattern":"^[0-9a-f]{16,64}$","description":"The handle returned by POST /agent/board"}}}}}},"responses":{"200":{"description":"{board_handle, access_url, note, checked_at}."},"400":{"description":"Invalid or missing handle."},"404":{"description":"Unknown handle."},"503":{"description":"Board application unavailable; retry shortly."}}}},"/agent/board/keys":{"post":{"summary":"Free — a fresh agent key, or one more agent on the board","description":"Free companion to POST /agent/board. Agent keys are issued once and stored only as a hash, so a lost key cannot be looked up — ask for a new one here instead of buying a new board. Name an agent that is already on the board and it gets an additional key while its earlier keys keep working, so a run in progress does not break. Name a new agent and it is added to the board, up to eight. The board_handle is a capability token: nobody can mint a key for somebody else's board.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["board_handle"],"properties":{"board_handle":{"type":"string","pattern":"^[0-9a-f]{16,64}$","description":"The handle returned by POST /agent/board"},"agent":{"type":"string","maxLength":60,"description":"Agent name; an existing name gets an extra key, a new name is added to the board. Defaults to 'agent'"}}}}}},"responses":{"200":{"description":"{board_handle, agent{name, key}, added, note, checked_at}."},"400":{"description":"Invalid handle, or the board already has eight agents."},"404":{"description":"Unknown handle."},"503":{"description":"Board application unavailable; retry shortly."}}}},"/agent/request":{"post":{"summary":"Free — file what you tried to buy and could not","description":"Free intake for coverage gaps. Whenever a paid endpoint rejects your request because a requested value is not covered (an unsupported coin, an uncovered country, a host we do not monitor, an unsupported network), the 400 carries a machine-readable request_coverage block with exactly the body to send here. Filing costs nothing and is not a promise that it gets built; it counts towards what does. Only coverage identifiers are aggregated or resold: kind and value must be enum-like identifiers (letters, digits, space and . _ : / - only), so names, registration numbers and e-mail addresses are rejected on purpose. The optional note is stored for us and never resold verbatim. Your IP is stored only as a keyed hash, used for the cap of 20 filings per caller per day. If you have budget and volume behind the request, file it as a paid intent via POST /agent/want ($0.01) instead.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","value"],"properties":{"kind":{"type":"string","maxLength":32,"pattern":"^[A-Za-z0-9 ._:/-]+$","description":"What sort of coverage is missing, e.g. coin, country, monitor_host, network, sms_service"},"value":{"type":"string","maxLength":80,"pattern":"^[A-Za-z0-9 ._:/-]+$","description":"The exact value that is not covered, e.g. DOGE-EUR, PT, api.example.com"},"endpoint":{"type":"string","description":"Optional paid endpoint path you were calling, e.g. /crypto/verdict. Unknown paths are stored as null rather than rejected."},"note":{"type":"string","maxLength":280,"description":"Optional free text for us. Stored, never resold verbatim, never part of /x402/demand-report."}}}}}},"responses":{"200":{"description":"{recorded: true, kind, value, endpoint, message, committed_intent, aggregate_report, privacy, checked_at}.","content":{"application/json":{"schema":{"type":"object","required":["recorded","message","checked_at"],"properties":{"recorded":{"type":"boolean","description":"True when the filing is stored. No row id is returned: a sequential id would disclose how much intake we receive, and there is no lookup endpoint."},"kind":{"type":"string"},"value":{"type":"string"},"endpoint":{"type":["string","null"],"description":"The endpoint as stored — null when the path you sent is not one of our paid endpoints."},"endpoint_note":{"type":"string","description":"Present only when the endpoint you sent was dropped","explaining why.":null},"message":{"type":"string"},"committed_intent":{"type":"object","description":"Pointer to the paid alternative: POST /agent/want ($0.01)."},"aggregate_report":{"type":"object","description":"Pointer to the aggregated picture for sale: POST /x402/demand-report ($0.05)."},"privacy":{"type":"string"},"checked_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"missing_kind, missing_value, invalid_kind, invalid_value or invalid_note — the message states the exact rule."},"429":{"description":"rate_limited — more than 20 filings per caller per day; retry_after_seconds counts to midnight UTC. The paid POST /agent/want has no such cap."},"503":{"description":"store_unavailable — nothing was stored; retry shortly."}}}},"/agent/want":{"post":{"summary":"File a paid intent for something you cannot buy yet — $0.01 per call","description":"The paid counterpart of POST /agent/request. Same signal, with a fee in front of it: one cent is too little to earn anything and enough to make sybil filling unattractive, so a budget-backed intent can outrank an anonymous wish. What you buy is the record itself — the fee is explicitly not a purchase of the capability, not a subscription, and no promise that this gets built. Optionally name the price per call you would pay and your expected monthly volume. Your intent is counted in /x402/demand-report aggregated and anonymised: your wallet is stored only as a keyed hash and the text of your intent is never resold verbatim. Sending kind/value is what makes an intent countable per coverage value. 429 is never returned: this endpoint is not wallet-guarded.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["want"],"properties":{"want":{"type":"string","minLength":10,"maxLength":280,"description":"What you want to buy and cannot buy today, in your own words."},"kind":{"type":"string","maxLength":32,"pattern":"^[A-Za-z0-9 ._:/-]+$","description":"Optional coverage kind, typically one of coin, country, vies_country, monitor_host, sms_service — free-form values possible"},"value":{"type":"string","maxLength":80,"pattern":"^[A-Za-z0-9 ._:/-]+$","description":"Optional coverage value, e.g. PT"},"max_price_usd":{"type":"number","minimum":0,"maximum":1000,"description":"Optional USD per call you would actually pay."},"expected_calls_per_month":{"type":"integer","minimum":1,"maximum":10000000,"description":"Optional expected monthly call volume."}}}}}},"parameters":[{"in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"},"description":"Base64-encoded x402 v2 payment payload. Omit to receive HTTP 402 with payment requirements."}],"responses":{"200":{"description":"Intent recorded. Carries the PAYMENT-RESPONSE settlement header.","headers":{"PAYMENT-RESPONSE":{"schema":{"type":"string"},"description":"Base64 JSON settlement response (transaction hash, network, payer)."}},"content":{"application/json":{"schema":{"type":"object","required":["query","intent_id","recorded","note","checked_at"],"properties":{"query":{"type":"object","description":"The validated input echoed back."},"intent_id":{"type":"string","description":"Opaque reference for this intent, e.g. want_a1b2c3d4e5f6 — random rather than sequential, so it discloses no volume. There is no lookup endpoint."},"recorded":{"type":"boolean","description":"Always true on a 200; a storage failure is a 503 and is not charged."},"note":{"type":"string","description":"Verbatim boundary: the fee keeps intents honest and buys nothing else."},"checked_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"missing_want, invalid_want (outside 10-280 characters), invalid_kind, invalid_value, invalid_max_price_usd or invalid_expected_calls_per_month; no settlement."},"402":{"description":"Payment required — x402 v2 PaymentRequired in body and PAYMENT-REQUIRED header."},"409":{"description":"payment_proof_fingerprint_mismatch — this proof is bound to a different request."},"502":{"description":"settlement_unknown — retry with the SAME payment proof; never pay again on this error."},"503":{"description":"source_unavailable (demand_store) — the intent could not be stored, so you were not charged."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/eu/sanctions-screen":{"post":{"summary":"EU + UN sanctions screening of entities (official consolidated lists) — $0.015 per call","description":"Screens a company/organisation name against the entity sections of the official EU consolidated financial sanctions list AND the UN Security Council consolidated list (no persons). Returns per match the source list (EU/UN), matched names, sanction programmes, designation date and source link, plus each list's generation date in lists_checked. All-or-nothing: both lists consulted or no charge.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Entity/company name to screen"}}}}}},"responses":{"200":{"description":"result listed|not_listed, matches[] with list (EU|UN), names, programmes, designation_date, url; lists_checked[] with generation_date and register_url per list. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error (person queries rejected); no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Sanctions list unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.015"},"protocols":[{"x402":{}}]}}},"/eu/token-registry":{"post":{"summary":"MiCA token/issuer registry check (ESMA) — $0.01 per call","description":"Searches the ESMA interim MiCA register token lists (EMT issuers, ART issuers, notified white papers) by issuer name, LEI or Digital Token Identifier (DTI).\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"issuer":{"type":"string"},"lei":{"type":"string","pattern":"^[A-Za-z0-9]{20}$"},"dti":{"type":"string"}}}}}},"responses":{"200":{"description":"result found|not_found, matches[] with type (emt_issuer|art_issuer|white_paper), issuer, member state, DTIs, white-paper URL. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"ESMA register unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/uk/company":{"post":{"summary":"UK company check (Companies House) — $0.01 per call","description":"Official UK company data from Companies House. Look up by company number (full profile incl. status, insolvency-history and charges flags) or search by name (up to 5 candidates).\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_number":{"type":"string","pattern":"^[A-Za-z0-9]{6,8}$"},"name":{"type":"string"}}}}}},"responses":{"200":{"description":"result found|not_found; profile (by number) or candidates[] (by name), each with a Companies House direct link. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Companies House unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/fr/company":{"post":{"summary":"French company check (INSEE Sirene, open data) — $0.01 per call","description":"Official French company data from the INSEE Sirene register via the French government's open company-data API. Look up by SIREN (full profile incl. administrative status, legal form and NAF codes, head office and SIRET) or search by name (up to 5 candidates). Companies only; no director or officer data.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"siren":{"type":"string","pattern":"^\\d{9}$","description":"9-digit SIREN (exact); provide this or 'name'"},"name":{"type":"string","description":"Company name to search"}}}}}},"responses":{"200":{"description":"result found|not_found; profile (by SIREN) or candidates[] (by name), each with a direct Annuaire des Entreprises link. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error (incl. person_query_rejected); no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"French register unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/fr/insolvency":{"post":{"summary":"French insolvency check (BODACC, open data) — $0.10 per call","description":"Checks BODACC, the official French bulletin of civil and commercial announcements, for insolvency-related publications matched on SIREN: collective procedures (sauvegarde, redressement, liquidation judiciaire), conciliation and professional recovery. A no_match means no matching publication in the searchable open-data set (publications since 2008) — not a historical clearance. Companies only.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siren"],"properties":{"siren":{"type":"string","pattern":"^\\d{9}$","description":"9-digit SIREN (exact match)"}}}}}},"responses":{"200":{"description":"result match|no_match, matches[] with judgment (type, family, nature, date), court, publication date and source_reference (publication_id, direct_url), coverage, disclaimer. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement. missing_siren includes alternative /fr/company."},"402":{"description":"Payment required — x402 v2."},"429":{"description":"Wallet rate limit; no settlement."},"503":{"description":"BODACC unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.1"},"protocols":[{"x402":{}}]}}},"/no/company":{"post":{"summary":"Norwegian company check (Enhetsregisteret, open data) — $0.01 per call","description":"Official Norwegian company data from the Enhetsregisteret (Brønnøysund Register Centre). Look up by 9-digit organisation number (full profile incl. register bankruptcy and liquidation flags) or search by name (up to 5 candidates). Companies only; sole proprietorships are excluded from name candidates.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organisation_number":{"type":"string","pattern":"^\\d{9}$","description":"9-digit organisation number (exact); provide this or 'name'"},"name":{"type":"string","description":"Company name to search"}}}}}},"responses":{"200":{"description":"result found|not_found; profile (incl. bankruptcy, under_liquidation flags) or candidates[], each with a direct register link. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Norwegian register unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/cz/company":{"post":{"summary":"Czech company check (ARES, open data) — $0.01 per call","description":"Official Czech company data from ARES (Ministry of Finance). Look up by 8-digit ICO (full profile incl. VAT number and NACE codes) or search by name (up to 5 candidates). Companies only; individual entrepreneurs are excluded from name candidates.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ico":{"type":"string","pattern":"^\\d{8}$","description":"8-digit ICO (exact); provide this or 'name'"},"name":{"type":"string","description":"Company name to search"}}}}}},"responses":{"200":{"description":"result found|not_found; profile or candidates[], each with a direct ARES link. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"ARES unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/ch/company":{"post":{"summary":"Swiss company check (Zefix, open access) — $0.01 per call","description":"Official Swiss company data from the Zefix register (Central Business Name Index, federal). Look up by UID (full profile incl. name translations, register status active/in_liquidation/deleted, legal seat, purpose and address) or search by name (up to 5 candidates). Companies only; sole proprietorships are excluded from name candidates. Every result links to the authoritative cantonal register excerpt.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uid":{"type":"string","description":"Swiss UID (exact), e.g. CHE-105.909.036 or CHE105909036; provide this or 'name'"},"name":{"type":"string","description":"Company name to search"}}}}}},"responses":{"200":{"description":"result found|not_found; profile (incl. status, delete_date, name_translations) or candidates[], each with a direct register link. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Zefix unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/fi/company":{"post":{"summary":"Finnish company check (YTJ/PRH, open data) — $0.01 per call","description":"Official Finnish company data from the YTJ register (PRH open data). Look up by Business ID (full profile incl. registered company situations such as bankruptcy or liquidation) or search by name (up to 5 candidates). Companies only.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"business_id":{"type":"string","pattern":"^\\d{7}-\\d$","description":"Finnish Business ID (exact)","e.g. 0112038-9; provide this or 'name'":null},"name":{"type":"string","description":"Company name to search"}}}}}},"responses":{"200":{"description":"result found|not_found; profile (incl. company_situations[], raw YTJ status codes) or candidates[], each with a direct YTJ link. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"PRH unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/pl/company":{"post":{"summary":"Polish VAT whitelist check incl. bank account verification — $0.01 per call","description":"Checks the official Polish VAT whitelist (Ministry of Finance) by 10-digit NIP: VAT status (active/exempt/not_registered), REGON/KRS, address and registered-account count, plus the official consultation confirmation id (request_id). Optionally verifies whether a 26-digit bank account number (NRB) is registered to that company in the tax register — the standard Polish invoice-fraud check before paying a supplier.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["nip"],"properties":{"nip":{"type":"string","pattern":"^\\d{10}$","description":"10-digit Polish tax identification number"},"bank_account":{"type":"string","description":"Optional 26-digit NRB account number","optionally prefixed with PL":null}}}}}},"responses":{"200":{"description":"result found|not_found; subject (VAT status etc.), account_check {assigned, request_id} | null, request_id, request_date. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error; no settlement."},"402":{"description":"Payment required — x402 v2."},"503":{"description":"Whitelist API unavailable (incl. source daily query limits); no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/nl/insolvency":{"post":{"summary":"Dutch insolvency check (Centraal Insolventieregister) — $0.15 per call","description":"Verifies whether a Dutch company has a published insolvency procedure against the Central Insolvency Register of the Dutch judiciary. Best results with a KVK number (exact match). A no_match means no matching publication in the currently searchable register (publications since 2005; entries removed 6 months after termination) — not a historical clearance. Companies only; queries identifying private individuals are rejected. Matches include a source reference with a direct link.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Company name"},"kvk_number":{"type":"string","pattern":"^\\d{8}$","description":"Strongly recommended (exact register key)"},"city":{"type":"string"}}}}}},"responses":{"200":{"description":"result match|no_match, matches[] with procedure type/status/dates/court and source_reference (publication_id, insolvency_number, direct_url), coverage, uncertainty, disclaimer. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error (incl. person_query_rejected); no settlement."},"402":{"description":"Payment required (x402 accepts[])."},"409":{"description":"Payment proof bound to a different request."},"429":{"description":"Wallet rate limit (60/hour, 300/24h on company-check routes); no settlement."},"502":{"description":"settlement_unknown — retry with the SAME payment proof."},"503":{"description":"Register unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.15"},"protocols":[{"x402":{}}]}}},"/eu/supplier-screen":{"post":{"summary":"European supplier screening with honest coverage matrix — $0.15 per call","description":"One call, routed by country (NL, FR, UK, NO, CH, CZ, FI, PL) to the best available official open sources. Register profile (all except NL — KVK is not open data), insolvency signal (full register search for NL/FR, register flags for UK/NO/CH/FI, not covered for CZ/PL), VAT validation (VIES where vat_number is given for NL/FR/CZ/FI; Polish whitelist by NIP for PL; not covered for UK/NO/CH), EU + UN sanctions screening on the provided name AND the official register name (matches carry matched_on), and normalised name verification. The coverage object states per dimension what was and was not covered — an uncovered dimension is a gap, not a clean result. All-or-nothing: any required source failing means no charge.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["country","name","registration_number"],"properties":{"country":{"type":"string","enum":["NL","FR","UK","NO","CH","CZ","FI","PL"]},"name":{"type":"string","description":"Legal/company name"},"registration_number":{"type":"string","description":"National register number: KVK (NL), SIREN (FR), company number (UK), orgnr (NO), UID (CH), ICO (CZ), Business ID (FI), NIP (PL)"},"vat_number":{"type":"string","description":"Optional; VIES validation for NL/FR/CZ/FI only"}}}}}},"responses":{"200":{"description":"register, insolvency, vat, sanctions, name_verification, identity_linkage (not_verified), attention_items[], coverage matrix, disclaimer. Carries PAYMENT-RESPONSE."},"400":{"description":"Machine-readable input error (incl. country_not_supported, vat_number_not_supported_for_country); no settlement."},"402":{"description":"Payment required — x402 v2."},"429":{"description":"Wallet rate limit; no settlement."},"502":{"description":"settlement_unknown — retry with the SAME payment proof."},"503":{"description":"A required source for the chosen country is unavailable; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.15"},"protocols":[{"x402":{}}]}}},"/nl/supplier-screen":{"post":{"summary":"Dutch supplier screening (VIES + insolvency + name consistency) — $0.15 per call","description":"Screen a Dutch company before a transaction in one call. All-or-nothing: only charged when both registers were successfully consulted. Returns factual attention_items — no risk scores. identity_linkage is always not_verified: this check does not verify that the supplied KVK and VAT number belong to the same legal entity, nor that the entity is currently active.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["legal_name","kvk_number","vat_number"],"properties":{"legal_name":{"type":"string"},"kvk_number":{"type":"string","pattern":"^\\d{8}$"},"vat_number":{"type":"string","description":"e.g. NL123456789B01"}}}}}},"responses":{"200":{"description":"vat (VIES), insolvency (CIR), name_verification, identity_linkage (not_verified), attention_items[], disclaimer. Carries PAYMENT-RESPONSE."},"400":{"description":"Missing/invalid fields, with alternative single-source routes; no settlement."},"402":{"description":"Payment required (x402 accepts[])."},"409":{"description":"Payment proof bound to a different request."},"429":{"description":"Wallet rate limit; no settlement."},"502":{"description":"settlement_unknown — retry with the SAME payment proof."},"503":{"description":"One of the registers unavailable — no partial paid result; no settlement."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.15"},"protocols":[{"x402":{}}]}}},"/mcp":{"post":{"summary":"MCP server (streamable HTTP, JSON-RPC 2.0)","description":"One MCP tool per paid endpoint (23 tools), including buy_phone_number, get_phone_code, screen_eu_supplier, check_crypto_firm, screen_eu_sanctions, lookup_lei, verify_eu_vat and the country-specific company checks. A tools/call without payment returns the x402 payment requirements in the tool result; pay and retry with the base64 payment payload in _meta[\"x402/payment\"].\n","responses":{"200":{"description":"JSON-RPC response."}}}},"/health":{"get":{"summary":"Free health endpoint","responses":{"200":{"description":"Source health status (from the 5-minute healthcheck: CIR, VIES, rotating probes of the other registers, Base RPC and the freshness of the sanctions lists and Bazaar index). status is 'ok' (all known sources healthy), 'degraded' (at least one unhealthy) or 'unknown' (no check data yet).\n","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded","unknown"]},"checked_at":{"type":"string","format":"date-time"},"sources":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"healthy":{"type":"boolean"},"checked_at":{"type":"string"},"latency_ms":{"type":["integer","null"]}}}}}}}}}}}}},"components":{"schemas":{"CryptoDisclaimer":{"type":"string","description":"Our product boundary, carried verbatim in every paid advice response: market intelligence only, no execution, no custody, no position sizing, and opportunity_score is a heuristic rather than a calibrated win probability.\n"},"CryptoClassification":{"type":"string","enum":["STRONG_LONG","LONG","CONDITIONAL_LONG","SPECULATIVE_LONG","WATCH","NEUTRAL","AVOID","EXIT"],"description":"Spot-long classification derived from opportunity_score (shorts are never advised). Score bands: 80-100 STRONG_LONG, 65-79 LONG, 50-64 CONDITIONAL_LONG, 35-49 SPECULATIVE_LONG (a concrete entry setup exists) or WATCH (no concrete setup, so entry_zone/stop_loss/take_profit are null), below 35 AVOID (actively negative signals) or NEUTRAL (nothing either way). EXIT is reserved for a fresh, strong exit condition. A candidate with internal execution blockers is capped at CONDITIONAL_LONG upstream and can never appear as STRONG_LONG or unconditional LONG.\n"},"CryptoPublicationStatus":{"type":"string","enum":["PUBLISHED","STALE","INVALIDATED"],"description":"Publication state of the advice itself. PUBLISHED = live and current, STALE = still retrievable history but its entry window has closed, INVALIDATED = an invalidation condition triggered. Expired ids stay retrievable with their real status rather than disappearing.\n"},"CryptoSignalStatus":{"type":"string","enum":["ACTIVE","STALE","INVALIDATED"],"description":"Live status at call time. ACTIVE = published AND the entry window is still open, STALE = published but the entry window closed (the hold horizon may still run), INVALIDATED = an invalidation condition triggered. Only ACTIVE means \"this is a current new-entry advice\".\n"},"CryptoOpportunityType":{"type":"string","enum":["PULLBACK","BREAKOUT"],"description":"Setup shape from the strategy: PULLBACK enters on a retracement within an existing trend, BREAKOUT enters on a move through a resistance level.\n"},"CryptoScoreType":{"type":"string","enum":["heuristic_v1"],"description":"Which scoring scheme produced opportunity_score. 'heuristic_v1' is a deterministic, unit-tested heuristic — it explicitly signals that the score is NOT a calibrated probability. A future calibrated scheme would carry a different value here. Scores are only comparable within one score_type: a score 70 of heuristic_v1 says nothing about a score 70 of a future heuristic_v2, so any ranking, threshold or history you build resets when this value changes.\n"},"CryptoEvidenceStatus":{"type":"string","enum":["UNVALIDATED","EARLY_EVIDENCE","VALIDATED","REJECTED"],"description":"How far out-of-sample validation of a model or strategy has come. UNVALIDATED = no measured outcomes yet (usually sample_count 0), EARLY_EVIDENCE = some measured outcomes but too few to lean on, VALIDATED = enough measured evidence to hold up, REJECTED = measured and found not to work. Weigh advice accordingly.\n"},"CryptoOpportunityScore":{"type":"integer","minimum":0,"maximum":100,"description":"0-100 heuristic ranking of setup quality, combining trend alignment, EMA separation, momentum, volume, breakout/pullback strength, efficiency ratio, regime direction, ML horizon scores, estimated net edge and data/spread quality. This is NOT a calibrated win probability and must not be read as one; the measured win rate lives in /crypto/evidence (metrics.win_rate_pct, with its Wilson interval).\n"},"CryptoEconomics":{"type":"object","description":"Estimated round-trip economics in percent of position value (1.8 means 1.8%), two decimals. Taker = crossing the spread for an immediate fill; maker = a passive limit order that is cheaper but may never fill. Any value the source cannot compute is null (e.g. for WATCH/NEUTRAL/AVOID, which have no concrete target).\n","properties":{"gross_target_pct":{"type":["number","null"],"description":"Gross move from entry to take_profit in percent, before any cost; null when there is no concrete setup."},"estimated_taker_cost_pct":{"type":["number","null"],"description":"Estimated total round-trip cost in percent when entering and exiting as taker (fees plus expected spread/slippage)."},"estimated_maker_cost_pct":{"type":["number","null"],"description":"Estimated total round-trip cost in percent assuming passive maker fills on both sides."},"estimated_net_taker_pct":{"type":["number","null"],"description":"gross_target_pct minus estimated_taker_cost_pct — the edge that survives immediate execution. Can be negative, and then the setup is not worth taking as taker."},"estimated_net_maker_pct":{"type":["number","null"],"description":"gross_target_pct minus estimated_maker_cost_pct — only realistic if your passive order actually fills; see maker_fill_not_guaranteed."},"maker_fill_not_guaranteed":{"type":"boolean","description":"Always true. The maker figures assume an unguaranteed passive fill, so never plan on them as if the fill were certain."}}},"CryptoExecution":{"type":"object","description":"Internal eligibility metadata of the UPSTREAM system — informational only, never a permission or prohibition for you. The upstream system can block a candidate for its own reasons (position limits, cost floors, cooldowns) while the opportunity is perfectly publishable externally. We never decide whether you may enter.\n","properties":{"allowed":{"type":"boolean","description":"Whether the upstream system would trade this candidate itself right now. Says nothing about whether you should."},"blocked_by":{"type":"array","items":{"type":"string"},"description":"snake_case blocker tokens explaining allowed=false, e.g. ml_1h_below_threshold, net_edge_below_cost_floor, intraday_trading_disabled, max_positions_reached, not_promoted_for_live, cooldown_active. Empty array when allowed is true.\n"}}},"CryptoNextCall":{"type":["object","null"],"description":"Machine-readable next step in the advice chain (scan → signal → validate → evidence → check), so an agent can follow the workflow without reading documentation. null means there is explicitly nothing useful to call now; then next_check_after says when to come back.\n","properties":{"tool":{"type":"string","enum":["get_crypto_signal","validate_crypto_signal","get_crypto_evidence","check_crypto_signal"],"description":"MCP tool name of the next step; the matching HTTP routes are POST /crypto/signal, /crypto/validate, /crypto/evidence and /crypto/check."},"arguments":{"type":"object","description":"Arguments to pass verbatim, e.g. {\"signal_id\":\"sig_a1b2c3d4e5f6\"}, plus known_version for check_crypto_signal."},"reason":{"type":"string","description":"Why this is the useful next step, in plain language."}}},"CryptoScanItem":{"type":"object","description":"Compact opportunity from /crypto/scan — enough to rank and pick, not enough to act on; buy /crypto/signal for the full advice.","properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"Stable id of this opportunity across versions; the input for every other call in the chain."},"version":{"type":"integer","description":"Version of this advice; starts at 1 and increments on every material change."},"coin":{"type":"string","description":"Product id of the market, e.g. 'BTC-EUR'."},"classification":{"$ref":"#/components/schemas/CryptoClassification"},"opportunity_score":{"$ref":"#/components/schemas/CryptoOpportunityScore"},"score_type":{"$ref":"#/components/schemas/CryptoScoreType"},"opportunity_type":{"$ref":"#/components/schemas/CryptoOpportunityType"},"publication_status":{"$ref":"#/components/schemas/CryptoPublicationStatus"},"published_at":{"type":"integer","description":"Unix seconds — when this version was published."},"entry_valid_until":{"type":"integer","description":"Unix seconds — end of the 30-minute new-entry window; after it the item is no longer a current entry advice."},"freshness_seconds":{"type":"integer","description":"Age of this item in seconds at scan time (now minus published_at); lower is fresher."}}},"CryptoMlHorizon":{"type":"object","description":"One machine-learning horizon behind the advice, with its own validation status.","properties":{"horizon_seconds":{"type":"integer","description":"Prediction horizon in seconds, e.g. 3600 for the 1-hour model."},"score":{"type":["number","null"],"description":"Model output for this horizon (0-1); null when the model produced nothing usable."},"threshold":{"type":["number","null"],"description":"Value the score must exceed for this horizon to count as supportive; score below threshold is a common upstream execution blocker."},"model_version":{"type":"string","description":"Identifier of the model, e.g. 'gbdt-intraday-v1-1h'."},"evidence_status":{"$ref":"#/components/schemas/CryptoEvidenceStatus"},"sample_count":{"type":"integer","description":"Measured outcomes behind this model's evidence_status; 0 means nothing has been validated yet, so treat its score as unproven."}}},"CryptoAdvice":{"type":"object","description":"The full published advice, passed through 1:1 from the upstream advice system. entry_zone, stop_loss, take_profit and reward_risk are null for WATCH, NEUTRAL and AVOID, because those classifications carry no concrete entry setup. Buying such a signal is still a valid $0.01 call and a complete answer: you pay for the assessment (classification, score, factors, conditions, economics, ML), not for the presence of a setup.\n","properties":{"signal_id":{"type":"string","pattern":"^sig_[0-9a-f]{12}$","description":"Stable id across versions of the same opportunity."},"version":{"type":"integer","description":"Version of this advice; increments on every material change (see change_types on /crypto/check)."},"coin":{"type":"string","description":"Product id of the market, e.g. 'BTC-EUR'."},"strategy":{"type":"string","description":"Strategy version that produced this advice, e.g. 'momentum-breakout-v1'; the scope of /crypto/evidence."},"opportunity_type":{"$ref":"#/components/schemas/CryptoOpportunityType"},"classification":{"$ref":"#/components/schemas/CryptoClassification"},"opportunity_score":{"$ref":"#/components/schemas/CryptoOpportunityScore"},"score_type":{"$ref":"#/components/schemas/CryptoScoreType"},"estimated_win_probability":{"type":["number","null"],"description":"Always null until a calibrated probability model exists — we deliberately do not dress opportunity_score up as a probability. Use /crypto/evidence for the measured win rate."},"publication_status":{"$ref":"#/components/schemas/CryptoPublicationStatus"},"published_at":{"type":"integer","description":"Unix seconds — when this version was published."},"updated_at":{"type":"integer","description":"Unix seconds — when this advice was last updated upstream."},"as_of":{"type":"integer","description":"Unix seconds — market state this advice was computed on."},"entry_valid_until":{"type":"integer","description":"Unix seconds — end of the 30-minute window in which this is a current NEW-entry advice. It is not a position deadline; past it the signal is honestly reported as STALE.\n"},"expected_hold_until":{"type":"integer","description":"Unix seconds — expected holding horizon of the position, always later than entry_valid_until. The entry window can be closed while this horizon still runs.\n"},"entry_zone":{"type":["object","null"],"description":"Price range in which entering is advised; null for WATCH/NEUTRAL/AVOID because there is no concrete setup.","properties":{"min":{"type":"number","description":"Lower bound of the advised entry range, in the coin's quote currency."},"max":{"type":"number","description":"Upper bound of the advised entry range; above it you would be chasing (price_vs_entry_zone ABOVE)."}}},"stop_loss":{"type":["number","null"],"description":"Advised invalidation price for the position; null for WATCH/NEUTRAL/AVOID (no concrete setup)."},"take_profit":{"type":["number","null"],"description":"Advised target price; null for WATCH/NEUTRAL/AVOID (no concrete setup)."},"reward_risk":{"type":["number","null"],"description":"Ratio of the distance to take_profit over the distance to stop_loss, before costs; null when there is no concrete setup."},"setup_timeframe":{"type":["string","null"],"description":"Candle timeframe the setup was found on, e.g. '15m'; null when not applicable."},"positive_factors":{"type":"array","items":{"type":"string"},"description":"Arguments in favour of the setup, in plain language. May be empty."},"negative_factors":{"type":"array","items":{"type":"string"},"description":"Arguments against the setup, in plain language. Always read these alongside the score. May be empty."},"conditions":{"type":"array","items":{"type":"string"},"description":"Conditions under which the setup holds or strengthens, e.g. 'price holds above 58100'. May be empty."},"invalidation_conditions":{"type":"array","items":{"type":"string"},"description":"Conditions that kill the setup; when one triggers, /crypto/validate reports invalidation.invalidated=true. May be empty."},"economics":{"$ref":"#/components/schemas/CryptoEconomics"},"ml":{"type":"object","description":"Machine-learning support behind the advice, per prediction horizon.","properties":{"horizons":{"type":"array","items":{"$ref":"#/components/schemas/CryptoMlHorizon"},"description":"One entry per horizon; an empty array means no ML input was available."}}},"execution":{"$ref":"#/components/schemas/CryptoExecution"},"source":{"type":"object","description":"Provenance of the advice for auditing — strategy_version, analyst_model and analyst_prompt_version, critic_model and critic_prompt_version, regime_decision_id (may be null) and snapshot_id. Fields are informational and may be extended.\n","additionalProperties":true},"disclaimer":{"type":"string","description":"Verbatim disclaimer of the upstream advice system; repeated as source_disclaimer at envelope level."}}}}}}