API reference
21 operations in config-items. Raw spec: openapi.json.
GET
/api/v1/config-itemsGET /api/config-items — active items only (merged tombstones excluded).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
client_id | query | — | No | |
layout_id | query | — | No | |
semantic_class | query | — | No | CI6 semantic class filter (workstation | server | vm | network_appliance | printer | iot). |
q | query | — | No |
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
POST
/api/v1/config-items/feed-upsertPOST /api/config-items/feed-upsert — CI2: the single feeder write path (lane 8's seam). Never blind-inserts: existing (source_system, external_id) links resolve to their own item; identity keys resolve the deterministic case; ambiguity queues reviewable candidates and only auto-merges at/above the org threshold.
Request body
FeedUpsertRequest
Responses
| Status | Description |
|---|---|
200 | |
409 | idempotency key reused |
422 | source system / external id validation |
Security: bearer
DELETE
/api/v1/config-items/interfaces/{id}DELETE /api/config-items/interfaces/{id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
GET
/api/v1/config-items/merge-candidatesGET /api/config-items/merge-candidates — the review queue.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
status | query | — | No | pending | auto_merged | accepted | rejected |
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
POST
/api/v1/config-items/merge-candidates/batchPOST /api/config-items/merge-candidates/batch — accept/reject/defer N candidates in ONE call. Every ACCEPT is an audited, individually undoable merge (per-candidate split substrate); a failed member never aborts the batch (per-item outcome, never a silent partial).
Request body
BatchCandidateRequest
Responses
| Status | Description |
|---|---|
200 | |
422 | unknown batch action / empty id list |
Security: bearer
POST
/api/v1/config-items/merge-candidates/{id}/acceptPOST /api/config-items/merge-candidates/{id}/accept — fold the candidate into the primary with the candidate's evidence attached.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | candidate not visible in scope |
409 | candidate already decided |
Security: bearer
POST
/api/v1/config-items/merge-candidates/{id}/deferPOST /api/config-items/merge-candidates/{id}/defer — park the candidate out of the pending queue WITHOUT deciding it (reversible via restore; a feed upsert refreshes evidence but never un-defers silently).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | candidate not visible in scope |
409 | candidate already decided |
Security: bearer
POST
/api/v1/config-items/merge-candidates/{id}/rejectPOST /api/config-items/merge-candidates/{id}/reject — keep both items.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | candidate not visible in scope |
409 | candidate already decided |
Security: bearer
POST
/api/v1/config-items/merge-candidates/{id}/restorePOST /api/config-items/merge-candidates/{id}/restore — un-defer: a parked candidate returns to the pending queue.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | candidate not visible in scope |
409 | candidate is not deferred |
Security: bearer
GET
/api/v1/config-items/merge-candidates/{id}/workbenchGET /api/config-items/merge-candidates/{id}/workbench — the guided merge workbench's read model: side-by-side cards across ALL ConfigSourceLinks, the field-by-field picker rows, the inline deterministic + decision evidence, and the threshold context.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | candidate not visible in scope |
Security: bearer
POST
/api/v1/config-items/merges/{id}/splitPOST /api/config-items/merges/{id}/split — undo a merge (IF7): links, interfaces, and field tiers ride back from the audit row's packet.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | merge not visible in scope |
409 | merge already undone |
Security: bearer
GET
/api/v1/config-items/precedenceGET /api/config-items/precedence — org overrides (shipped ADR defaults resolve in Rust when no row matches).
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
PUT
/api/v1/config-items/precedencePUT /api/config-items/precedence — a per-type/per-source precedence override (CI5). Upserts by (layout, field, source).
Request body
UpsertPrecedenceRequest
Responses
| Status | Description |
|---|---|
200 | |
422 | unknown semantic class |
Security: bearer
GET
/api/v1/config-items/settingsGET /api/config-items/settings — the org's auto-merge threshold.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
PUT
/api/v1/config-items/settingsPUT /api/config-items/settings — the org's auto-merge confidence threshold (CI4).
Request body
UpdateSettingsRequest
Responses
| Status | Description |
|---|---|
200 | |
422 | threshold out of range |
Security: bearer
GET
/api/v1/config-items/{id}GET /api/config-items/{id} — the CI with its source links + interfaces.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | config item not visible in scope |
Security: bearer
PATCH
/api/v1/config-items/{id}PATCH /api/config-items/{id} — human curation (CI5): curated values are sticky forever; feeds never auto-overwrite them afterwards.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
CurateFieldsRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | config item not visible in scope |
409 | version conflict or idempotency key reused |
Security: bearer
POST
/api/v1/config-items/{id}/accept-observedPOST /api/config-items/{id}/accept-observed — CI5 one-click "accept the new value": promotes the observed value into the sticky curated tier.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
AcceptObservedRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | config item not visible in scope |
409 | no observed value for that field / version conflict |
Security: bearer
POST
/api/v1/config-items/{id}/interfacesPOST /api/config-items/{id}/interfaces — record a NIC (ADR 0003 lifecycle rule: NICs are attributes, not their own CIs).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
CreateInterfaceRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | config item not visible in scope |
Security: bearer
POST
/api/v1/config-items/{id}/mergePOST /api/config-items/{id}/merge — an explicit human merge (the queue's accept path rides this too). Audited + undoable (split).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
CiMergeRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | config item not visible in scope |
409 | cannot merge an item into itself / already merged |
Security: bearer
GET
/api/v1/config-items/{id}/mergesGET /api/config-items/{id}/merges — the item's merge audit trail.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 |
Security: bearer