Start building

From sign-in to a cited answer in fifteen minutes.

No SDK lock-in. Bearer auth, JSON in, JSON out. Below is the full path from an empty workspace to a source-backed response for your first agent.

01 · Sign in

Create your workspace.

Repo console is gated by Supabase Auth. Sign in with email; on first run you'll be prompted to name your workspace. Your Supabase user becomes the workspace owner.

02 · Connect a source

Slack or Google Drive, OAuth in.

From Sources, click Connect on Slack or Google Drive. You'll go through OAuth, pick your scope (channel allowlist for Slack), and the first sync queues automatically when the connection finishes.

03 · Mint a scoped key

Give your agent the least scope it needs.

In Developers, create a key. Pick an actorType (agent, application, admin), choose the allowed actions, and optionally restrict to a subset of providers. The secret is shown once.

04 · First call

One file. One call. One cited answer.

Use /v1/ask for a synthesized answer, /v1/context for the full Context Contract envelope, or /v1/search for raw ranked memory.

request · POST /v1/askcited answer
curl -X POST https://api.userepo.com/v1/ask \
  -H "Authorization: Bearer $REPO_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "What did we decide about brand assets?",
    "limit": 8
  }'
response · 200question + answer + citations + context
{
  "question": "What did we decide about brand assets?",
  "answer": "Use repo-mark.svg from Brand/assets/svg as the primary mark on dark surfaces …  [1]",
  "citations": [
    { "index": 1, "sourceItemId": "…", "title": "repo-mark.svg",
      "url": "https://drive.google.com/...", "provider": "google_drive" }
  ],
  "context": [ /* ranked chunks */ ]
}
05 · Recipes

Recipes for the agents you ship next.

Three small calls, three different shapes. Pick the surface that matches the contract you want with your model.

recipe · context for model prompt
curl -X POST https://api.userepo.com/v1/context \
  -H "Authorization: Bearer $REPO_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "where is the wordmark SVG?", "limit": 8 }'
recipe · raw memory search
curl -X POST https://api.userepo.com/v1/search \
  -H "Authorization: Bearer $REPO_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "pricing v2", "limit": 5 }'
recipe · TypeScript, no SDK
// no SDK required — fetch() works.
const ctx = await fetch("https://api.userepo.com/v1/context", {
  method: "POST",
  headers: {
    authorization: `Bearer ${process.env.REPO_KEY}`,
    "content-type": "application/json"
  },
  body: JSON.stringify({
    query: "What did we decide about brand assets?",
    limit: 8
  })
}).then((r) => r.json());

// Drop ctx.context into your model prompt; cite using ctx.citations.
06 · Operate

The endpoints, in one page.

The full API reference lives on the Developers page. Limits, headers, error shapes, and the Context Contract v1 envelope.