Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.productbrain.com/llms.txt

Use this file to discover all available pages before exploring further.

List Nodes

GET /api/nodes?projectId={projectId}
Returns all nodes in a project, ordered by creation date.

Parameters

ParameterRequiredDescription
projectIdYesThe project to query
typeNoFilter by node type: goal, need, approach, job, task
iterationNoFilter by iteration name (jobs and tasks only)

Example

# All nodes
curl -s "https://productbrain.com/api/nodes?projectId=my-project" \
  -H "Authorization: Bearer pb_..."

# Goals only
curl -s "https://productbrain.com/api/nodes?projectId=my-project&type=goal" \
  -H "Authorization: Bearer pb_..."

# Jobs in a specific iteration
curl -s "https://productbrain.com/api/nodes?projectId=my-project&type=job&iteration=MVP" \
  -H "Authorization: Bearer pb_..."

Response

{
  "nodes": [
    {
      "id": "goal-1",
      "type": "goal",
      "parentId": null,
      "data": {
        "label": "Help shoppers save money",
        "description": "Core value prop."
      }
    },
    {
      "id": "need-1",
      "type": "need",
      "parentId": "goal-1",
      "data": {
        "label": "Compare prices across stores"
      }
    }
  ],
  "_meta": {
    "currentIteration": "MVP",
    "iterations": {
      "active": ["MVP", "Later"],
      "total": 3
    },
    "nodeCounts": {
      "goal": 2,
      "need": 5,
      "approach": 8,
      "job": 23,
      "task": 4
    }
  }
}
If you’re looking for a specific node by concept, use Search instead of pulling all nodes and filtering. Search uses semantic matching and returns ranked results with ancestor paths.

Node Structure

Every node has:
FieldTypeDescription
idstringAuto-generated: {type}-{number} (e.g. job-42)
typestringgoal, need, approach, job, or task
parentIdstring | nullParent node ID. Null for goals and tasks.
dataobjectNode content — label, description, and type-specific fields

Data fields by type

FieldTypeValid onDescription
labelstringallNode title (required)
descriptionstringallHuman-readable summary
notesstringapproach, jobExtended context, rationale, implementation detail
iterationstringjob, taskWhich iteration this is assigned to
statusstringjob, task"done" or absent
maturitystringjob"mvp" or "releasable"
measurestringapproachHow you’ll know the bet paid off
kanostringapproach"must-have", "performance", or "delighter"
sizestringapproach"skateboard", "vespa", "car", "truck", "antonov"
approachStatusstringapproach"development", "validation", "resolved", "retired"
goalStatusstringgoal"focus", "later", "done"
blockedBystring[]approachIDs of blocking approaches
Setting a field on the wrong node type is rejected by the API.