POST a dbt manifest as a partial or complete declared-lineage acquisition.
POST /v1/lineage/dbt/manifestSend Authorization: Bearer <token>. The token needs write scope and the caller needs the editor workspace role or higher. See authentication.
Send Idempotency-Key or source_event_key, each 1 to 500 characters. If both are present, they must match. complete acquisitions require a caller-supplied key and a stable project_id; use a new key for every acquisition and reuse it only to retry identical content. Conflicting content returns 409 lineage_idempotency_conflict.
| Field | Type | Required | Description |
|---|---|---|---|
workspace_id | string | Yes | Target workspace. |
connector_id | string | Yes | Connector scope for relation resolution. |
manifest | object | Yes | Parsed dbt target/manifest.json. |
project_id | string | For complete | Stable linked dbt project ID. If supplied, it must exist in the workspace. |
completeness | partial or complete | No | Defaults to partial. complete can retract evidence absent from the exact project/connector snapshot. |
source_event_key | string, 1–500 characters | No | Body alternative to Idempotency-Key. |
{
"workspace_id": "workspace-1",
"connector_id": "connector-1",
"project_id": "8b65a5a6-2087-49b6-a264-a24d1f2c15d0",
"completeness": "complete",
"source_event_key": "dbt-build-842",
"manifest": {
"metadata": {
"project_id": "8b65a5a6-2087-49b6-a264-a24d1f2c15d0",
"generated_at": "2026-08-05T18:42:12Z",
"adapter_type": "snowflake"
},
"sources": {
"source.shop.orders": {
"resource_type": "source",
"database": "RAW",
"schema": "PUBLIC",
"alias": "ORDERS"
}
},
"nodes": {
"model.shop.orders": {
"resource_type": "model",
"database": "ANALYTICS",
"schema": "PUBLIC",
"alias": "ORDERS",
"original_file_path": "models/orders.sql",
"compiled_code": "select * from RAW.PUBLIC.ORDERS",
"depends_on": {
"nodes": ["source.shop.orders"]
}
}
}
}
}curl --request POST https://api.embrasure.ai/v1/lineage/dbt/manifest \
--header "Authorization: Bearer $EMBRASURE_API_TOKEN" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: dbt-build-842" \
--data-binary @embrasure-dbt-manifest.json202 response{
"ok": true,
"delivery_id": "c5ecf66d-1ca4-4e86-ae60-51c9108490cf",
"status": "accepted",
"accepted": true,
"duplicate": false,
"item_count": 1,
"invalid_item_count": 0,
"dispatch_requested": true,
"models": 1,
"nodes": 2,
"dependencies": 1,
"column_maps": 1,
"observations": 1,
"completeness": "complete",
"scope_key": "connector:connector-1:dbt-project:8b65a5a6-2087-49b6-a264-a24d1f2c15d0"
}The receipt confirms durable acceptance. dispatch_requested only reports whether immediate background dispatch succeeded; the durable retry path remains authoritative.
All failures use the shared error envelope.
| Status | Codes | When |
|---|---|---|
401 | unauthorized | Missing or invalid bearer token. |
403 | insufficient_scope, insufficient_workspace_role, workspace_token_mismatch | Token or caller cannot write to the workspace. |
404 | not_found | project_id does not identify a linked dbt project in the workspace. |
409 | lineage_idempotency_conflict, lineage_provider_scope_conflict | Keys conflict, content changed for a reused key, or provider scope cannot be bound. |
422 | validation_error, lineage_snapshot_invalid | Request fields are invalid, or a complete snapshot lacks exact scope/key or is not lossless. |
See pipelines and applications for the recommended jq wrapper and CI workflow.