Quickstart

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.

  1. 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.

  2. 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
      }'
  3. Read the response

    Results are ordered content, not links. provenance indexes 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}}
    }
  4. 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:

FieldMeaning
partialThe payload is incomplete — the deadline expired, or every provider failed. Not "something went wrong somewhere".
degraded_reasonsEverything 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

LayerLimit
Per API keySet per key; may be unlimited
Per IP (proxy)60 requests/minute, burst 30
Concurrent connections24 per IP