Skip to content
NeuralRepo
Get Support

API Overview

The NeuralRepo API is a RESTful JSON API that lets you programmatically manage ideas, tags, relations, and user settings. Everything the web app, the CLI, and the MCP server do is done through these endpoints.

All API requests are made to:

https://neuralrepo.com/api/v1

The API is versioned through the URL path. The current (and only) version is v1.

All request and response bodies use JSON. Set the Content-Type header on every request that includes a body:

Content-Type: application/json

Every endpoint under /api/v1 except /api/v1/health requires authentication. Three credentials are accepted:

MethodHeaderFormat
API keyX-API-Keynrp_ + 64 hexadecimal characters
API key or session tokenAuthorizationBearer <token>
Session cookieCookienrepo_session=<token> — set by the web app

The Authorization: Bearer header accepts either a session token or an API key; the server tries the session table first and falls back to the API-key table. See Authentication for the exact resolution order, key generation, and scopes.

Every idea carries two integers, and they are not interchangeable:

FieldWhat it isWhere you see it
idDatabase primary key, unique across all accountsEvery :id path segment in this API
numberPer-account counter assigned at capture timeThe #42 in CLI listings and the web UI

Every endpoint in this API keys off id. Nothing resolves a number, so passing the #42 you read in a listing either returns someone else’s idea number range as a 404 or — worse — silently addresses a different idea of yours.

Pagination is not uniform across list endpoints — check the endpoint’s own reference page:

EndpointlimitoffsetNotes
GET /ideasdefault 20, max 100default 0has_more is true when the page is exactly limit long
GET /ideas/searchdefault 20, max 100not supportedKeyword mode can return up to limit
GET /tagsnot supportednot supportedReturns every tag
GET /ideas/duplicatesnot supportednot supportedReturns every pending detection
GET /mapnot supportednot supportedReturns the whole graph; filter with since/until
GET /reviewnot supportednot supportedReturns the whole queue

Example:

GET /api/v1/ideas?limit=50&offset=100

Successful responses return the resource wrapped in a named object ({ "ideas": [...] }, { "tags": [...] }, { "relation": {...} }). Delete operations return { "success": true }. Error responses carry an error field — but note that on validation failures error is an object, not a string. See Error Handling.

Every created_at and updated_at value is a UTC SQLite timestamp, not ISO-8601:

{ "created_at": "2026-03-24 09:00:00" }

There is no T separator and no Z suffix. new Date("2026-03-24 09:00:00") parses as local time in most runtimes, so append Z yourself before parsing.

Requests authenticated with an API key or bearer token are rate-limited per user and per day — 100/day on Free, 10,000/day on Pro. Cookie-authenticated requests from the web app are exempt. Exceeding the limit returns 429, and no Retry-After header is sent. See Rate Limits.

The health endpoint is the only unauthenticated route under /api/v1. Use it to verify the API is reachable:

Terminal window
curl https://neuralrepo.com/api/v1/health

Response 200 OK

{
"status": "ok",
"environment": "production",
"timestamp": "2026-03-25T12:00:00.000Z"
}

The health check runs a SELECT 1 against the database. If that query fails, the endpoint returns 503 Service Unavailable with { "status": "error", "error": "Database unavailable" }.

All input fields are validated against these maximum lengths:

FieldMaxBehaviour when exceeded
Idea title200 characters400
Idea body50,000 characters400
Tags per idea20400
Tag name50 characters400
Source URL2,000 characters400
Display name100 characters400
API key label100 characters400
Settings JSON10,000 characters400
Search query500 characters400
List limit100 (default 20)Clamped to 100, no error
Relation note500 charactersSilently truncated, no error
Bulk idea update50 ids400
Bulk relation create50 links400

Some endpoints require a Pro plan and return 403 with pro_required: true on Free:

EndpointGate
POST /user/api-keysPro
PUT/POST on /user/byok/:providerPro
POST, PATCH, DELETE on /map/relationsPro
GET /agent/wsPro

Two more limits are enforced by returning fewer results rather than an error, which is easy to mistake for a bug:

  • GET /ideas/duplicates returns { "duplicates": [] } for every Free account.
  • GET /ideas/search gives Free accounts 10 semantic searches per month, then quietly serves keyword results.

And one is a hard cap on writes: POST /ideas returns 403 idea_limit_reached once a Free account holds 50 unarchived ideas.

The API is currently at v1. Breaking changes will be introduced under a new version prefix (e.g., /api/v2). Non-breaking additions (new fields, new optional parameters) may be added to v1 at any time.

ResourceEndpoints
IdeasGET POST /ideas, GET PATCH DELETE /ideas/:id, PATCH /ideas/bulk, POST /ideas/:id/merge, POST /ideas/:id/develop
SearchGET /ideas/search
DuplicatesGET /ideas/duplicates, POST /ideas/duplicates/:id/dismiss, POST /ideas/duplicates/:id/merge
TagsGET POST /tags, PATCH DELETE /tags/:id, GET /tags/similar
LinksGET POST /ideas/:id/links, DELETE /ideas/:id/links/:linkId
RelationsGET /ideas/:id/relations, POST /map/relations, PATCH DELETE /map/relations/:id
Mind MapGET /map
Review QueueGET /review, POST /review/:ideaId/keep
User & SettingsGET PATCH /user/me, API keys, MCP tokens, BYOK, shortcuts, support link
ExportPOST /user/export, /user/export/csv, /user/export/markdown

Three further routes exist under /api/v1 but are not part of the documented REST surface: GET /agent/ws is a WebSocket upgrade used by the web app’s agent chat, POST /user/billing/checkout and /user/billing/portal return single-use Stripe URLs for the web app’s upgrade flow, and /api/v1/admin/* is operator-only.