Reference

API reference

Base URL https://oort.is-a-good.dev. Every endpoint takes and returns JSON, and every one needs a bearer token.

POST /v1/search

Query in, ranked and extracted content out.

FieldTypeDefaultNotes
querystringRequired, 1–2000 chars
max_resultsint51–50
max_tokensint2500Budget for the returned content
depthenumfastfast or deep
deadline_msintserver defaultPartial results rather than an error on expiry
include_domainsstring[][]Restrict to these hosts
exclude_domainsstring[][]Never return these hosts
freshness_daysintOnly content newer than this
include_raw_contentboolfalseFull document alongside the passage
include_imagesboolfalseTop-level images[]
include_faviconboolfalsePer-result favicon
include_follow_up_questionsboolfalseDerived from retrieved section headings
extract_fieldsstring[][]e.g. ["version","timeout"]
extract_modeenumdeterministicauto adds a verified LLM pass for unfilled fields
streamboolfalseSSE; results arrive as they clear ranking

Result object

FieldNotes
contentThe passage, wrapped in untrusted-content delimiters
provenancechar_start, char_end, heading_path — offsets into that document's extracted markdown
scoreRelative rank score; comparable within one response only
injection_risk0–1 signal score, with injection_signals naming what fired
tokensCounted, not estimated
providersWhich lanes surfaced this URL

POST /v1/extract

URLs to clean markdown. Up to 20 per call, fetched concurrently.

FieldTypeNotes
urlsstring[]Required, 1–20
max_tokensintTruncates each document
extract_fieldsstring[]Adds structured[] with offsets
screenshotboolForces the browser tier
full_page_screenshotboolWhole scroll height
actionsobject[]See below
include_images, include_faviconboolPer document

Per-document error is set rather than failing the whole request, so one dead URL never costs you the other nineteen.

Browser actions

{
  "urls": ["https://example.com/app"],
  "actions": [
    {"type": "click",  "selector": "#accept-cookies"},
    {"type": "type",   "selector": "#search", "text": "liveness probe"},
    {"type": "press",  "key": "Enter"},
    {"type": "wait",   "selector": ".results", "ms": 5000},
    {"type": "screenshot", "full_page": true}
  ]
}

Vocabulary: click, type, press, scroll, select, wait, screenshot. Each requires its own arguments — a click without a selector is a 422, not a silent no-op.

There is no executeJavascript action, and there will not be. Accepting a caller-supplied snippet and evaluating it in the page is one line of code and turns this endpoint into remote code execution against arbitrary origins from the host's network. Every action compiles to a fixed driver call.

POST /v1/map

Enumerate a site's URLs without fetching page bodies.

FieldTypeNotes
urlstringSite root
limitint1–5000, default 500
searchstringSubstring filter, applied while collecting
include_subdomainsboolDefault false

source reports where the list came from: sitemap, index (the site has no usable sitemap, so this is what we have crawled), or none.

POST /v1/answer

Search, stream results, then stream a synthesised answer over SSE. Results are emitted before synthesis begins — an answer is never a blocking prerequisite for getting content back.

GET /v1/replay/{request_id}

Reconstruct a past request: the same corpus, the same ranking inputs. Deterministic extraction is what makes this reproduce rather than approximate.

POST /tavily/search

A compatibility shim for clients written against Tavily's request shape. Maps the common subset — search_depth, days, include_answer, include_images, include_favicon, include_follow_up_questions — and adds an oort object with request id, degraded reasons and injection scores. It is a subset, not parity; verify against their current reference before assuming a field exists.

Errors

StatusMeaning
401Missing or unknown key
422Request failed validation; the body names the field
429Rate limited; retry-after is set
5xxUnexpected. request_id is in the response and the audit log
A slow upstream is not an error. Requests that run out of time return 200 with partial: true and whatever was ready.