Across any work item
Operations addressed by {entity_type} and a short code, so they work uniformly across the five families.
relationships
Section titled “relationships”POST /api/relationships
Section titled “POST /api/relationships”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 |
DELETE /api/relationships/{id}
Section titled “DELETE /api/relationships/{id}”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 |
GET /api/{entity_type}/{short_code}/graph
Section titled “GET /api/{entity_type}/{short_code}/graph”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 |
GET /api/{entity_type}/{short_code}/links
Section titled “GET /api/{entity_type}/{short_code}/links”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 |
GET /api/{entity_type}/{short_code}/owner
Section titled “GET /api/{entity_type}/{short_code}/owner”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 |
GET /api/{entity_type}/{short_code}/teams
Section titled “GET /api/{entity_type}/{short_code}/teams”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 |
metadata
Section titled “metadata”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 |
history
Section titled “history”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 |
cascade
Section titled “cascade”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 |
restore
Section titled “restore”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 |
search
Section titled “search”GET /api/items/{short_code}/proposals
Section titled “GET /api/items/{short_code}/proposals”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 |
GET /api/items/{short_code}/related
Section titled “GET /api/items/{short_code}/related”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 |
POST /api/proposals/{id}/confirm
Section titled “POST /api/proposals/{id}/confirm”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 |
POST /api/proposals/{id}/reject
Section titled “POST /api/proposals/{id}/reject”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 |
POST /api/search
Section titled “POST /api/search”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) |