Skip to content

Across any work item

Operations addressed by {entity_type} and a short code, so they work uniformly across the five families.

Create a relationship edge, or a proposal of a blocks edge.

The link rule applies (COLLIERY-T-0228). The caller can edit the source or the target. A blocks edge needs the target, the blocked item (KAIROS-T-0569). A caller who can edit the source only gets a proposal of the edge. The answer is 202 with the proposal. The message says who can confirm it (KAIROS-A-0060).

The T-0013 graph service enforces the A-0001 type-rule matrix, cycle prevention for parent/blocks, and duplicate detection — each rejection is a 422 with its typed reason (module docs).

Parameter In Required Type Description
Idempotency-Key header no string, nullable Optional. A key that you choose for this write: 8 to 128 characters of letters, digits, ‘.’, ‘_’, ‘:’ and ‘-’ (a UUID is a good key). Send it when you may retry the request. For 24 hours, a request with the same key and the same arguments writes nothing and gives the first status and body again, with the header Idempotent-Replayed: true. The same key with other arguments is refused with REQUEST_KEY_REUSED (KAIROS-A-0065).

Request body (required): application/json, CreateRelationshipRequest

Response Body Meaning
201 Relationship Edge created (relationship_add activity row written)
202 ProposedRelationship No edge: a proposal of a blocks edge. The caller can edit the source only. The message says who can confirm it
403 ErrorEnvelope The caller may edit neither the source nor the target
409 ErrorEnvelope CONFLICT: the same proposal is pending, or the item has too many pending proposals; or REQUEST_KEY_REUSED: the Idempotency-Key was used for a different request
422 ErrorEnvelope Rule violation, cycle, duplicate edge, or unknown endpoint

Remove a relationship edge by id.

The link rule applies (COLLIERY-T-0228), as for the create.

The supports edge of a document has a rule of its own (COLLIERY-T-0235). The caller must be able to edit the document. Each document has an owner board (COLLIERY-T-3109). So the last supports edge of a document can go.

Goes through the T-0013 unlink service so the relationship_remove activity row is written.

Parameter In Required Type Description
id path yes string Relationship edge id (UUID)
Response Body Meaning
200 DeletedResponse Edge removed
403 ErrorEnvelope The caller may edit neither the source nor the target. For the supports edge of a document: the caller may not edit the document
404 ErrorEnvelope No such edge

GET /api/{entity_type}/{short_code}/children-progress

Section titled “GET /api/{entity_type}/{short_code}/children-progress”

Direct-children progress rollup for one item (KAIROS-T-0080): the parent-edge children grouped by their board column, plus the (done, total) summary. Supports/informs material never counts; resolution 404s exactly like the relationships GET.

An archived child counts by the column that it was archived from (KAIROS-T-0571). A child archived from a done column counts as done, or as cancelled with the cancel mark. So “Archive completed” keeps the progress of an initiative. A child archived from another column is in removed. It is not open work, and it is not in total or in by_column.

Parameter In Required Type Description
entity_type path yes string Entity family (plural URL segment)
short_code path yes string The parent item’s short code
Response Body Meaning
200 ChildrenProgressResponse The rollup
404 ErrorEnvelope Unknown short code

GET /api/{entity_type}/{short_code}/external

Section titled “GET /api/{entity_type}/{short_code}/external”

The external references of an item (open tenant-wide). The item can be archived: its references stay.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
Response Body Meaning
200 ItemExternalRefsResponse The external references of the item, oldest first
404 ErrorEnvelope Unknown family or short code

POST /api/{entity_type}/{short_code}/external

Section titled “POST /api/{entity_type}/{short_code}/external”

Link an item to a URI with a label.

The edit rule applies (COLLIERY-T-0228): the caller can edit the item. The scheme of the URI is http, https or mailto.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code

Request body (required): application/json, CreateExternalRefRequest

Response Body Meaning
201 ExternalRef Reference created (relationship_add activity row written)
403 ErrorEnvelope Refused by the edit rule: the caller cannot edit the item
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope VALIDATION: the scheme of the URI is not http, https or mailto (the refusal names it), or the label is too long. ALREADY_LINKED: the item has that URI

DELETE /api/{entity_type}/{short_code}/external/{id}

Section titled “DELETE /api/{entity_type}/{short_code}/external/{id}”

Remove an external reference by its id.

The edit rule applies (COLLIERY-T-0228), as for the create.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
id path yes string The id of the reference (UUID), from the list
Response Body Meaning
200 DeletedExternalRefResponse Reference removed (relationship_remove activity row written)
403 ErrorEnvelope Refused by the edit rule: the caller cannot edit the item
404 ErrorEnvelope Unknown family or short code, or the item has no reference with that id

The focal subgraph (KAIROS-T-0088): every node within depth hops over any relationship type in either direction, plus ALL edges among the returned nodes — the wire contract the graph view draws from. Open tenant-wide like the other graph reads.

Archived nodes are drawn, marked with archived_at (KAIROS-T-0158). The explorer and the relationships panel render the same edges, and ADR-20 warns that a half-applied visibility rule is worse than none — a node listed in the panel and missing from the picture invites the reader to trust whichever they saw last. Omitting them also broke paths that merely passed THROUGH archived work: the walk hops over item_relationships directly, so the far side stayed in the node set with its connecting node deleted out of the middle.

The mark done: true shows a node in a terminal column (COLLIERY-T-0233, the rule of COLLIERY-T-0214). A blocks edge with a done node at one end is history, not a blocker. The graph keeps the edge, and the client draws it with a different style.

Parameter In Required Type Description
entity_type path yes string Entity family (plural URL segment)
short_code path yes string The focal item’s short code
depth query no integer Hop bound; defaults to 2, capped at MAX_TRAVERSE_DEPTH.
Response Body Meaning
200 GraphResponse The focal subgraph
404 ErrorEnvelope Unknown family or short code

GET /api/{entity_type}/{short_code}/impacts

Section titled “GET /api/{entity_type}/{short_code}/impacts”

The repositories that a document or an ADR impacts (open tenant-wide).

A link to an archived repository is in the list, with archived_at. The item can be archived: its links stay.

Parameter In Required Type Description
entity_type path yes string Plural family name (documents
short_code path yes string Item short code
Response Body Meaning
200 ItemImpactsResponse The impacts links of the item, by the slug of the repository
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not a document and not an ADR

POST /api/{entity_type}/{short_code}/impacts

Section titled “POST /api/{entity_type}/{short_code}/impacts”

Make an impacts link from a document or an ADR to a repository.

The edit rule applies (COLLIERY-T-0228). The caller can edit the item. The caller needs no right on the repository. The link gives no right.

The repository is a live repository of the organization, of each team.

Parameter In Required Type Description
entity_type path yes string Plural family name (documents
short_code path yes string Item short code

Request body (required): application/json, CreateImpactRequest

Response Body Meaning
201 Impact Link created (relationship_add activity row written)
403 ErrorEnvelope Refused by the edit rule: the caller cannot edit the item
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not a document and not an ADR. ALREADY_LINKED: the link is there. VALIDATION: no live repository has that slug or id

DELETE /api/{entity_type}/{short_code}/impacts/{repository}

Section titled “DELETE /api/{entity_type}/{short_code}/impacts/{repository}”

Remove an impacts link.

The edit rule applies (COLLIERY-T-0228), as for the create. The repository can be archived.

Parameter In Required Type Description
entity_type path yes string Plural family name (documents
short_code path yes string Item short code
repository path yes string Repository slug (or UUID)
Response Body Meaning
200 DeletedImpactResponse Link removed (relationship_remove activity row written)
403 ErrorEnvelope Refused by the edit rule: the caller cannot edit the item
404 ErrorEnvelope Unknown family or short code, or the item does not impact that repository
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not a document and not an ADR

The branches and pull/merge requests linked to one item (KAIROS-T-0100). Ordering is server-side (pull requests before branches, newest first) so every client agrees. Open tenant-wide like its sibling reads.

Parameter In Required Type Description
entity_type path yes string Entity family (plural URL segment)
short_code path yes string The item’s short code
Response Body Meaning
200 array of ItemLink Linked branches and pull/merge requests
404 ErrorEnvelope Unknown family or short code

The owner of a strategy or an initiative. Each person in the tenant can read it. An item with no owner has no owner.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
Response Body Meaning
200 ItemOwnerResponse The owner of the item
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not a strategy and not an initiative

DELETE /api/{entity_type}/{short_code}/owner

Section titled “DELETE /api/{entity_type}/{short_code}/owner”

Release the owner of a strategy or an initiative. The owner can release it, and an organization admin can remove each owner. Nobody else. The item then has no owner, and a member of its board can claim it.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
Response Body Meaning
200 ItemOwnerResponse The item has no owner (release activity row written)
403 ErrorEnvelope The caller is not the owner and not an organization admin
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not a strategy and not an initiative. NO_OWNER: the item has no owner

POST /api/{entity_type}/{short_code}/owner/claim

Section titled “POST /api/{entity_type}/{short_code}/owner/claim”

Claim a strategy or an initiative that has no owner. The caller becomes the owner. The caller must be a person. The caller must be a member of the board (a grant on it) or an organization admin. The owner gets no right from the claim.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
Response Body Meaning
200 ItemOwnerResponse The caller is the owner (claim activity row written)
403 ErrorEnvelope The caller is not a member of the board and not an organization admin, or is a service account
404 ErrorEnvelope Unknown family or short code
409 ErrorEnvelope The item has an owner
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not a strategy and not an initiative

POST /api/{entity_type}/{short_code}/owner/hand-off

Section titled “POST /api/{entity_type}/{short_code}/owner/hand-off”

Give a strategy or an initiative to a different person. to is a user id, an email or a user name of a person of the organization. The new owner must be a member of the board of the item (a grant on it). The owner can hand it off. An organization admin can set the owner of each item, also of an item with no owner. The new owner gets a notification.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code

Request body (required): application/json, HandOffRequest

Response Body Meaning
200 ItemOwnerResponse The person is the owner (hand_off activity row written)
403 ErrorEnvelope The caller is not the owner and not an organization admin
404 ErrorEnvelope Unknown family or short code
409 ErrorEnvelope The person is the owner already
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not a strategy and not an initiative. VALIDATION: to is not a person of the organization. NOT_BOARD_MEMBER: to is not a member of the board of the item

PUT /api/{entity_type}/{short_code}/parent

Section titled “PUT /api/{entity_type}/{short_code}/parent”

Set the parent of an initiative or a task, or remove it with null (KAIROS-T-0572). An item has one parent. The new edge replaces the old one in one transaction, so no reader sees two parents.

The link rule applies to each edge that changes (COLLIERY-T-0228). The caller may edit the item, or the parent at that end. The same parent again changes nothing (changed: false). Kairos refuses a retired code of the item. A retired code of the parent finds its item (KAIROS-T-0560). The move rules do not apply: a change of parent is not a move (KAIROS-A-0040 decision 7).

Parameter In Required Type Description
entity_type path yes string initiatives or tasks
short_code path yes string The item’s short code

Request body (required): application/json, SetParentRequest

Response Body Meaning
200 SetParentResponse The parent now and before; changed is false when nothing changed
403 ErrorEnvelope The caller may edit neither the item nor the parent at an end that changes
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope No parent key, a type with no parent, an unknown or archived parent, RELATIONSHIP_RULE, or PARENT_EXISTS (a write at the same time set a parent)

GET /api/{entity_type}/{short_code}/relationships

Section titled “GET /api/{entity_type}/{short_code}/relationships”

All relationships of an item, both directions, grouped by type (open tenant-wide read; hydrated through entity_directory).

Archived neighbours are included, marked with archived_at (KAIROS-T-0158, ADR-20). They used to drop out of the hydrating join, which made this endpoint answer “what does this item contain / depend on?” with fewer rows than the truth — silently, with no flag that could recover them, and about a LIVE item. There is deliberately no opt-out: an item’s edges are a property of the item being viewed, so the honest default is to report every edge and say which ends are put away. The item itself may be archived too (resolution is [Liveness::IncludeArchived] since KAIROS-T-0154).

The mark done: true shows a neighbour in a terminal column (COLLIERY-T-0214). Done work does not block, and nothing blocks done work. A blocks edge with a done end is history, not a blocker. The list keeps the edge: only the counts on the board change.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
Response Body Meaning
200 ItemRelationshipsResponse Both directions, grouped by relationship type
404 ErrorEnvelope Unknown family or short code

The teams of an initiative or a strategy, by slug. Each person in the tenant can read them. They come from its tasks, and by hand.

Parameter In Required Type Description
entity_type path yes string Plural family name (initiatives
short_code path yes string Item short code
Response Body Meaning
200 ItemTeamsResponse The teams of the item, by slug
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not an initiative and not a strategy

POST /api/{entity_type}/{short_code}/teams

Section titled “POST /api/{entity_type}/{short_code}/teams”

Set a team on an initiative or a strategy by hand, for example before it has tasks. The team stays when tasks come.

The edit rule of the item applies. The caller needs no right on the team. The team gives no right on the item.

Parameter In Required Type Description
entity_type path yes string Plural family name (initiatives
short_code path yes string Item short code

Request body (required): application/json, SetItemTeamRequest

Response Body Meaning
201 ItemTeam Team set (relationship_add activity row written)
403 ErrorEnvelope Refused by the edit rule: the caller cannot edit the item
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not an initiative and not a strategy. ALREADY_LINKED: the team is set already. VALIDATION: no live team has that slug or id

DELETE /api/{entity_type}/{short_code}/teams/{team}

Section titled “DELETE /api/{entity_type}/{short_code}/teams/{team}”

Clear a team that is set on an initiative or a strategy by hand. A team that the item gets from its tasks stays.

The edit rule of the item applies. The team can be archived.

Parameter In Required Type Description
entity_type path yes string Plural family name (initiatives
short_code path yes string Item short code
team path yes string Team slug (or UUID)
Response Body Meaning
200 ClearedItemTeamResponse Team cleared (relationship_remove activity row written)
403 ErrorEnvelope Refused by the edit rule: the caller cannot edit the item
404 ErrorEnvelope Unknown family or short code, or the team is not set on the item by hand
422 ErrorEnvelope RELATIONSHIP_RULE: the item is not an initiative and not a strategy

GET /api/{entity_type}/{short_code}/metadata

Section titled “GET /api/{entity_type}/{short_code}/metadata”

An item’s metadata values with their definitions (open tenant-wide).

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
Response Body Meaning
200 ItemMetadataResponse The item’s metadata values
404 ErrorEnvelope Unknown family or short code

PATCH /api/{entity_type}/{short_code}/metadata

Section titled “PATCH /api/{entity_type}/{short_code}/metadata”

Set/update/clear metadata values on an item.

The edit rule applies (COLLIERY-T-0228). The caller created the item, holds manage_<type> on its authorization board, or is an organization admin.

Every entry is validated BEFORE anything is written (A-0003: unknown slug and invalid values are 422 VALIDATION); the writes then apply atomically. Each value that changes writes one activity row (KAIROS-T-0557).

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code

Request body (required): application/json, UpdateMetadataRequest

Response Body Meaning
200 ItemMetadataResponse The item’s metadata after the update
403 ErrorEnvelope Refused by the edit rule: the caller did not create the item and lacks the capability
404 ErrorEnvelope Unknown family or short code
422 ErrorEnvelope Unknown definition slug or invalid value for its type

GET /api/{entity_type}/{short_code}/activity

Section titled “GET /api/{entity_type}/{short_code}/activity”

The activity of one item, newest first (KAIROS-T-0557).

Each row has the action, the stored details, and text. The text is the row as one line. It names the people, the boards, the columns and the repositories.

The list has moves, cancels, claims, hand-offs and releases. It also has the lane, metadata values, state writes and links. A link between two items is in the list of the two items. An archived item has its activity too.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
limit query no integer Page size (default 50, max 200).
offset query no integer Rows to skip (default 0).
Response Body Meaning
200 ListEnvelope_ItemActivityEntry Page of the activity of the item, newest first
404 ErrorEnvelope Unknown family or short code

GET /api/{entity_type}/{short_code}/history

Section titled “GET /api/{entity_type}/{short_code}/history”

Content version history: the paginated version list, or one full snapshot with ?version=N.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
version query no integer Return this version’s full snapshot instead of the version list.
limit query no integer Page size for the version list (default 50, max 200).
offset query no integer Rows to skip (default 0).
Response Body Meaning
200 ListEnvelope_HistoryVersion Version list envelope (or a HistorySnapshot with ?version=N)
404 ErrorEnvelope Unknown family, short code, or version

POST /api/{entity_type}/{short_code}/notes

Section titled “POST /api/{entity_type}/{short_code}/notes”

Append a note to an item. The note gets the next id (n-3), the time and the caller as its author. The text is markdown, and it can have headings. The note writes no version of the content: the read of the item shows it in notes.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
Idempotency-Key header no string, nullable Optional. A key that you choose for this write: 8 to 128 characters of letters, digits, ‘.’, ‘_’, ‘:’ and ‘-’ (a UUID is a good key). Send it when you may retry the request. For 24 hours, a request with the same key and the same arguments writes nothing and gives the first status and body again, with the header Idempotent-Replayed: true. The same key with other arguments is refused with REQUEST_KEY_REUSED (KAIROS-A-0065).

Request body (required): application/json, AppendNoteRequest

Response Body Meaning
200 AppendNoteResponse Appended; the id of the note and the version of the content, which does not change
403 ErrorEnvelope Refused by the edit rule: the caller did not create the item and lacks the capability
404 ErrorEnvelope Unknown family or short code, or the item is archived
409 ErrorEnvelope REQUEST_KEY_REUSED: the Idempotency-Key was used for a different request
422 ErrorEnvelope The text is empty, or the body has an unknown field

POST /api/{entity_type}/{short_code}/notes/{note_id}/promote

Section titled “POST /api/{entity_type}/{short_code}/notes/{note_id}/promote”

Turn a note into a draft ADR or document (KAIROS-T-0505). The new item has the text of the note. A line names the note, its author and its date. It supports the source item when the source is a strategy, an initiative or a task. The note gets promoted_to: the code of the new item. Kairos promotes a note one time only: a second promote gets 409 CONFLICT, which names the item.

The edit rule of the source item applies. The caller needs the right to create on the target board.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
note_id path yes string The id of the note, as get_item lists it (n-3)
Idempotency-Key header no string, nullable Optional. A key that you choose for this write: 8 to 128 characters of letters, digits, ‘.’, ‘_’, ‘:’ and ‘-’ (a UUID is a good key). Send it when you may retry the request. For 24 hours, a request with the same key and the same arguments writes nothing and gives the first status and body again, with the header Idempotent-Replayed: true. The same key with other arguments is refused with REQUEST_KEY_REUSED (KAIROS-A-0065).

Request body (required): application/json, PromoteNoteRequest

Response Body Meaning
201 PromoteNoteResponse The new item and its edge
403 ErrorEnvelope Refused by the edit rule of the source item, or the caller cannot create on the target board
404 ErrorEnvelope Unknown family, short code, note id or board
409 ErrorEnvelope The note has the mark of a promote; the refusal names the item; or REQUEST_KEY_REUSED: the Idempotency-Key was used for a different request
422 ErrorEnvelope The kind is not adr or document, or the body has an unknown field

GET /api/{entity_type}/{short_code}/cascade-preview

Section titled “GET /api/{entity_type}/{short_code}/cascade-preview”

What an archive of this item BY THE CALLER would take, and what it would leave (COLLIERY-T-0234), computed without deleting. An open tenant-wide read: it names short codes, which each member can read.

The answer is for the caller who asks. It does not say whether the caller may archive the item itself: DELETE checks that.

Parameter In Required Type Description
entity_type path yes string Plural family name (strategies
short_code path yes string Item short code
Response Body Meaning
200 CascadePreviewResponse What a soft-delete by the caller would cascade to (root excluded), and the live descendants that it would leave, matching the eventual DeleteResponse
404 ErrorEnvelope Unknown family or short code

POST /api/{entity_type}/{short_code}/restore

Section titled “POST /api/{entity_type}/{short_code}/restore”

Put an archived item back on its board.

Parameter In Required Type Description
entity_type path yes string Plural family name
short_code path yes string Item short code
Response Body Meaning
200 RestoreResponse Restored
403 ErrorEnvelope Refused by the edit rule: the caller did not create the item and lacks the capability
404 ErrorEnvelope Unknown short code, or the item is not archived
422 ErrorEnvelope Its board, column, team or repository is gone; details.missing names them

Pending edge proposals touching an item.

Parameter In Required Type Description
short_code path yes string The item
Response Body Meaning
200 array of EdgeProposalDto Undecided proposals naming this item at either end, best-evidence first
401 ErrorEnvelope Missing/invalid token
404 ErrorEnvelope No item with that short code

Related work for an item (KAIROS-A-0021 rules 5-7, KAIROS-T-0191).

A separate surface, deliberately. /api/search keeps its at-least-one rule, its ≤5-query bound and its deterministic sort; callers relying on those keep them, and nothing here changes what that endpoint does.

GET rather than POST, unlike /api/search: this takes one identifier and is a read with no body, so it is cacheable and linkable and behaves the way a reader expects.

Parameter In Required Type Description
short_code path yes string The item to find related work for
limit query no integer How many proposals (default 5, max 10)
Response Body Meaning
200 RelatedWorkResponse Bounded proposals, best first. vector: false means a degraded, text-only answer rather than a wrong one
401 ErrorEnvelope Missing/invalid token
403 ErrorEnvelope Not a member of the organization
404 ErrorEnvelope No item with that short code
503 ErrorEnvelope Embeddings are not enabled on this deployment

Confirm a proposal, creating the edge.

The caller holds approve_proposals on the board of one end, or is an organization admin (KAIROS-T-0659). A refused confirm leaves the proposal pending.

Parameter In Required Type Description
id path yes string The proposal
Response Body Meaning
200 EdgeProposalDto Confirmed; the relationship now exists
400 ErrorEnvelope The edge was refused by the graph’s own rules — a cycle, or a shape the rule matrix forbids
403 ErrorEnvelope FORBIDDEN: the caller holds approve_proposals on neither board and is not an organization admin; details.any_of names the board of each end
404 ErrorEnvelope No such proposal
409 ErrorEnvelope CONFLICT: the proposal is decided already, also by a decision at the same time

Reject a proposal. Recorded, not erased.

The rule of who decides is the rule of the confirm (KAIROS-T-0659).

Parameter In Required Type Description
id path yes string The proposal
Response Body Meaning
200 EdgeProposalDto Rejected, and kept — a repeatedly rejected pair is the clearest signal that retrieval is wrong about something
403 ErrorEnvelope FORBIDDEN: the caller holds approve_proposals on neither board and is not an organization admin; details.any_of names the board of each end
404 ErrorEnvelope No such proposal
409 ErrorEnvelope CONFLICT: the proposal is decided already, also by a decision at the same time

Unified search (KAIROS-A-0007): full-text q, structured filter, and graph traverse compose freely; at least one must be present.

A hit is a card (KAIROS-T-0602). It has the title and a snippet of the content near the match. It has no content. The item route of the hit gives the content.

Request body (required): application/json, SearchRequest

Response Body Meaning
200 SearchResponse Matches grouped by entity type (empty groups omitted); total counted before pagination
400 ErrorEnvelope Invalid search request; details.field names the offending field
401 ErrorEnvelope Missing/invalid token
403 ErrorEnvelope Not a member of the organization
404 ErrorEnvelope traverse.from names no entity the request may see (unknown, or archived without filter.include_deleted)