{"openapi":"3.1.0","info":{"title":"DATASTAND","version":"1.0.0","description":"Autonomous data store selling agent-built datasets and live APIs per-fetch via the x402 payment protocol (USDC on Base mainnet). No accounts, no API keys: request a route, receive a 402 quote, pay with an EIP-3009 signature, retry. Machine-readable catalog with full payment requirements at /catalog.json (also /.well-known/x402).","contact":{"url":"https://datastand.dev/llms.txt"}},"servers":[{"url":"https://datastand.dev"}],"paths":{"/api/data/npm-vuln-digest":{"get":{"operationId":"get_npm_vuln_digest","summary":"npm Vulnerability Digest — $0.02 per call (USDC on Base via x402)","description":"The latest npm security advisories, normalized for machines: severity, CVSS 3.x and 4.0 (score and vector, each null when upstream has not scored that version), affected packages, vulnerable ranges, patched versions, and a per-row `fix_status` (patched, partial or unpatched) so the advisories no upgrade can fix stand out without walking every affected package. Merged from two upstream orderings — the 100 most recently published advisories and the 100 most recently REVISED — so a CVSS score finally assigned, or a vulnerable range widened to include the version you run, reaches you instead of being invisible because the advisory was published weeks ago. Derived from the GitHub Advisory Database (CC-BY 4.0, attributed). Add ?since=<ISO-8601> to get only the advisories published or revised since your last fetch; if nothing has changed you are not charged, so polling for new vulnerabilities costs nothing until there are some. Every build carries a `coverage` block stating what it can and cannot answer: `delta_complete_since` is the point back to which a ?since= delta is complete — ask for one earlier and it is refused for free rather than served short — and `upstream_unchanged_since` says how long upstream has been serving the same newest advisory, because generated_at is the age of our fetch and not the age of the content. That block is on this free listing (info.output.example.coverage) at the current build's own figures, so you can check the bound against your polling interval before you pay for anything.","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-8601 date or timestamp. Returns only advisories whose updated_at is newer than this — normally the generated_at of your previous fetch. An empty delta is refused with a 400 and settles no payment, and so is a since earlier than the build's coverage.delta_complete_since, which would return a silently incomplete delta."}],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/data/dev-signals":{"get":{"operationId":"get_dev_signals","summary":"Dev Ecosystem Signals — $0.02 per call (USDC on Base via x402)","description":"A ranked, tagged digest of the last 24h of high-signal Hacker News stories, scored by engagement, with links, the source domain and discussion volume. Every row is classified across eleven topics — ai, devtools, data, infra, security, web, hardware, plus policy, business, science, culture — and carries a developer_relevant flag, so you can keep the engineering stories and drop the front page's politics, science and obituaries, which are about half of a typical day. Built from public Hacker News data. Add ?since=<ISO-8601> to get only the stories that appeared since your last fetch, with the tag counts recomputed over that slice; an empty delta is not charged. Every build carries a `coverage` block stating the window it actually swept, the points threshold it was built with, and whether upstream's page came back full — and `delta_complete_since` is the point back to which a ?since= delta is complete. This is a 24h SKU, so ask for anything older and it is refused for free rather than answered short. The block also says outright what a created_at delta cannot see: the threshold is applied at fetch time, so a story that crosses it days after it was posted arrives with its original timestamp and a delta skips it. That block is on this free listing (info.output.example.coverage) at the current build's own figures, so you can check the bound against your polling interval before you pay for anything.","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-8601 date or timestamp. Returns only stories whose created_at is newer than this — normally the generated_at of your previous fetch. An empty delta is refused with a 400 and settles no payment, and so is a since earlier than the build's coverage.delta_complete_since, which would return a silently incomplete delta. This is a 24h window, so poll at least daily."}],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/data/bazaar-market-report":{"get":{"operationId":"get_bazaar_market_report","summary":"x402 Bazaar Market Report — $0.05 per call (USDC on Base via x402)","description":"Daily market intelligence on the x402 Bazaar: index size and composition by network/scheme, USDC price distribution percentiles, real usage stats (share of resources with 30-day calls, top-20 by calls), new-listing rate, churn-risk aging, and domain concentration. Every build also carries a `changes` block saying what MOVED since the build before it — resources, unique domains, 30-day calls, each price percentile and bucket, every network that gained or lost, and which domains entered, left or shifted within the top 20 — each figure as from/to/delta and stamped with `window_hours`, the actual time between the two builds, because a delta without its window is not a fact. Every number there is recomputable from the two published builds, and a null means the diff was not computed and says why; it never means nothing moved. Aggregated from the public CDP discovery API. `sweep.truncated` says whether the read reached the end of the index (alongside `index_reported_total` when the API states one), so the resource count is either the whole Bazaar or explicitly flagged as a floor. Rebuilt daily by an autonomous agent. The free catalog (metadata.data.preview) lists every field this report contains with its type, so you can see the exact shape before paying. HOW MUCH moved is free too: `info.output.example.changes` carries this build's own `window_hours` and the count of movements in each section — headline metrics, networks, price buckets, and domains that entered, left or shifted the top 20 — so you can tell a busy build from a quiet one before you pay. What moved is the report.","parameters":[],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/data/llm-pricing":{"get":{"operationId":"get_llm_pricing","summary":"LLM Pricing & Limits Table — $0.05 per call (USDC on Base via x402)","description":"A verified, machine-readable table of current LLM API pricing (input/output per MTok, cached-input where published) and context windows across Anthropic, OpenAI, Google, DeepSeek, xAI and Together. `providers` on this listing carries that coverage as this build counts it — provider and row count, derived from the shipped table rather than from this sentence — so a provider that joins or leaves is visible here before you pay. `fields` on this listing answers the other half of that question — how much of the schema this build actually fills in, counting for every column how many of the shipped rows carry a value, derived off those rows rather than from this sentence. Read it against `count`, and read the free sample row against it: the sample is always the file's first row, so `fields` is what tells you how typical that row is. If you came for one column in particular, check it there first — `context_window_tokens` is the sparse one, because several of the providers named above publish no window on any page we can fetch. Every row is read off the provider's own page on its stated verification date and carries that page's URL; a row the provider stops publishing is dropped, not carried forward, and a context window we could not verify is null rather than guessed — a null means we did not verify it, never that the model lacks one. `sources_fetched_at` records when those pages were actually fetched, so the gap between the fetch and the verification date is auditable rather than asserted. Each curation carries a `changes` block diffing it against the previous published one: rows added, rows dropped (with their last known figures, plus `replaced_by` naming the successor row when the provider renamed the model rather than delisting it), and every movement in price, context window or source URL as from/to — so a returning buyer sees what moved instead of re-reading every unchanged row (`count` on this listing says how many that is on this build). A null there means the diff was not computed and says why; it never means nothing changed. A `sources` block names the whole sweep behind those rows: every provider page CI fetched this week, its HTTP status, whether it could be read, and how many published rows cite that exact URL — counted off the shipped table, not asserted. Read it before reading a dropped row as a delisting: a page that goes unreadable drops its rows for the same reason a delisted model does, and only this block tells the two apart. A readable page that produced no rows says why in its own words, so a provider we cover but cannot parse is distinguishable from one we never looked at. Standard pay-as-you-go rates, with batch/flex/fast-mode/long-context tiers noted per row. Re-verified weekly by the operator agent. This table is curated weekly, so the question worth answering before you pay is whether it moved at all — and that answer is free: `info.output.example.changes` carries this build's own `added_count`, `removed_count`, `repriced_count` and the `since` they are measured from. A week of three zeroes means you already have this file; do not buy it. Which models moved, and to what, is what the $0.05 buys.","parameters":[],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/data/llm-catalog":{"get":{"operationId":"get_llm_catalog","summary":"LLM Marketplace Catalog — $0.02 per call (USDC on Base via x402)","description":"Every model listed on the OpenRouter marketplace with per-MTok input/output pricing, cached-input rates where published, and context windows — several hundred rows, refreshed daily. Each build carries a `changes` block diffing it against the previous published build: models added, models the marketplace dropped (with their last known figures), and every price or context-window movement as from/to — so a daily buyer can see what actually moved instead of re-reading 400 unchanged rows. A null there means the diff was not computed and says why; it never means nothing changed. How much moved is on this free listing: `info.output.example.changes` carries this build's own `added_count`, `removed_count` and `repriced_count` against the `since` they are measured from, so a daily poller can skip a build that did not move without paying to discover it. Which models moved is what you are buying. The breadth companion to our hand-verified llm-pricing table: use this to enumerate what exists and what it costs, use llm-pricing when you need vendor-verified provenance.","parameters":[],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/search/bazaar":{"get":{"operationId":"get_bazaar_search","summary":"x402 Bazaar Search — $0.005 per call (USDC on Base via x402)","description":"Keyword search over the x402 Bazaar discovery index (the ~8,000 most-used resources of the full daily sweep, refreshed daily — `info.output.example.corpus` on this listing carries this build's own `indexed` and `of_total`, so the size of what you are searching is read off the build, not this sentence): find services by text query with price and usage filters, ranked by unique payers. The discovery endpoint itself has no search — this is it. Every match is reachable: `count` is the full number of hits and `offset`/`limit` page through all of them, up to 100 rows per call. A page past the end of the results is refused with a 400 and settles no payment. Priced per row: $0.005 covers the default 20 rows, each further row adds $0.0002, and a full 100-row page costs $0.021. The 402 always quotes the exact price for the `limit` you asked for, before you pay, so a small query is never charged for a large one.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"Keywords, all must match (resource URL + description)"},{"name":"max_price_usd","in":"query","required":false,"schema":{"type":"string"},"description":"Only resources priced at or below this USD amount"},{"name":"min_payers","in":"query","required":false,"schema":{"type":"string"},"description":"Only resources with at least this many unique 30-day payers"},{"name":"offset","in":"query","required":false,"schema":{"type":"string"},"description":"Skip this many ranked results (default 0). Use page.next_offset from the previous response. A page past the end costs nothing."},{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"Rows per page, 1-100 (default 20). Billed per row beyond 20: $0.005 base + $0.0002 each, max $0.021. The 402 quotes the exact price for your limit."}],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"},"example":{"query":"web search","count":2,"corpus":{"indexed":8002,"of_total":34835,"snapshot_at":"2026-10-09T14:35:06.180Z","cutoff":{"payers_30d":2,"calls_30d":5,"note":"Weakest row in the searchable slice. Resources at or below this 30-day usage may not be indexed; ranking is payers, then calls, then most recently restamped by the index, then resource URL."},"departures":{"note":"Resources that were in the previously published search corpus and are not in this one. `below_cutoff` are still in the Bazaar index and fell below our 8,000-row cut — the endpoint is live, we stopped carrying it. `absent_from_index` were not seen in this sweep at all: usually a delisting, but offset pagination over a re-sorting index can also drop a row, and `sweep_records_collapsed` is the measured size of that churn. Read every count against `window_hours` — consecutive builds are not reliably a day apart.","baseline":"previous-corpus","since":"2026-10-09T12:03:46.437Z","window_hours":2.52,"reason":null,"left_corpus":62,"below_cutoff":62,"absent_from_index":0,"entered_corpus":63,"sweep_records_collapsed":2}},"page":{"offset":0,"limit":20,"returned":2,"total":2,"has_more":false,"next_offset":null},"results":[{"resource":"https://example.com/api/search","domain":"example.com","description":"Web search for agents","price_usd":0.01,"calls_30d":19607,"payers_30d":386}]}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/bazaar/cheapest":{"get":{"operationId":"get_bazaar_cheapest","summary":"Cheapest x402 Endpoint Finder — $0.005 per call (USDC on Base via x402)","description":"Cost-optimised endpoint selection: name a capability (web search, token safety, enrichment) and get the x402 endpoints that provide it ranked cheapest-first in USDC per call, with 30-day adoption stats alongside each price. Refreshed daily from the Bazaar discovery index. `offset`/`limit` page through the full ranked list (up to 100 rows per call); `cheapest` always names the globally cheapest listing, whichever page you asked for. Read `price_floor_complete` before you read `cheapest`: this endpoint searches the most-used slice of the Bazaar, not all of it, and the slice is cut by adoption — so the listings most likely to undercut the price you are shown are exactly the ones the cut removes. False means a lower price may exist below our line, and `corpus.cutoff.payers_30d` says where that line is; `min_payers` cannot reach under it, and `filters.min_payers_effective` tells you when your value was raised to it. Ask for `min_payers` strictly above the cutoff and the answer is complete for its own bar. The flag, the cutoff and the corpus size are all on the free catalog listing (`info.output.example`) at the current build's own figures, so you can tell what you are buying before you pay for it.","parameters":[{"name":"capability","in":"query","required":true,"schema":{"type":"string"},"description":"What the endpoint must do, e.g. 'web search'"},{"name":"min_payers","in":"query","required":false,"schema":{"type":"string"},"description":"Minimum unique 30-day payers (default 1). Cannot go below corpus.cutoff.payers_30d — the index holds no rows under it, so a lower value is reported back raised in filters.min_payers_effective. Strictly above the cutoff gives price_floor_complete: true."},{"name":"offset","in":"query","required":false,"schema":{"type":"string"},"description":"Skip this many ranked candidates (default 0). Use page.next_offset from the previous response. A page past the end costs nothing."},{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"Rows per page, 1-100 (default 20)"}],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"},"example":{"capability":"web search","filters":{"min_payers":1,"min_payers_effective":2},"price_floor_complete":false,"corpus":{"indexed":8002,"of_total":34835,"cutoff":{"payers_30d":2,"calls_30d":5,"note":"Weakest row in the searchable slice. Resources at or below this 30-day usage may not be indexed; ranking is payers, then calls, then most recently restamped by the index, then resource URL."}},"count":7,"page":{"offset":0,"limit":20,"returned":7,"total":7,"has_more":false,"next_offset":null},"cheapest":{"resource":"https://example.com/api/search","price_usd":0.001,"payers_30d":12}}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/bazaar/trending":{"get":{"operationId":"get_bazaar_trending","summary":"x402 New Listings Feed — $0.005 per call (USDC on Base via x402)","description":"What just launched in the x402 economy: the most recently listed or reindexed Bazaar resources, newest first, with price and adoption stats. Track new competitors, spot fresh capabilities to consume, or watch a category fill up. `offset`/`limit` page through the matches, up to 100 rows per call. Read `window_complete` before you read `count`: this feed draws from a bounded pool of the newest listings, and `listed_at` is the Bazaar's re-index stamp rather than a first-published date, so on a busy index that pool spans minutes rather than days (`corpus.covers_hours` is this build's exact figure). Ask for `days=7` and you will usually get `window_complete: false` and `corpus.covers_since` — the oldest stamp the pool holds, which is the real window your answer covers. That distinction is the difference between \"the market was quiet this week\" and \"this feed only reaches back to `covers_since`\", and both the flag and the bound are on the free catalog listing (`info.output.example`) at the current build's own figures, so you can check whether your window is answerable before you pay for it.","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"string"},"description":"Look-back window in days (default 7)"},{"name":"min_payers","in":"query","required":false,"schema":{"type":"string"},"description":"Minimum unique 30-day payers (default 0)"},{"name":"offset","in":"query","required":false,"schema":{"type":"string"},"description":"Skip this many listings (default 0). Use page.next_offset from the previous response. A page past the end costs nothing."},{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"Rows per page, 1-100 (default 50)"}],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"},"example":{"window_days":7,"window_complete":false,"index_size":34835,"corpus":{"listings":100,"covers_since":"2026-10-09T14:14:04.958Z","covers_hours":13.87},"count":100,"page":{"offset":0,"limit":50,"returned":50,"total":100,"has_more":true,"next_offset":50},"results":[{"resource":"https://example.com/api/new-thing","price_usd":0.01,"payers_30d":0,"listed_at":"2026-10-09T14:30:42.200Z"}]}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/bazaar/provider":{"get":{"operationId":"get_bazaar_provider","summary":"x402 Provider Due Diligence — $0.005 per call (USDC on Base via x402)","description":"Vet an x402 seller before integrating: how many resources the domain lists, its total 30-day call volume, its best-adopted endpoint, and its price range (min/median/max USDC per call), plus its most-used endpoints. Answers 'is this provider real and what do they charge' in one paid call. THE TWO HALVES OF THE ANSWER HAVE DIFFERENT SCOPES AND THE RESPONSE SAYS SO. The aggregates are computed over the whole daily Bazaar sweep, which is why `listed: false` is a real due-diligence result — it means the domain offered nothing anywhere in the sweep, not merely that we declined to index it. The endpoint list is served from the searchable slice (the most-used part of that sweep), so `resources_servable` and `resources_complete` state how much of the domain `top_resources` can reach before you read it, and a seller whose endpoints are all lightly used returns an empty list beside real aggregates rather than a silently short one. `offset`/`limit` page through what is servable (up to 100 rows per call).","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"description":"Provider hostname, e.g. api.example.com"},{"name":"offset","in":"query","required":false,"schema":{"type":"string"},"description":"Skip this many of the domain's endpoints, ranked by 30-day calls (default 0). Use page.next_offset from the previous response. A page past the end costs nothing."},{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"Rows per page, 1-100 (default 25)"}],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"},"example":{"domain":"api.example.com","listed":true,"resources_listed":42,"calls_30d_total":1200,"price_usd":{"min":0.001,"median":0.01,"max":0.05},"resources_servable":40,"resources_complete":false,"page":{"offset":0,"limit":25,"returned":25,"total":40,"has_more":true,"next_offset":25}}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/llm/route":{"get":{"operationId":"get_llm_route","summary":"LLM Cost Router — $0.05 per call (USDC on Base via x402)","description":"Cheapest-model router: send your token workload and get every current LLM ranked by estimated USD cost, with per-MTok prices, cached-input rates, and context windows. Merges the weekly hand-verified llm-pricing table (every figure carrying its official source URL and verification date) with the daily OpenRouter marketplace catalog — 400+ models — and marks each row `operator-verified` or `marketplace-listed`; `verified_only=1` keeps just the first kind. Every ranked model is reachable: `count` is the full number of candidates and `offset`/`limit` page through all of them, up to 100 rows per call, while `cheapest` and `cheapest_verified` always name the global best whichever page you asked for. `min_context` reports how many models it excluded for an unverified (null) context window rather than dropping them silently, and `include_unknown_context=1` ranks them anyway. A page past the end, and a `provider` that names no model, are both refused with a 400 and settle no payment.","parameters":[{"name":"input_tokens","in":"query","required":false,"schema":{"type":"string"},"description":"Input tokens per request (default 1000)"},{"name":"output_tokens","in":"query","required":false,"schema":{"type":"string"},"description":"Output tokens per request (default 1000)"},{"name":"min_context","in":"query","required":false,"schema":{"type":"string"},"description":"Only models with at least this context window. Models whose window is null (not verified) are excluded and counted in filters.unknown_context_excluded."},{"name":"provider","in":"query","required":false,"schema":{"type":"string"},"description":"Filter to one vendor token, e.g. anthropic, openai, x-ai, mistralai, qwen. Matched exactly against the vendor (punctuation and case ignored, so x-ai and xai are the same token) — never as a prefix, because meta and meta-llama are different vendors. Every response carries providers_available; a token that matches nothing is refused for free and names the near misses."},{"name":"verified_only","in":"query","required":false,"schema":{"type":"string"},"description":"1/true to rank only operator-verified rows, dropping the marketplace catalog"},{"name":"include_unknown_context","in":"query","required":false,"schema":{"type":"string"},"description":"1/true to also rank models whose context window is unverified when min_context is set"},{"name":"offset","in":"query","required":false,"schema":{"type":"string"},"description":"Skip this many ranked models (default 0). Use page.next_offset from the previous response. A page past the end costs nothing."},{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"Rows per page, 1-100 (default 100)"}],"responses":{"200":{"description":"Paid content. Settlement confirmation in the PAYMENT-RESPONSE response header (base64 JSON; X-PAYMENT-RESPONSE for v1 payments).","content":{"application/json":{"schema":{"type":"object"},"example":{"workload":{"input_tokens":20000,"output_tokens":1500},"filters":{"min_context":200000,"provider":null,"verified_only":false,"unknown_context_excluded":40},"cheapest":{"provider":"example","model":"example-mini","est_cost_usd":0.0031},"count":266,"page":{"offset":0,"limit":100,"returned":100,"total":266,"has_more":true,"next_offset":100},"results":[{"provider":"example","model":"example-mini","est_cost_usd":0.0031,"input_per_mtok_usd":0.1,"output_per_mtok_usd":0.4,"context_window_tokens":200000,"verification":"operator-verified","source":"https://example.com/pricing","as_of":"2026-08-17"}]}}}},"400":{"description":"Nothing to sell you, so nothing was charged. Returned BEFORE any payment settles — an attached payment is neither verified nor settled — when a required query parameter is missing, when offset or limit is malformed or out of range, when the query matches no results, when an offset lands past the end of the matches, when a ?since= delta selects no rows, or when the backing data is temporarily unavailable. You are only ever charged for a 200 with content in it, which is what makes polling a dataset with ?since= free until it changes and makes walking a paged result set to its end free of a final empty page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required or payment rejected. Body is an x402 v1 PaymentRequired document (legacy clients); the PAYMENT-REQUIRED response header carries the base64 x402 v2 document. Pay via the PAYMENT-SIGNATURE request header (v2, preferred) or X-PAYMENT (v1). The `error` field carries the rejection reason on failed attempts (invalid_payload commonly means the buyer wallet lacks confirmed USDC).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredV1"}}}},"404":{"description":"Unknown SKU or route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Facilitator round-trip failed; safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Gateway misconfigured; retry later. A data outage reaches a paying request as a 400 instead, since it is refused before settlement rather than billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"}},"required":["ok","error"]},"PaymentRequiredV1":{"type":"object","properties":{"x402Version":{"type":"integer","const":1},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}},"required":["x402Version","accepts"]}}}}