Quickstart
Reading
Five minutes to your first result
No SDK, no client library. The API is JSON over HTTPS and the MCP server is one stdlib file.
-
Get a key
Keys are issued from the operator console. Each one carries its own rate limit, and an unlimited key is a deliberate choice rather than the default.
-
Make a request
curl -X POST https://oort.is-a-good.dev/v1/search \ -H "authorization: Bearer $OORT_KEY" \ -H "content-type: application/json" \ -d '{ "query": "django select_related vs prefetch_related", "max_results": 5, "max_tokens": 2500 }' -
Read the response
Results are ordered content, not links.
provenanceindexes into the extracted markdown for that document.{ "request_id": "6e8dd118e7db4bc1a47d5d95e3c77164", "query": "django select_related vs prefetch_related", "intent": "technical", "results": [ { "url": "…", "content": "…", "score": 8.6, "provenance": {"char_start": 595, "char_end": 2491, "heading_path": "QuerySet API reference"}, "tokens": 498, "domain": "docs.djangoproject.com" } ], "total_tokens": 1182, "partial": false, "degraded_reasons": ["served_from_local_index"], "timings": {"total_ms": 301, "stages": {"l0_preflight": 24, "rerank": 88}} } -
Wire it into an agent
Use the MCP server for Claude, or call the endpoint directly.
Authentication
Every request needs a bearer token. There is no anonymous tier.
authorization: Bearer oort_…A missing or unknown key returns 401. A key over its rate limit returns 429 with a retry-after header.
Reading partial and degraded_reasons
Oort returns what it has when the deadline expires rather than failing. Two fields tell you what happened:
| Field | Meaning |
|---|---|
partial | The payload is incomplete — the deadline expired, or every provider failed. Not "something went wrong somewhere". |
degraded_reasons | Everything worth knowing, including healthy notes like served_from_local_index. Present on successful requests too. |
A flag that fires on healthy requests is one callers learn to ignore.
partial stays quiet unless the answer really is short.Rate limits
| Layer | Limit |
|---|---|
| Per API key | Set per key; may be unlimited |
| Per IP (proxy) | 60 requests/minute, burst 30 |
| Concurrent connections | 24 per IP |