Skip to content
NeuralRepo
Get Support

Ideas

Ideas are the core resource. Every endpoint on this page addresses an idea by its database id, never by the #N display number.

GET /api/v1/ideas

Returns unarchived ideas, newest first (created_at descending).

ParameterTypeDescription
statusstringOne of captured, exploring, building, shipped, shelved
tagstringFilter by tag name (exact match)
connection_typesstringComma-separated relation types; returns ideas on either end of such a relation
limitnumberItems per page (default 20, clamped to 100)
offsetnumberItems to skip (default 0)

status combines with either filter. tag and connection_types do not combine — if both are supplied, tag wins and connection_types is ignored.

Terminal window
curl "https://neuralrepo.com/api/v1/ideas?status=exploring&limit=10" \
-H "X-API-Key: nrp_YOUR_KEY"

Response 200 OK

{
"ideas": [
{
"id": 137,
"number": 42,
"title": "Add dark mode support",
"body": "Users have requested a dark theme...",
"status": "exploring",
"source": "web",
"source_url": null,
"source_summary": null,
"parent_id": null,
"vectorize_id": "idea_137",
"is_archived": 0,
"tags": ["ui", "feature-request"],
"created_at": "2026-03-20 10:00:00",
"updated_at": "2026-03-22 14:30:00"
}
],
"has_more": true
}

has_more is computed as “this page is exactly limit long”, so the last full page reports has_more: true and the following request returns an empty array. Keep paging until ideas is empty rather than until has_more is false.

POST /api/v1/ideas

FieldTypeRequiredDescription
titlestringYes1–200 characters
bodystringNoMax 50,000 characters
tagsstring[]NoMax 20 tags, each max 50 characters; unknown tags are created
sourcestringNoOne of web, cli, claude-mcp, siri, email, api, shortcut, ios
source_urlstringNoValid URL, max 2,000 characters
statusstringNoInitial status (default captured)
parent_idnumberNoParent idea id for nesting
Terminal window
curl -X POST https://neuralrepo.com/api/v1/ideas \
-H "X-API-Key: nrp_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Implement webhook notifications",
"body": "Send HTTP callbacks when ideas change status.",
"tags": ["backend", "integrations"],
"source": "api"
}'

Response 201 Created

{
"id": 138,
"number": 43,
"title": "Implement webhook notifications",
"body": "Send HTTP callbacks when ideas change status.",
"status": "captured",
"source": "api",
"source_url": null,
"parent_id": null,
"vectorize_id": null,
"is_archived": 0,
"tags": ["backend", "integrations"],
"processing": true,
"created_at": "2026-03-24 09:00:00",
"updated_at": "2026-03-24 09:00:00"
}

processing: true means the idea is saved but its embedding, auto-tags, related-idea links, and duplicate check are still queued. vectorize_id stays null until that work completes — which is why a brand-new idea is not immediately findable by semantic search. If the queue write itself fails, the idea is still stored and an hourly recovery cron picks it up.

POST /ideas is the one endpoint with a hard plan limit. Once a Free account holds 50 unarchived ideas, further creates are refused before validation:

Response 403 Forbidden

{
"error": "idea_limit_reached",
"message": "You've captured 50 ideas on the free plan. Upgrade to Pro for unlimited ideas.",
"currentCount": 50,
"limit": 50,
"upgradeUrl": "https://neuralrepo.com/upgrade",
"featureRequestUrl": "https://support.neuralrepo.com/feature-requests"
}

Note that error here is a machine-readable code rather than a sentence — the human-readable text is in message. Archiving an idea frees a slot, since the count is of unarchived ideas.

GET /api/v1/ideas/:id

Returns a single idea with its tags, links, and relations. Archived ideas are still returned by this endpoint — it is the one place they remain reachable.

Response 200 OK

{
"id": 138,
"number": 43,
"title": "Implement webhook notifications",
"body": "Send HTTP callbacks when ideas change status.",
"status": "captured",
"source": "api",
"source_url": null,
"parent_id": null,
"is_archived": 0,
"tags": ["backend", "integrations"],
"links": [],
"relations": [],
"created_at": "2026-03-24 09:00:00",
"updated_at": "2026-03-24 09:00:00"
}

relations here is the flat list — every relation touching this idea in either direction, each carrying related_idea_title and related_idea_number, ordered by score. For the outgoing/incoming split, use GET /ideas/:id/relations.

PATCH /api/v1/ideas/:id

All fields are optional. Only provided fields are updated.

FieldTypeRequiredDescription
titlestringNo1–200 characters
bodystringNoMax 50,000 characters; replaces the body, never appends
statusstringNoNew status value
parent_idnumber | nullNoSet or remove parent (pass null to detach)
tagsstring[]NoReplaces all tags; max 20, each max 50 characters

Changing title, body, or parent_id re-queues the idea for embedding and relation reconciliation. Changing only status or tags queues a lighter metadata update and leaves the embedding alone.

Response 200 OK — the updated idea, with its tags.

PATCH /api/v1/ideas/bulk

Update status and/or tags for up to 50 ideas in one request.

FieldTypeRequiredDescription
idsnumber[]YesIdea ids to update, 1–50
statusstringNoNew status for all ideas
tagsstring[]NoReplace all tags (cannot be combined with add_tags/remove_tags)
add_tagsstring[]NoAppend tags without removing existing ones
remove_tagsstring[]NoRemove specific tags

At least one of status, tags, add_tags, or remove_tags must be provided. Combining tags with either of the other two returns 400.

Terminal window
curl -X PATCH https://neuralrepo.com/api/v1/ideas/bulk \
-H "X-API-Key: nrp_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"ids": [137, 138, 96],
"status": "building",
"add_tags": ["sprint-1"]
}'

Response 200 OK

{
"updated": 2,
"errors": 1,
"results": [
{ "id": 137, "status": "updated" },
{ "id": 138, "status": "updated" },
{ "id": 96, "status": "error", "error": "Idea 96 not found" }
]
}

An id that does not exist — or belongs to another account — comes back as a per-idea error row, not a 404.

DELETE /api/v1/ideas/:id

Archives the idea by setting is_archived = 1, then deletes its vector from the search index.

What an archived idea disappears from:

SurfaceEffect
GET /ideas, GET /map, GET /reviewExcluded
GET /ideas/searchExcluded from both keyword and semantic results
RelationsFiltered out of every relation query, in both directions
GET /ideas/duplicatesDetections referencing it are dropped
POST /user/export and the CSV/Markdown exportsExcluded — archiving before exporting loses the content
GET /ideas/:idStill returns it, if you kept the id
Free-plan idea capFrees a slot; the cap counts unarchived ideas only

Response 200 OK{ "success": true }. A 404 means the id is not yours or does not exist; deleting an already-archived idea succeeds again and changes nothing.

POST /api/v1/ideas/:id/merge

Folds another idea into this one. The idea in the path (keep_id) survives.

FieldTypeRequiredDescription
absorb_idnumberYesid of the idea to absorb
Terminal window
curl -X POST https://neuralrepo.com/api/v1/ideas/137/merge \
-H "X-API-Key: nrp_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"absorb_id": 138}'

Exactly what happens:

AspectBehaviour
BodyBoth bodies joined with a \n\n---\n\n separator, kept idea first
TagsUnion of both sets
RelationsRepointed from the absorbed idea to the kept idea; self-relations are removed
LinksNot transferred — they stay on the absorbed idea, which is then archived
created_atThe earlier of the two, so the merged idea keeps the original capture date
Absorbed ideaSet to status: "shelved" and archived — and therefore not recoverable
supersedes relationNot created; archived ideas are filtered from relation queries, so it would be invisible

Merging an idea with itself returns 400. If either id is missing or not yours, the whole operation returns 404 and nothing is changed.

Response 200 OK — the surviving idea, with its merged tag list.

POST /api/v1/ideas/:id/develop

Sends the idea, its tags, its related ideas, and its links to your configured AI provider and asks for a buildable specification.

Requires a BYOK provider key. Storing one is itself a Pro feature, so in practice this endpoint is Pro-only.

Terminal window
curl -X POST https://neuralrepo.com/api/v1/ideas/137/develop \
-H "X-API-Key: nrp_YOUR_KEY"

Response 200 OK

{
"spec": "### Problem\n\n...",
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
"usage": {
"input_tokens": 2400,
"output_tokens": 1800
}
}

The response is capped at 4,096 output tokens and the prompt asks for under 1,500 words, laid out as Problem / Proposed solution / Key features / Technical approach / Open questions — with a Mermaid diagram in the technical section where one helps.

FailureStatusBody
No provider key stored400{ "error": "No AI provider configured...", "needs_byok": true }
Provider rejected the call or returned an error502{ "error": "<provider message>", "provider": "anthropic" }
Idea id not found404{ "error": "Idea not found" }
StatusMeaning
200 OKSuccessful read, update, archive, merge, or develop
201 CreatedIdea created
400 Bad RequestValidation error, non-numeric :id, self-merge, or a bad bulk payload
401 UnauthorizedMissing or invalid auth
403 ForbiddenFree-plan idea cap reached (idea_limit_reached)
404 Not FoundIdea not found, or not yours
502 Bad GatewayYour AI provider failed during develop

No endpoint on this page returns 409.