---
title: "List/filter goal nodes"
method: GET
path: "/api/goal/nodes"
tags: ["Goal"]
---

# List/filter goal nodes

`GET /api/goal/nodes`

## Request

- Base URL: `http://localhost:38200`
- URL: `http://localhost:38200/api/goal/nodes`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `token`

## Query parameters

- `project_id` integer
- `owner_role` string
- `status` string
- `kind` string
- `archived` 'exclude' | 'only' | 'all'
- `external_local_id` string
- `external_source` string
- `workspace` string
- `updated_after` string, date-time
- `limit` integer
- `objective_run_id` string

## Response `200`

Node list.

- object
  - `nodes` GoalNodeWithDeps[]
    - `id` integer
    - `tenantId` integer
    - `projectId` integer, nullable
    - `parentId` integer, nullable
    - `kind` string: objective | milestone | goal | work_item | relay
    - `ownerRole` string, nullable
    - `status` string: draft | not_started | ready | in_progress | blocked | done | superseded
    - `origin` string, nullable: greenfield | leverage | migrate | unknown
    - `title` string
    - `contextId` integer, nullable
    - `verifyCmd` string, nullable
    - `evidence` string, nullable
    - `targetWeeks` integer, nullable
    - `startsAt` string, date-time, nullable
    - `endsAt` string, date-time, nullable
    - `size` string, nullable
    - `effortWeeks` number, nullable
    - `externalRef` object
    - `orderIndex` integer
    - `fromRole` string, nullable: Relay routing (kind='relay' only).
    - `toRole` string, nullable: Relay routing (kind='relay' only).
    - `claimedBySessionId` integer, nullable
    - `nudgeCount` integer
    - `lastNudgedAt` string, date-time, nullable
    - `nudgedBySessionId` integer, nullable
    - `payload` object
    - `doneAt` string, date-time, nullable
    - `archivedAt` string, date-time, nullable
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
    - `syncOwned` boolean: Server-only marker set exclusively by POST /api/goal/sync.
    - `objectiveRunId` string, nullable
    - `depsIn` GoalDepRef[]: Incoming edges; `nodeId` is the source. A `blocks` edge here names a blocker.
      - `nodeId` integer
      - `kind` 'blocks' | 'informs'
    - `depsOut` GoalDepRef[]: Outgoing edges; `nodeId` is the target this node blocks or informs.
      - `nodeId` integer
      - `kind` 'blocks' | 'informs'

## Other responses

- `400`: Validation failed, or a camelCase alias of a snake_case parameter was sent (e.g. `projectId` instead of `project_id`), which is rejected rather than silently ignored.
- `401`: Missing or invalid credentials.

---

[API](https://skmtc.dev/contextq/apis/contextq-api.md) · [All operations](https://skmtc.dev/contextq/apis/contextq-api/llms.txt) · [OpenAPI document](https://skmtc.dev/contextq/apis/contextq-api/revisions/7afc44056a22?raw)
