{"name":"pricemonkey","endpoints":{"GET /hunt?q=&replay=<slug>&speed=2":"replay a recorded hunt at its real pace (no credits)","GET /recordings":"slugs of recorded hunts","POST /brain":"the voice guide's next move (DeepSeek): {q, messages, offers, busy, event?} -> {action: search|answer|ask, request, say, show: [{id, why}]}","GET /api/categories?parent=&lang=":"one level of the tree of everything you can buy (products + services): id, label, count, kind, icon","GET /api/categories/search?q=&lang=&within=":"categories matching a few words (type-ahead), each with its full path (within=<id>: only inside that category)","GET /api/categories/classify?q=&lang=":"a need in plain words -> best category, path, confidence","GET /api/categories/nodes?ids=a,b&lang=":"a few categories by id, each with its full path","GET /api/intent?q=&country=&lang=&cat=&near=":"what a vague request most likely means: 2-5 ranked meanings (label, kind, category, hunt {q, cat, intent}, local queries, lanes, where-to-look domains, why, confidence), dominant, next steps","GET /api/categories/page?id=&lang=":"a category page: plain title, about, subcategory cards with examples, concrete things, popular chips; huntable=false nodes open this instead of a hunt","GET /api/categories/enrich?id=&lang=&country=":"what people usually look for in a niche category (suggestions to hunt, providers we know); pending=true: ask again shortly","GET /reviews?hunt_id=&domains=":"SSE: seller reviews after a hunt (review events, then done)","GET|POST /demo/story/refusal?pause=1.5":"SSE: watcher skips, buys, refuses a hidden fee, catches a tampered log","GET|POST /demo/buy?pause=1.2":"SSE: lie detector, haggle counter-offer, auto-buy under open->closed mandates, proof","GET /hunt?q=":"SSE stream of hunt Events (optional &max_sources=N caps pages read, &depth=2 reads deeper, &cat=<category id> hunts inside that category) (need, lane, source, offer, skip, thing, truecost, verdict, budget, done, error)","POST /watches":"create a watch {query|need, max_eur|max_price_eur, rule, action, mandate, pinned_urls, use_hunt}","GET /watches":"list watches","POST /watches/{id}/check":"run a watch check now","GET /watches/{id}/proof":"signed mandate + hash-chained decision log (tamper-evident)","POST /arm":"arm watches at each losing offer's price-to-beat {query, action, create}","POST /hooks/contextdev":"Context.dev monitor webhook","GET /things/{id}/history":"price history snapshots for a thing","GET /history?url=":"price history snapshots for one offer URL","GET /ledger":"Context.dev credit ledger","/mockshop/*":"demo shop for auto-buy (if mounted)","GET /":"browser viewer (Accept: text/html), else this index; also GET /api","GET /lab":"the lab viewer (every panel open; also GET /viewer)","GET /cut?u=":"photo cutout of an offer image (if mounted)","POST /share":"share a hunt {query, sharer} -> {id, url}","GET /s/{id}":"open the viewer on a shared hunt","GET /share/{id}":"a share + its attributed clicks","GET /go/{share_id}/{offer_token}":"log a click (attributed to the sharer) and redirect; offer_token = url-safe base64 of the offer URL, no padding","POST /buy":"agent-door buy by offer id {offer_id, watch_id?, hunt_id?} (provenance-gated)","POST /watches/{id}/leases":"subscribe a callback to watch.match / price.drop (signed webhooks)","GET /leases":"list leases (secrets never listed)","DELETE /leases/{id}":"revoke a lease","GET /leases/{id}/deliveries":"delivery log of a lease","GET /docs":"OpenAPI UI"},"mockshop":true}