The SeeRepo API
Use the SeeRepo API to read your project's map from a script, your backend or an AI agent: its modules and parts, a search, what changed since a date, and its figures. It reads; with a key you let write, it also makes three changes (ignore paths, mark a finding false, set a task aside), each in two steps. It comes with every plan.
There are three ways in, with the same key:
| Way in | Use it for |
|---|---|
| API | Your own code or scripts, with plain HTTP |
| MCP | An AI agent like Claude Code, Codex or Cursor, asking in words |
| CLI | Your terminal: npx seerepo map |
Base URL
https://seerepo.com/api/v1/
Authentication
Every request carries an API key as a Bearer token:
Authorization: Bearer sr_…
Create keys in Settings → API / MCP (your account's settings, not a project's). Name each one after where it's used, like "Claude Code". The key is shown whole once; afterwards only its last 4 characters. Revoke a key there and whatever uses it stops at once.
One key reads every map your account reads: your own and the ones shared with you. It can't read anyone else's: their repos answer as not found.
Keep your key secret: don't put it in front-end code or in a public repo.
Get started
- Create a key in Settings → API / MCP.
- List your repos and take the
idof one:
curl https://seerepo.com/api/v1/repos \
-H "Authorization: Bearer $SEEREPO_KEY"
- Read its first level, then follow the
pathof any part to go inside:
curl "https://seerepo.com/api/v1/repos/REPO_ID/world?path=/" \
-H "Authorization: Bearer $SEEREPO_KEY"
REPO_ID may also be owner/name, with the slash written %2F: ana%2Ftienda.
Endpoints
| Endpoint | What it returns |
|---|---|
| `GET /me` | The account your key belongs to |
| `GET /repos` | The maps your key reads |
| `GET /repos/:repo/world` | One module: its parts, where it connects, its outside services |
| `GET /repos/:repo/search` | Parts by name or phrase in every module, and files by path |
| `GET /repos/:repo/impact` | What breaks if you touch a file: who names it, how far it gets, which pages and processes |
| `GET /repos/:repo/events` | The commits since a date, in plain words |
| `GET /repos/:repo/figures` | The lifetime figures: commits, AI, lines and files |
| `GET /repos/:repo/pages` | Every page: who gets in and the states it handles or misses |
| `GET /repos/:repo/found` | How search engines and AI see each public page, with proof |
| `GET /repos/:repo/health` | The score, whether it can ship and the tasks, each with its prompt |
| `GET /repos/:repo/history` | The last 7 days, the pace and the moments |
| `GET /repos/:repo/docs` | The repo's wiki: its tree, and each page with its sources |
| `GET /repos/:repo/docs/:page` | One page of the wiki in markdown, with its sources linked to GitHub |
| `POST /repos/:repo/changes` | Prepare a change, with a key that writes; POST /changes/apply applies it, POST /changes/:id/undo undoes it, GET /repos/:repo/changes lists them |
The API never returns your code: names, phrases, paths and figures only. A repo on the free look reads as it does in the app: whole up to 300,000 written lines, without what its parts do except its sample; above that, only its first level, with a 402 going inside.
Responses
Every answer is JSON with the same envelope:
{ "status": "success", "data": { } }
Errors
{ "status": "error", "error": { "code": "not_found", "message": "No repo with that id or name in this account." } }
| Status | code |
When |
|---|---|---|
| 400 | bad_path, bad_query, bad_since |
A parameter isn't valid; the message says how to write it |
| 401 | unauthorized |
No key, a mistyped one or a revoked one |
| 402 | plan_required |
A module of a free repo above 300,000 written lines, or a free repo's commits in plain words |
| 404 | not_found, no_world |
A repo your account doesn't read, or a path with no module |
| 429 | rate_limited |
Over the limit; Retry-After says how many seconds to wait |
Limits
60 requests a minute per key. An agent stuck in a loop gets 429 with a Retry-After header, and can try again after those seconds.