GET /{o}/{p}/import-sourcesList import sources
List registered cross-source drift import sources for this project.
Auth: Bearer token required · Permission:
data:read
Path parameters
| Name | Type | Description |
|---|---|---|
o | string | |
p | string |
Responses
| Status | Description | Schema |
|---|---|---|
200 | OK | ImportSourceList |
401 | Unauthorized | Error |
403 | Forbidden | Error |
POST /{o}/{p}/import-sourcesRegister (or refresh) an import source
Idempotent registration keyed on (project, uri). Returns 201 for a new source, 200 when refreshing an existing one. On a refresh, an omitted name/labels keeps the value already on file — only an explicit labels: null clears the label map — so a routine re-import that never sends labels cannot silently erase a one-time label set.
Auth: Bearer token required · Permission:
import-sources:write
Path parameters
| Name | Type | Description |
|---|---|---|
o | string | |
p | string |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
name | string | Addressable source name, unique per project. Defaults to the URI on first registration; omit on a refresh to keep the name already on file. |
labels | object | null | R6 default labels stamped onto entities ingested from this source. Omit to leave the current labels untouched on a refresh (first registration defaults to none); pass null to explicitly clear them. |
sourceKind | tf-state | atmos-manifests | (required) |
sourceUri | string | Canonical source URI (any accepted spelling; normalized on the way in) (required) |
reconciliationPolicy | auto-update | human-approval |
Responses
| Status | Description | Schema |
|---|---|---|
200 | OK | ImportSource |
201 | Created | ImportSource |
401 | Unauthorized | Error |
403 | Forbidden | Error |
GET /{o}/{p}/import-sources/{id}/driftGet drift summary for an import source
Per-entity drift status and pending proposals for the entities synced from this source.
Auth: Bearer token required · Permission:
data:read
Path parameters
| Name | Type | Description |
|---|---|---|
o | string | |
p | string | |
id | string |
Responses
| Status | Description | Schema |
|---|---|---|
200 | OK | ImportSourceDrift |
401 | Unauthorized | Error |
403 | Forbidden | Error |
404 | Not Found | Error |
GET /{o}/{p}/import-sources/{id}Get an import source by id
Auth: Bearer token required · Permission:
data:read
Path parameters
| Name | Type | Description |
|---|---|---|
o | string | |
p | string | |
id | string |
Responses
| Status | Description | Schema |
|---|---|---|
200 | OK | ImportSource |
401 | Unauthorized | Error |
403 | Forbidden | Error |
404 | Not Found | Error |
DELETE /{o}/{p}/import-sources/{id}Delete an import source and everything imported from it
Destroys the source and every entity whose identity partitions by it, and — through those entities — every relationship and cell membership that references one, via ON DELETE CASCADE. Re-import recreates them. A relationship whose OTHER endpoint lives in a still-live source is destroyed too: an edge cascades off either endpoint, not only the one on the deleted source. apply:write, because destroying a source destroys its data.
Auth: Bearer token required · Permission:
apply:write
Path parameters
| Name | Type | Description |
|---|---|---|
o | string | |
p | string | |
id | string |
Responses
| Status | Description | Schema |
|---|---|---|
200 | OK | DeletedById |
401 | Unauthorized | Error |
403 | Forbidden | Error |
404 | Not Found | Error |
POST /{o}/{p}/import-sources/{id}/rescanRescan an import source
Reconcile the source's declarations against the catalog. Auto-update applies directly; human-approval creates drift proposals for existing entities.
Auth: Bearer token required · Permission:
import-sources:write
Path parameters
| Name | Type | Description |
|---|---|---|
o | string | |
p | string | |
id | string |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
items | object | object | object | object | object | object | object | object | object[] | (required) |
deletions | object[] |
Responses
| Status | Description | Schema |
|---|---|---|
200 | OK | ImportSourceRescanResult |
401 | Unauthorized | Error |
403 | Forbidden | Error |
404 | Not Found | Error |
POST /{o}/{p}/import-sources/{id}/drift-proposals/{proposalId}/approveApprove a drift proposal
Apply the proposed changes to the target entity and mark the proposal approved.
Auth: Bearer token required · Permission:
import-sources:write
Path parameters
| Name | Type | Description |
|---|---|---|
o | string | |
p | string | |
id | string | |
proposalId | string |
Responses
| Status | Description | Schema |
|---|---|---|
200 | OK | DriftProposal |
401 | Unauthorized | Error |
403 | Forbidden | Error |
404 | Not Found | Error |
409 | Conflict | Error |
POST /{o}/{p}/import-sources/{id}/drift-proposals/{proposalId}/rejectReject a drift proposal
Mark the proposal rejected without changing the target entity.
Auth: Bearer token required · Permission:
import-sources:write
Path parameters
| Name | Type | Description |
|---|---|---|
o | string | |
p | string | |
id | string | |
proposalId | string |
Responses
| Status | Description | Schema |
|---|---|---|
200 | OK | DriftProposal |
401 | Unauthorized | Error |
403 | Forbidden | Error |
404 | Not Found | Error |
409 | Conflict | Error |
CellSelector| Field | Type | Description |
|---|---|---|
match | CellSelectorTerm[] | (required) |
CellSelectorEqualsTerm| Field | Type | Description |
|---|---|---|
property | string | (required) |
equals | string | (required) |
CellSelectorInTerm| Field | Type | Description |
|---|---|---|
property | string | (required) |
in | string[] | (required) |
CellSelectorTermDeletedById| Field | Type | Description |
|---|---|---|
deleted | true | (required) |
id | string | (required) |
DriftProposal| Field | Type | Description |
|---|---|---|
id | string(uuid) | (required) |
importSourceId | string(uuid) | (required) |
projectId | string | null | (required) |
entityId | string(uuid) | (required) |
proposedChanges | object | |
status | string | (required) |
createdAt | string | string | (required) |
decidedAt | string | string | null | (required) |
decidedBy | string | null | (required) |
DriftProposalWithEntity| Field | Type | Description |
|---|---|---|
id | string(uuid) | (required) |
importSourceId | string(uuid) | (required) |
projectId | string | null | (required) |
entityId | string(uuid) | (required) |
proposedChanges | object | |
status | string | (required) |
createdAt | string | string | (required) |
decidedAt | string | string | null | (required) |
decidedBy | string | null | (required) |
entityName | string | null | (required) |
Error| Field | Type | Description |
|---|---|---|
error | string | (required) |
code | string |
ImportSource| Field | Type | Description |
|---|---|---|
id | string(uuid) | (required) |
projectId | string | null | (required) |
name | string | (required) |
labels | object | null | (required) |
sourceKind | tf-state | atmos-manifests | (required) |
sourceUri | string | (required) |
reconciliationPolicy | auto-update | human-approval | (required) |
lastScannedAt | string | string | null | (required) |
lastScanStatus | string | null | (required) |
lastScanSummary | object | null | |
createdAt | string | string | (required) |
updatedAt | string | string | (required) |
ImportSourceDrift| Field | Type | Description |
|---|---|---|
source | ImportSource | (required) |
totals | object | (required) |
entities | object[] | (required) |
pendingProposals | DriftProposalWithEntity[] | (required) |
ImportSourceListType: ImportSource[]
ImportSourceRescanResult| Field | Type | Description |
|---|---|---|
scan | object | (required) |
lastScannedAt | string | (required) |
lastScanStatus | string | (required) |
ModuleSourceRule| Field | Type | Description |
|---|---|---|
unit | module | (required) |
address | string | (required) |
mergeAcrossSources | true | Declares that this rule's identity is deliberately the same across sources, so the same object in two sources is ONE entity. Required when the identity reads no {{ match.* }} capture, because such an identity cannot vary by source. |
match | string | (required) |
identity | string | (required) |
part | string | |
properties | object | |
state | string |
ResourceSourceRule| Field | Type | Description |
|---|---|---|
unit | resource | (required) |
type | string | (required) |
mergeAcrossSources | true | Declares that this rule's identity is deliberately the same across sources, so the same object in two sources is ONE entity. Required when the identity reads no {{ match.* }} capture, because such an identity cannot vary by source. |
match | string | (required) |
identity | string | (required) |
part | string | |
properties | object | |
state | string |
StackSourceRule| Field | Type | Description |
|---|---|---|
unit | stack | (required) |
match | string | (required) |
identity | string | (required) |
part | string | |
properties | object | |
state | string |