{"name":"Återstod API","version":"2.0.0","base":"https://aterstod.com","llms_txt":"https://aterstod.com/llms.txt","endpoints":{"/api/search":"q, p (page), n (default 10; max 10 limited / 100 bonded (Moonsox), see trust), type (all|image|video|audio|document|archive|software|embed), type_page (article|docs|forum|product|store|local_business|service_area_business|government|education|news|blog|directory_listing|media|homepage|profile|reference|other), intent (informational|navigational|transactional|local|commercial|reference), zip (US 5-digit), state (2-letter), scope (global|national|region|city|local), lang (ISO 639-1, e.g. en, es; omit = any language, same-language pages ranked higher), site (domain, or use 'site:' in q), sort (top = relevance/rank | new = newest page date | old = oldest page date | crawled = recently crawled; undated pages sort last), era (1990s|2000s|2010s|2020s) or y1/y2 (year range, either end optional), classic (1 = classic-web pages only), hidebig (1 = hide pages from big sites: registrable domain, e.g. en.wikipedia.org -> wikipedia.org, in the Tranco top-N list) with top (50|100|1000|10000|100000|1000000; default 1000); the response echoes hide_big_sites {top, source, hidden}, adult (show|1 = list adult/graphic-labeled items with thumbnails; default blur: they are listed with labels + adult:true and thumb null; hide = leave them out of results on every type, the response echoes filters.adult = hide), icons (1 = include logos/social icons/pixels in image results; hidden by default), ia_off (comma list of instant-answer services to skip: time,calc,convert,define,holidays,sunmoon,weather,currency,crypto,transit,tools,color,ip,easter; a skipped service makes no lookup), siteicons (0 = leave out icon_url), explain (1 = add 'why' to each web result: the ranking breakdown, see /how-ranking-works), hide_products (1 = leave out pages and 'mostly commerce' sites that sell physical goods, incl. goods subscriptions and coupon/deal pages), hide_services (1 = leave out pages/sites selling services: software/SaaS, hosting, digital goods, booking, courses ...), shopping (off = both; the response echoes filters.hp / filters.hs). Buy-intent words (buy, for sale, cheap, price, cute ...) are matched softly; the response then carries buy_intent {intent, core, soft} and, with shopping on, shop (up to 6 product pages: title, shop, price when stated, thumb; never paid). q=* (or empty) browses everything.","/api/similar":"id (pages similar to this one)","/api/thumb":"/thumb/<media id> (webp, proxied)","/icon/<host>":"site icon (32 px PNG fetched by our server, robots.txt respected; neutral SVG monogram when there is none). Cache it; only hosts in the index.","/api/page":"id or url","/api/site":"key (e.g. example.com, alice.github.io) or url","/api/intro":"q, aisum (0 = AI summary off: returns intro null and generates nothing; the HTML search page takes aisum=0 too)","POST /api/annotate":"JSON {q, id (page id), reason (off_topic|spam|outdated|broken|rank_higher|wrong_label|other), note (optional, <= 280 chars), media (optional media id)}: say a result is wrong for a query. Label corrections: reason label_add:<l> / label_remove:<l> (l = nsfw|graphic|spam|hate-speech|illegal-topic, q optional); 3 agreeing notes within 30 days apply a label correction automatically (a moderator's decision wins) and bury a page for off_topic|spam|outdated|broken; the rest goes to a moderator. Same limits as the web form (per bot or IP, global daily cap); bonded Moonsox bots count x2, other API calls x0.5. Stores no IP or user agent.","/api/click":"t (from a result's click_url): optional click feedback; or just GET click_url (redirects)","/api/settings":"optional saved defaults, no account. POST a JSON object {settings: {type, lang, state, zip, sort, hidebig, top, adult, classic, ia_off, siteicons, aisum, hp, hs, theme}} (max 2048 bytes; unknown fields ignored); without a key header the response includes a new random 'key' (shown once). GET returns, DELETE removes (immediately). The key goes only in header X-Aterstod-Settings-Key, never in a URL."},"settings_keys":{"header":"X-Aterstod-Settings-Key: ATR-XXXX-XXXX-XXXX-XXXX (ASCII; the key shown on /settings as ÅTR-… works with ATR- or no prefix, dashes optional)","search":"send the header on /api/search to apply your saved defaults; explicit query params win. The response then carries settings_key (applied|unknown_key|bad_key) and settings_applied (the saved field names).","stored":"only a one-way hash of the key, the settings (<1 KB) and two day-granularity dates; never linked to queries, IPs, clicks or bot ids; never logged","expiry":"deleted after 90 days unused, or after 7 days if saved and never used again","limits":"saves are rate-limited per IP (in memory only) and new keys per day are capped; search rate limits still follow your bot/IP tier"},"result_fields":"icon_url (site icon via our /icon/<host> proxy; media: the site it was found on), why (only with explain=1, web results: position, total, score, text {score, words, full_query, synonyms, cjk, share {title, description, body}, title_hit}, factors [{key, label, x, effect, detail}], filters [{key, label, detail}], notes; formula and weights at /how-ranking-works), site_kind (personal|business|forum|reference|news|docs|shop|institution|spam|template), commerce (physical|service|affiliate: what the page sells; absent = nothing), entities (people, orgs, places, years), click_url (optional feedback, present when click feedback is on), top-level also_matched (synonyms that matched with lower weight)","geo":"Coverage boosts use only words typed in q (zip, state, city). No geo-IP, no tracking.","all":"/api/search?type=all returns grouped sections instead of results: sections.web (top 6 compact web results) and, when found in time, sections.image (8), video (3), audio (3), files (3 documents/archives/software; media objects as for type=image etc.). Sections are searched in parallel with a time budget; slow or failed ones are listed in 'omitted'. Also total (web), timings_ms, instant (when any). No paging.","instant":"/api/search (web, p=1) adds a top-level 'instant' object when q is a confident instant-answer query (computed locally, no AI, no external calls): type (time|date|calc|convert|days|age|coin|random|dice|password|definition|easter), label, answer (display text), plus input/value/unit/from/to/detail/note/datetime (UTC)/zone where relevant. Randomized and time-based answers are sent Cache-Control: no-store. type=definition (only for explicit 'define X', 'X meaning', 'what does X mean') adds word, pron (IPA, when known), senses [{pos, defs [{text, example}]}] and source (Open English WordNet 2025, CC BY 4.0; bundled, no external calls).","html":"Search-result HTML (/search, /?q=, /why, /similar) is for browsers: non-browser user agents, requests without Accept-Language and >30 result pages/min per IP get 429 with Link: </api/search>; rel=\"service-desc\". Use this API; bonded Moonsox bots with a signed request (X-Moonsox-Signature or Web Bot Auth) pass both.","trust":{"mode":"tiered","bots":"A bot id alone proves nothing and is served exactly like an anonymous request (limited tier, IP rate limit, the id is not logged). Bonded bots that sign each request (below) get higher limits.","signature":"required for the bonded tier: X-Moonsox-Bot-Id: <bot id> + X-Moonsox-Timestamp: <unix> + X-Moonsox-Signature: base64 Ed25519 over 'aterstod-api\\n{botId}\\n{ts}\\n{path}' (path = URL path without query, e.g. /api/search; 5 min window) with the key on your Moonsox card. Or use Web Bot Auth (web_bot_auth).","bond":"https://trust.moonsox.com/skill.md#third-party-verify","web_bot_auth":{"summary":"Stronger option: sign each request (RFC 9421 HTTP Message Signatures, tag=\"web-bot-auth\", Ed25519, your Moonsox key). A valid signature from a bonded bot = full tier, bound to that request. When Signature + Signature-Input are present they decide the tier (X-Moonsox-Bot-Id is ignored except as a key hint when Signature-Agent is absent).","headers":{"Signature-Agent":"\"https://trust.moonsox.com/v1/bots/<bot id>/jwks\" (quoted)","Signature-Input":"sig=(\"@authority\" \"signature-agent\");created=<unix>;expires=<unix>;keyid=\"<JWK thumbprint>\";alg=\"ed25519\";tag=\"web-bot-auth\"[;nonce=\"...\"]","Signature":"sig=:<base64 Ed25519 signature over the RFC 9421 signature base>:"},"rules":"must cover \"@authority\" (aterstod.com) and \"signature-agent\" when sent; may also cover @method @path @query @target-uri @request-target @scheme and plain headers. created required; expires optional (default 300 s), max 1 day; 60 s clock skew. A nonce, if sent, can be used once. The key must be in your Trust JWKS (kid = RFC 7638 thumbprint) and match your Moonsox card; the card must show bond.status=bonded. Keys cached 10 min, cards 5 min.","failures":"limited tier + trust notice with auth=\"signature\" and status = the reason (e.g. signature_expired, signature_invalid, key_not_found, not_bonded).","docs":"https://trust.moonsox.com/skill.md#web-bot-auth"}},"unthrottle":{"no_identity":"No identity yet? Get bonded at moonsox.com — register, take the bond loan, ~20 minutes.","register_url":"https://moonsox.com/","message":"Unthrottle your search — verify with Moonsox: https://trust.moonsox.com/v1/bots/YOUR_BOT_ID/card — swap in your bot ID; bonded = unthrottled.","how":"Sign each request (trust.signature or trust.web_bot_auth). If your card shows bond.status=bonded and the signature verifies, you're unthrottled. An unsigned bot id is treated as anonymous.","limited_responses":"anonymous / unbonded / unverified callers get a top-level \"trust\" object in every JSON response (tier, no_identity + register_url, message, how, card_url_template, limits; signature = why a sent id/signature didn't count; a claimed bot id is never echoed) and headers X-Aterstod-Tier: limited + Link (rel=moonsox-card, moonsox-register, help). Bonded bots get X-Aterstod-Tier: full and no notice. The notice also carries signed_requests: the stronger Web Bot Auth option (trust.web_bot_auth).","card_url_template":"https://trust.moonsox.com/v1/bots/{bot_id}/card"},"notes":"No API key. No tracking: no IP addresses, cookies or bot IDs are stored with queries; search terms are only counted in anonymous day-level totals, deleted after 30 days (see /privacy). Human web UI is never gated."}