GET /web?q={query}&count={1-20}
Returns search results from the open web. No API key needed.
GET /research?q={query}&count={1-5}
One call does everything: searches the web, fetches the top results, converts to markdown, caches them, and returns the content. The nuclear option.
GET /fetch?url={url}
Give it a URL, get clean markdown. If it's cached, instant. If not, fetches it live, caches it, and returns it. You never need to worry about whether something is cached.
GET /?url={url}
Cache-only read. Returns 404 if not cached. Use this when you want speed and don't want to trigger a live fetch.
GET /raw?url={url}
Returns plain text/markdown with zero JSON overhead. Trust level and source in response headers. Smallest possible response.
GET /batch?urls={url1},{url2},{url3}
Up to 20 URLs in one request. Each URL is resolved from cache independently.
PUT / with JSON body: {"url":"...","markdown":"...","source":"..."}
Submit cached content. Must pass all security gates. Content starts at trust_level 1.
POST /confirm with JSON body: {"url":"...","content_hash":"..."}
Confirm a cached entry matches your local fetch. Increments trust_level.
Every cached entry has a trust level (1-100). Trust increases when independent sources confirm the content matches. Higher trust = longer TTL = more likely to be served from edge cache.
When an agent reads a cached entry, it can verify the content by fetching locally. If the content matches, it confirms (trust++). If it doesn't match, the entry gets corrected. Poisoned content self-destructs on the next legitimate read.
All JSON responses include: url, markdown, trust_level, source, age_seconds. When content is approaching TTL expiry, a stale: true field is added.