{"document":"methodology","html":"https://nohumans.directory/methodology","note":"Rules as data, generated from the constants the directory runs on. Prose, dated corrections and Method changes are on the html page.","probe_tiers":{"rule":"each listing is in one tier, decided on every probe; the interval is stored and is what the scheduler selects on; next_check_by on each record is last_probed_at + its interval","tiers":[{"tier":"new","interval_s":120,"basis":"new tier, re-probed on every probe run (every 2 minutes): unverified and either new (fewer than 10 counted probes) or on a clean streak toward the badge, so a new, reset or recovering listing earns it in minutes rather than hours"},{"tier":"watch","interval_s":1800,"basis":"watch tier, re-probed every 30 minutes: unverified, failing (up to 10 in a row), failed in the last 24 h, payment terms changed in the last 7 days, or new or changed status in the last 7 days"},{"tier":"stable","interval_s":7200,"basis":"stable tier, re-probed every 2 hours: verified with no failure in the last 24 h and no change of terms or status in 7 days, or failing 11 to 50 times in a row; any failure moves it to the watch tier on that probe"},{"tier":"background","interval_s":28800,"basis":"background tier, re-probed every 8 hours: probe-delisted and inside the 30-day relist window, on a tunnel host, challenge names a testnet, more than 10 neutral probes in a row, or failing more than 50 times in a row"}],"method_change":"https://nohumans.directory/methodology#probe-tiers","host_limit":{"per_host_per_run":2,"per_host_per_run_while_429":1,"run_interval_s":120,"probe_tier_label":"host_limited","basis":"host-limited: we probe at most 2 of one host's listings per probe run (1 while it is answering 429), one run every 2 minutes, so a host with many listings has each one checked in turn; the interval is the larger of the listing's tier interval and that host's turn, so it is not hammered and the record does not promise a check the host limit cannot keep"}},"status_rules":{"verify_min_probes":3,"verify_min_score":0.8,"fail_streak":5,"recover_passes":3,"verified_also_requires":"a payment challenge observed at least once, and a payTo that is not a burn address","neutral_probes":"move no score, streak or status (see pass_rate_24h.neutral_classes)"},"pass_rate_24h":{"basis":"passes / probes in the last 24h, excluding six neutral classes: probes where our own DNS lookup failed (failure_reason dns_lookup_error, recorded since 2026-09-02; before that such failures were counted against the endpoint — see correction #14), and probes where neither an unpaid GET nor an unpaid POST produced a payment challenge (not_payment_gated, since 2026-09-03; a fact about the listing, not a failure of it — see Method changes), and probes where the host answered 403 to our unpaid GET and did not challenge the POST retry either (probe_refused, since 2026-09-05; the same host answers 402 to other clients and to our other probes, so this is a fact about our vantage point, not the listing), and probes where the route rejected the request before any payment question (400/422 on both verbs, or a 403 whose body is a JSON error — warn:params_likely_required, neutral since 2026-09-06; validation before payment is a legitimate design and without a valid input we cannot tell broken from called wrong — see correction #17), and probes where the host answered 429 to our unpaid GET or to the POST retry (warn:rate_limited, since 2026-09-13 on the GET and 2026-09-14 on the POST; a 429 is a fact about how often we asked, not about whether the endpoint serves payment terms — see correction #19), and probes that timed out in a probe run where at least 50% of all probes, on at least 8 different hosts, timed out together (warn:sweep_timeout, since 2026-09-23; unrelated endpoints failing together and recovering together is a fact about the path from our prober, not about any one listing — see Method changes)","neutral_classes":[{"failure_reason":"dns_lookup_error","description":"probes where our own DNS lookup failed (failure_reason dns_lookup_error, recorded since 2026-09-02; before that such failures were counted against the endpoint — see correction #14)"},{"failure_reason":"not_payment_gated","description":"probes where neither an unpaid GET nor an unpaid POST produced a payment challenge (not_payment_gated, since 2026-09-03; a fact about the listing, not a failure of it — see Method changes)"},{"failure_reason":"probe_refused","description":"probes where the host answered 403 to our unpaid GET and did not challenge the POST retry either (probe_refused, since 2026-09-05; the same host answers 402 to other clients and to our other probes, so this is a fact about our vantage point, not the listing)"},{"failure_reason":"warn:params_likely_required","description":"probes where the route rejected the request before any payment question (400/422 on both verbs, or a 403 whose body is a JSON error — warn:params_likely_required, neutral since 2026-09-06; validation before payment is a legitimate design and without a valid input we cannot tell broken from called wrong — see correction #17)"},{"failure_reason":"warn:rate_limited","description":"probes where the host answered 429 to our unpaid GET or to the POST retry (warn:rate_limited, since 2026-09-13 on the GET and 2026-09-14 on the POST; a 429 is a fact about how often we asked, not about whether the endpoint serves payment terms — see correction #19)"},{"failure_reason":"warn:sweep_timeout","description":"probes that timed out in a probe run where at least 50% of all probes, on at least 8 different hosts, timed out together (warn:sweep_timeout, since 2026-09-23; unrelated endpoints failing together and recovering together is a fact about the path from our prober, not about any one listing — see Method changes)"}]},"sweep_timeout_guard":{"label":"warn:sweep_timeout","min_share_of_run":0.5,"min_distinct_hosts":8},"verdict":{"thresholds":{"caution_score_below":0.9,"caution_p95_ms_above":5000,"caution_payto_changed_within_days":7,"avoid_failed_paid_delivery_within_days":14},"levels":["pay","caution","avoid"],"rule":"https://nohumans.directory/methodology#verdict","self_referential":{"cap":"caution","hosts":["nohumans.directory"],"subdomains":true,"or_pay_to":"this directory's receiving address","since":"2026-09-29","rule":"https://nohumans.directory/methodology#self-referential"}},"paid_routes":[{"method":"GET","path":"/v1/listings/:id/verdict","prices_atomic":["5000"],"usd":"$0.005","sold_to":"anyone","since":"2026-09-05","what":"pay / caution / avoid with reasons, the free record folded into one answer","url":"https://api.nohumans.directory/v1/listings/:id/verdict"},{"method":"GET","path":"/v1/listings/:id/purchases","prices_atomic":["10000"],"usd":"$0.01","sold_to":"anyone","since":"2026-09-15","what":"every purchase we made of the listing, with pair deltas (delivery, price, body)","url":"https://api.nohumans.directory/v1/listings/:id/purchases"},{"method":"POST","path":"/v1/listings/:id/verify-now","prices_atomic":["3000000","5000000"],"usd":"$3 / $5","sold_to":"listing owner","since":"2026-09-09","what":"buys real purchases of your own listing, published whatever they find; ?plan=single|pack","url":"https://api.nohumans.directory/v1/listings/:id/verify-now"},{"method":"GET","path":"/v1/demand/clusters","prices_atomic":["250000"],"usd":"$0.25","sold_to":"anyone","since":"2026-09-13","what":"what agents searched for, grouped by meaning, current window","url":"https://api.nohumans.directory/v1/demand/clusters"},{"method":"GET","path":"/v1/demand/report","prices_atomic":["2000000"],"usd":"$2","sold_to":"anyone","since":"2026-09-23","what":"the demand report for people: every current need, grouped, with the verified listings that answer it today","url":"https://api.nohumans.directory/v1/demand/report"}],"sections":{"method_changes":"https://nohumans.directory/methodology#method-changes","outcomes":"https://nohumans.directory/methodology#outcomes","verdict":"https://nohumans.directory/methodology#verdict"},"license":"CC-BY-4.0"}