Server definition
- Hash
- sha256:151248bd25a0f2820d201278f978ea47d0f210a8907b4532c493eca5224a98cc
- What it is
- What a remote MCP server returned when asked what it offers: 4 tools
The blob, as servednamed by its sha256
{
"instructions": "nohumans.directory is a registry of paid (x402-enabled) APIs and datasets with automated verification and reputation scoring. Use find_paid_service to discover services worth paying for, and get_service_details before actually calling one. Trust signals: status 'verified' means the endpoint has sustained a recency-weighted probe success score above 0.8 from our infrastructure (three clean probes for a new listing whose first probe passes; about sixteen when the score starts at zero, after a payment-address reset, a recovery from failing, or a failed first probe); score is a recency-weighted probe success rate (0..1), blended with an on-chain-verified payer-report score once a listing has 3+ distinct reporting payers. Prefer verified listings with score >= 0.8. Each result also carries has_sample (boolean): true means the listing declared a sample_query an agent can call — often free or cheap — to see real output shape before paying full price. For a new or low-probe-count listing you can't yet judge from reputation alone, has_sample is the fastest way to evaluate it cheaply; prefer has_sample listings when reputation signals are thin or tied. This is a continuously-rechecked check, not one-time: every probe cycle a declared sample must return HTTP 2xx and valid JSON or the whole probe fails, so 'verified' with has_sample true means the sample is live right now, not that its content is accurate — only payer reports (3+ distinct reporters) speak to correctness, and most listings don't have enough yet. Each result also carries evidence_tier: one of payer_reported, paid_verified, probe_verified, probe_only, unproven — a single field summarizing what kind of evidence actually stands behind a listing, strongest first, with evidence_note explaining it in one sentence. payer_reported means independent wallets that provably paid have reported on the outcome; paid_verified means we paid it real USDC and confirmed settlement on-chain; probe_verified means sustained protocol conformance from our infrastructure and says nothing about content accuracy; probe_only means passing but with a short history; unproven means failing or not yet established. Prefer higher tiers when choosing between listings of similar price. Each result also carries verdict_age_seconds: how old the newest evidence is — but probe cadence is deliberately uneven (settled listings are checked less often), so a large age is not staleness by itself; read it with status_changed_at. Each listing carries kind ('api' or 'agent'): 'agent' marks a stateful or non-deterministic task performer. For agent listings, probe status, payment-destination stability, and on-chain payer counts apply exactly as for APIs, but schema validation and freshness do not (correct output varies per call — the detail record says so explicitly under kind_notes), and paid verification means a real payment produced a well-formed response, not that the output was correct; payer reports are the quality instrument for agents. Each result also carries x402_version (1, 2, or null): which protocol version the endpoint's own 402 challenge actually used last time it was probed. Some x402 clients, including the widely-used x402-fetch v1 reference client, only read payment terms from the response body and will see nothing from a v2 header-transport challenge — check this before assuming a v2 listing is unreachable, and check get_service_details for the full observed detail (challenge_transport, scheme, network) if a call unexpectedly fails. Each result also carries last_probed_at (unix seconds, or null; last_probed_at_iso is the same time as an ISO 8601 string, and next_check_by and status_changed_at have _iso twins too): when the listing was last actually checked, pass or fail — a long-stable verified listing can show an older timestamp than a newer one because it's deliberately checked less often, not because it's less watched. The same applies at the other end: a listing that has failed every probe for weeks is also checked less often, so a stale last_probed_at on a 'failing' listing means the failure is long-settled, NOT that it might have quietly recovered unnoticed — probe budget goes to listings whose status is genuinely in doubt. Each result also carries next_check_by (unix seconds) with next_check_basis: when this record should next have been re-checked, derived from its probe tier (one of four tiers, from every probe run for a new listing to several hours for a long-dead or probe-delisted one; next_check_basis names the tier and its interval, and probe_tier carries it as a field). A record past next_check_by is stale by our own rule — cache with that as the TTL, and treat anything older as a record, not as truth. Each result also carries status_changed_at (unix seconds): when the CURRENT status actually started, distinct from any edit timestamp — two listings with the identical status and score can differ here, one just recovered, one stable for weeks. For the full transition log behind that summary (every real status change with its reason), GET /v1/listings/{id}/history. Payment-destination changes are detected: if a listing's pay_to address changes, reputation resets fully (score, probe_count, consecutive_failures all zeroed) and status drops to 'unverified' immediately, so an old high score never carries over to a new, unproven payment destination — but this cannot verify a wallet rotation was legitimate, only that an unproven address hasn't inherited trust it didn't earn. Each result also carries onchain_unique_payers_30d (integer, or null if never checked): distinct wallets that sent USDC to this listing's payTo address on Base in the last 30 days, read from public chain data, checked daily. That address is usually shared by many listings from the same seller (onchain_wallet.shared_by_listings says how many), so this and the other on-chain counts are the seller wallet's activity, never this endpoint's own usage — say so when you quote them. This is a CEILING on customer count, not a measurement of it: it counts every incoming USDC transfer, so an operator funding its own wallet, or paying itself, inflates it — read it alongside probe status and paid verification, never alone. It is still genuinely different from score — score proves an endpoint answers correctly, this proves USDC is actually arriving at its payment address — and the two are never combined into one number; neither implies the other, and neither proves the purchased output was any good, which is what payer reports are for. More fundamentally: everything this directory verifies is endpoint behavior — correct 402s, a live sample, a stable payment destination, real payment volume — never who is actually running the software behind a URL today. A compromised domain whose new operator leaves pay_to untouched and returns well-formed responses can pass every check here; that's a structural limit of any behavior-based verification, not specific to one check, and closing it would require verifying domain control over time, which this directory does not do. This directory indexes services; it does not proxy or execute payments. To LIST a service in this directory, POST it to https://api.nohumans.directory/v1/listings (JSON; see https://nohumans.directory/llms.txt for a worked example; free for the first 5 listings per registered domain, then $0.25 USDC per new listing over x402; no account: over the allowance the POST answers 402 with the terms, and a submission is validated before any charge) — new listings are prioritized in the probe queue and typically earn 'verified' within minutes of consistently healthy responses (three clean probes; a new listing is re-checked on every probe run). After actually paying and calling a listed service, you can report whether it delivered: POST { listing_id, ok, tx_hash, payer_signature } to https://api.nohumans.directory/v1/reports. tx_hash must be your real payment's transaction on Base; payer_signature is an EIP-191 personal_sign from the paying wallet over a canonical message the API echoes back verbatim (message_to_sign) on any incomplete attempt — the payment proves a purchase happened, the signature proves the report comes from the payer rather than a bystander reading public Transfer logs. Amount, recency, and one-report-per-transaction gates also apply; full methodology: https://nohumans.directory/methodology",
"tools": [
{
"description": "Search a registry of paid (x402) APIs and datasets verified by real paid purchases — nohumans pays listed endpoints real USDC and confirms delivery. Returns ranked results: verified listings first, then by reputation score (0..1, recency-weighted probe success), then by ascending price. Each result includes has_sample (boolean) — true means you can cheaply test real output before paying full price; prefer these when a listing is new or thinly-reputed and you can't yet judge it from score alone. Use this before spending money to find services that actually work. Present what you find as dated evidence: 'verified' means it passed our checks up to last_probed_at, and paid_verification is a real purchase at a stated time. Never tell the user a service is safe, guaranteed or risk-free. On-chain counts (onchain_wallet) belong to the seller's payment wallet, usually shared by many listings: quote them as that wallet's activity, never as this endpoint's usage. Prefer results with status 'verified' and score >= 0.8. Zero results means no known service matches — do not invent endpoints. Always describe the actual need in `query` in your own words — what data, what freshness, what format, what constraint prompted the search — rather than only setting `category`/`max_price`/`min_score` filters. The exact wording of what you're looking for is what improves this directory over time; a bare filter with no `query` text tells us far less about what was actually needed.",
"inputSchema": {
"properties": {
"category": {
"description": "One of the 40 most-populated existing categories, most-used first. Omit and rely on free-text `query` instead if none fit well — an unmatched or long-tail category still works via text-search fallback, it just won't be offered here as a constrained choice.",
"enum": [
"data.other",
"data.crypto",
"data.misc",
"data.web",
"data.markets",
"compute.llm",
"compute.media",
"data.weather",
"data.geo",
"data.fx",
"compute.tools",
"data.stocks",
"data.news",
"data.search",
"data.contacts",
"data.defi",
"data.intelligence",
"infra.utility",
"data.macro",
"data.enrichment",
"infra.trust",
"infra.validation",
"data.derivatives",
"data.social",
"infra.inference",
"data.research",
"compute.nlp",
"data.x402",
"data.reference",
"infra.scraping",
"data.security",
"verification",
"data.energy",
"data.onchain",
"data.procurement",
"infra.creative",
"ai.agents",
"commerce.general",
"tools.verification",
"compute.utility"
],
"type": "string"
},
"limit": {
"description": "Maximum results to return (default 10, cap 50).",
"type": "integer"
},
"max_price": {
"description": "Maximum per-call price. Omit for no cap.",
"type": "number"
},
"min_score": {
"description": "Minimum reputation score, 0..1. Use 0.8 to only see reliably-passing services.",
"type": "number"
},
"query": {
"description": "Describe what you actually need, in your own words and as specifically as possible — not just a topic, but the real constraint: e.g. 'sub-second latency wallet risk scoring for Base memecoins', 'EUR/USD spot rate with sub-100ms freshness', 'translate legal contracts, not casual text'. This text is what makes results relevant and is the only place that level of detail is captured — category and price are coarse filters on top of it, not a substitute for it. Only leave this empty if you are genuinely just browsing with no specific need in mind.",
"type": "string"
}
},
"type": "object"
},
"name": "find_paid_service",
"outputSchema": {
"additionalProperties": true,
"properties": {
"category_expanded": {
"type": [
"string",
"null"
]
},
"count": {
"type": "integer"
},
"results": {
"items": {
"additionalProperties": true,
"properties": {
"category": {
"type": "string"
},
"chains": {
"description": "Networks you can PAY on, as declared by the seller. Not the data or chains the service covers.",
"items": {
"type": "string"
},
"type": "array"
},
"description": {
"type": "string"
},
"distinct_payers": {
"type": [
"integer",
"null"
]
},
"endpoint_url": {
"type": "string"
},
"evidence_note": {
"type": [
"string",
"null"
]
},
"evidence_tier": {
"type": "string"
},
"has_sample": {
"type": "boolean"
},
"id": {
"type": "string"
},
"kind": {
"enum": [
"api",
"agent"
],
"type": "string"
},
"last_probed_at": {
"type": [
"integer",
"null"
]
},
"mpp_methods": {
"description": "MPP methods as the endpoint names them (tempo, evm, stripe, ...); null when its 402 offers no MPP.",
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"name": {
"type": "string"
},
"observed_network": {
"type": [
"string",
"null"
]
},
"onchain_payto_shared_listings": {
"description": "Active listings naming the same payTo address. Above 1, the on-chain figures are the wallet's, not this endpoint's.",
"type": [
"integer",
"null"
]
},
"onchain_scope": {
"description": "What the on-chain figures describe, in words. Read before quoting them.",
"type": [
"string",
"null"
]
},
"onchain_unique_payers_30d": {
"type": [
"integer",
"null"
]
},
"onchain_wallet": {
"additionalProperties": true,
"description": "On-chain activity of the seller's payment wallet (payTo), usually shared by many listings: scope, shared_by_listings, pay_to, tx_count_30d, unique_payers_30d, volume_usd_30d. Not this endpoint's own usage.",
"type": "object"
},
"p50_latency_ms": {
"description": "Median latency over the last 7 days (timeouts included); null under 5 probes.",
"type": [
"number",
"null"
]
},
"p95_latency_ms": {
"type": [
"integer",
"null"
]
},
"p99_latency_ms": {
"type": [
"integer",
"null"
]
},
"paid_verified": {
"type": "boolean"
},
"paid_verified_at": {
"type": [
"integer",
"null"
]
},
"paid_verified_at_iso": {
"type": [
"string",
"null"
]
},
"payment_protocols": {
"description": "Protocols the endpoint's own 402 offered on our unpaid probes: x402, mpp, or both. Paid verification covers x402 on Base only.",
"items": {
"type": "string"
},
"type": "array"
},
"price_amount": {
"type": "number"
},
"price_currency": {
"type": "string"
},
"probe_count": {
"description": "Every counted probe, passes AND failures. Passes are probes_passed.",
"type": [
"integer",
"null"
]
},
"probes_failed": {
"type": [
"integer",
"null"
]
},
"probes_passed": {
"type": [
"integer",
"null"
]
},
"report_count": {
"type": [
"integer",
"null"
]
},
"report_score": {
"type": [
"number",
"null"
]
},
"response_mime": {
"type": [
"string",
"null"
]
},
"score": {
"type": [
"number",
"null"
]
},
"status": {
"enum": [
"verified",
"unverified",
"failing"
],
"type": "string"
},
"status_changed_at": {
"type": [
"integer",
"null"
]
},
"verdict_age_seconds": {
"type": [
"integer",
"null"
]
},
"x402_version": {
"type": [
"integer",
"null"
]
}
},
"required": [
"id",
"name",
"endpoint_url",
"status",
"price_amount"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"count",
"results"
],
"type": "object"
}
},
{
"description": "Fetch the full record for one listing by id (from find_paid_service results), led by paid_verification — whether nohumans has paid this endpoint real USDC and confirmed delivery, with the settlement tx hash as on-chain proof where settled — plus endpoint URL, request/response JSON Schemas when provided, accepted chains, pricing, and reputation detail (probe count, last successful probe, consecutive failures). Call this before making a paid request so you know the exact request shape, current reliability, and whether real-money delivery has been independently confirmed. It is evidence with dates, not a guarantee: say when each check happened (every timestamp has an _iso twin), and quote on-chain counts as the seller wallet's activity (onchain_wallet.scope says how many listings share it). A paid verdict for the same listing — our published rule applied for you, with printed reasons, $0.005 USDC on Base via x402 — is at GET https://api.nohumans.directory/v1/listings/{id}/verdict; every fact behind it is in this record for free, so buy the verdict only when you want the rule applied for you. Every purchase we have made of this listing, oldest first — when, what it cost, the on-chain tx, whether it delivered valid output, and what changed between purchases — is at GET https://api.nohumans.directory/v1/listings/{id}/purchases ($0.01 USDC on Base via x402); the latest outcome is already in paid_verification here for free, so buy the history when you want to know whether it keeps delivering over time.",
"inputSchema": {
"properties": {
"id": {
"description": "Listing id, as returned by find_paid_service.",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "get_service_details",
"outputSchema": {
"additionalProperties": true,
"properties": {
"category": {
"type": "string"
},
"chains": {
"description": "Networks you can PAY on, as declared by the seller. Not the data or chains the service covers.",
"items": {
"type": "string"
},
"type": "array"
},
"description": {
"type": "string"
},
"distinct_payers": {
"type": [
"integer",
"null"
]
},
"endpoint_url": {
"type": "string"
},
"evidence_note": {
"type": [
"string",
"null"
]
},
"evidence_tier": {
"type": "string"
},
"has_sample": {
"type": "boolean"
},
"id": {
"type": "string"
},
"kind": {
"enum": [
"api",
"agent"
],
"type": "string"
},
"kind_notes": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"last_probed_at": {
"type": [
"integer",
"null"
]
},
"mpp_methods": {
"description": "MPP methods as the endpoint names them (tempo, evm, stripe, ...); null when its 402 offers no MPP.",
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"name": {
"type": "string"
},
"obs_network": {
"type": [
"string",
"null"
]
},
"obs_pay_to": {
"type": [
"string",
"null"
]
},
"obs_scheme": {
"type": [
"string",
"null"
]
},
"observed_network": {
"type": [
"string",
"null"
]
},
"onchain_daily": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"onchain_payto_shared_listings": {
"description": "Active listings naming the same payTo address. Above 1, the on-chain figures are the wallet's, not this endpoint's.",
"type": [
"integer",
"null"
]
},
"onchain_scope": {
"description": "What the on-chain figures describe, in words. Read before quoting them.",
"type": [
"string",
"null"
]
},
"onchain_shape": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"onchain_unique_payers_30d": {
"type": [
"integer",
"null"
]
},
"onchain_wallet": {
"additionalProperties": true,
"description": "On-chain activity of the seller's payment wallet (payTo), usually shared by many listings: scope, shared_by_listings, pay_to, tx_count_30d, unique_payers_30d, volume_usd_30d. Not this endpoint's own usage.",
"type": "object"
},
"p50_latency_ms": {
"description": "Median latency over the last 7 days (timeouts included); null under 5 probes.",
"type": [
"number",
"null"
]
},
"p95_latency_ms": {
"type": [
"integer",
"null"
]
},
"p99_latency_ms": {
"type": [
"integer",
"null"
]
},
"paid_verification": {
"additionalProperties": true,
"type": "object"
},
"paid_verification_latest": {
"type": [
"object",
"null"
]
},
"paid_verified": {
"type": "boolean"
},
"paid_verified_at": {
"type": [
"integer",
"null"
]
},
"paid_verified_at_iso": {
"type": [
"string",
"null"
]
},
"payment_protocols": {
"description": "Protocols the endpoint's own 402 offered on our unpaid probes: x402, mpp, or both. Paid verification covers x402 on Base only.",
"items": {
"type": "string"
},
"type": "array"
},
"payto_distinct_recent": {
"type": [
"integer",
"null"
]
},
"payto_note": {
"type": [
"string",
"null"
]
},
"payto_sentinel": {
"type": "boolean"
},
"payto_unstable": {
"type": "boolean"
},
"price_amount": {
"type": "number"
},
"price_currency": {
"type": "string"
},
"probe_count": {
"description": "Every counted probe, passes AND failures. Passes are probes_passed.",
"type": [
"integer",
"null"
]
},
"probes_failed": {
"type": [
"integer",
"null"
]
},
"probes_passed": {
"type": [
"integer",
"null"
]
},
"report_count": {
"type": [
"integer",
"null"
]
},
"report_score": {
"type": [
"number",
"null"
]
},
"request_schema": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"response_mime": {
"type": [
"string",
"null"
]
},
"response_schema": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"sample_query": {
"type": [
"string",
"null"
]
},
"score": {
"type": [
"number",
"null"
]
},
"status": {
"enum": [
"verified",
"unverified",
"failing"
],
"type": "string"
},
"status_changed_at": {
"type": [
"integer",
"null"
]
},
"transport": {
"type": [
"string",
"null"
]
},
"verdict_age_seconds": {
"type": [
"integer",
"null"
]
},
"x402_version": {
"type": [
"integer",
"null"
]
}
},
"required": [
"id",
"name",
"endpoint_url",
"status",
"price_amount"
],
"type": "object"
}
},
{
"description": "Pre-spend check on an endpoint URL you already hold — from another catalog, a prompt, a config, anywhere: check before paying instead of buying to find out. Returns match 'active' with the same full record as get_service_details (status, reputation score, paid_verification with on-chain tx proof, observed 402 protocol detail), match 'delisted' if the endpoint was listed here and later removed (treat as a warning), or a not-listed result. IMPORTANT: not-listed means never checked here, NOT unsafe — absence of a record is not a verdict either way. Report what the record shows, with its dates (last_probed_at_iso, and the date of any paid verification); do not tell the user an endpoint is safe or unsafe yourself. Applying a pay-or-not rule is what the separate paid verdict below is for; do not issue a verdict of your own. Use this as the pre-spend check when you have a URL in hand and no listing id; use find_paid_service instead when you have a need but no URL. A paid verdict for the same listing — our published rule applied for you, with printed reasons, $0.005 USDC on Base via x402 — is at GET https://api.nohumans.directory/v1/listings/{id}/verdict; every fact behind it is in this record for free, so buy the verdict only when you want the rule applied for you.",
"inputSchema": {
"properties": {
"url": {
"description": "The endpoint URL exactly as you hold it, including any query string (parameterized listings bake params into the URL, so the query string matters). Trailing slashes and http/https differences are tolerated.",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
},
"name": "resolve_endpoint",
"outputSchema": {
"additionalProperties": true,
"properties": {
"detail": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"match": {
"enum": [
"active",
"delisted",
"unknown"
],
"type": "string"
},
"note": {
"type": [
"string",
"null"
]
}
},
"required": [
"match"
],
"type": "object"
}
},
{
"description": "What agents actually searched this directory for, for an agent deciding which x402 service to build or list. Returns the aggregate demand feed: the terms asked most persistently (ranked by how many distinct days a term was asked, not by volume — volume is trivially faked and we proved it on ourselves), and the category filters they used. It reports what was ASKED, not what is missing: before calling a need unmet, read the term's catalogue_top (the listings our own search returns for it) and, where it is null, call find_paid_service with the term; whether the listings already serving a term are adequate competition is a seller's judgement, not ours, and we grade those listings. Exclusions are applied and published rather than hidden: queries under 5 characters (catalogue enumeration, once the top ten terms were the single letters a-j), searches from clients that also edit listings here (sellers checking their own rank — one accounted for 196 of 205 searches of the top term), and a floor: a term appears once at least 1 distinct non-seller client IP asked it (terms naming a URL, host, wallet or email are never published, whoever asked). Client IPs are a ceiling on independent demand, never a count of buyers: one serverless caller presented eight IPs in a second. The window is complete but closed — it ends a week behind live while the paid tier is on sale (a day when it is not; delay_hours and window_ends_at in the response say which). This is a small market and the numbers are small; they are reported as they are so you can judge whether they are enough to act on. Lookups of a named listing (a listed service's own name, searched almost only by clients that searched nothing else) are listed apart in named_listing_lookups, not ranked in top_needs; so are terms asked by many addresses almost all of which searched only once (one caller rotating IPs), in scripted_rotation. Every term is published; a reply holds one page of them (limit, default 100; offset; next_offset says where the next page starts). A current version is sold at GET https://api.nohumans.directory/v1/demand/clusters ($0.25 USDC on Base via x402): the last 30 days, rebuilt every 15 minutes rather than a week behind, searches grouped by meaning, with example phrasings and how many results each need got. This free feed is enough to judge whether the demand is worth acting on; buy the current one when you need the current window.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"default": 100,
"description": "Terms per reply, in rank order (default 100).",
"maximum": 1000,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Where to start in the ranked list; each reply says next_offset.",
"minimum": 0,
"type": "integer"
}
},
"required": [],
"type": "object"
},
"name": "what_agents_are_asking_for",
"outputSchema": {
"additionalProperties": true,
"properties": {
"delay_hours": {
"description": "How far behind live the window ends.",
"type": "integer"
},
"distinct_client_ips": {
"description": "A ceiling on independent demand, never a count of buyers.",
"type": "integer"
},
"k_anonymity_floor": {
"description": "Distinct non-seller client IPs a term needs before it is reported at all.",
"type": "integer"
},
"k_anonymity_unit": {
"type": "string"
},
"named_listing_lookups": {
"description": "Searches for one listed service by its own name, asked almost only by clients that searched nothing else: listed apart, same fields as top_needs, not demand. Rule in named_listing_lookup_rule.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"note": {
"description": "The exclusions, stated in words.",
"type": "string"
},
"page": {
"description": "offset, limit, returned, terms_total, next_offset (null on the last page).",
"type": "object"
},
"read_first": {
"description": "How to read this feed, in a few lines. Read before the data.",
"items": {
"type": "string"
},
"type": "array"
},
"scripted_rotation": {
"description": "Terms asked by many client IPs almost all of which searched only once in the whole window (one caller on rotating addresses): listed apart, same fields as top_needs plus share_single_search_client_ips, not demand. Rule in scripted_rotation_rule.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"terms_total": {
"description": "How many terms the window publishes; top_needs holds one page of them.",
"type": "integer"
},
"top_category_filters": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"top_needs": {
"description": "Terms ranked by how many distinct days they were asked.",
"items": {
"additionalProperties": true,
"properties": {
"buyer_client_ips": {
"description": "Distinct non-seller client IPs; a ceiling on independent askers, never a count of buyers.",
"type": "integer"
},
"catalogue_status": {
"description": "not_checked_yet means NOT searched yet, not that nothing exists.",
"enum": [
"checked",
"search_returned_nothing",
"not_checked_yet"
],
"type": "string"
},
"catalogue_top": {
"description": "The three listings this directory's own search returned for the term (id, name, status, price_amount), searched at catalogue_checked_at_iso. Null only when catalogue_status is not_checked_yet.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"clients": {
"type": "integer"
},
"distinct_days": {
"description": "UTC calendar dates on which non-sellers asked it.",
"type": "integer"
},
"q": {
"type": "string"
},
"searches": {
"type": "integer"
},
"self_monitoring_searches": {
"description": "Of `searches`, how many came from clients that also edit listings here.",
"type": "integer"
}
},
"required": [
"q"
],
"type": "object"
},
"type": "array"
},
"total_queries": {
"description": "Every search in the window, before exclusions.",
"type": "integer"
},
"window_days": {
"description": "Length of the reported window.",
"type": "integer"
},
"window_ends_at": {
"description": "Unix seconds at which the window closes.",
"type": "integer"
}
},
"required": [
"window_days",
"delay_hours",
"total_queries",
"top_needs"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:151248bd25a0f2820d201278f978ea47d0f210a8907b4532c493eca5224a98cc | sha256sum