Ingest a dbt manifest

POST a dbt manifest as a partial or complete declared-lineage acquisition.

POST /v1/lineage/dbt/manifest

Authentication and idempotency

Send 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.

Request body

FieldTypeRequiredDescription
workspace_idstringYesTarget workspace.
connector_idstringYesConnector scope for relation resolution.
manifestobjectYesParsed dbt target/manifest.json.
project_idstringFor completeStable linked dbt project ID. If supplied, it must exist in the workspace.
completenesspartial or completeNoDefaults to partial. complete can retract evidence absent from the exact project/connector snapshot.
source_event_keystring, 1–500 charactersNoBody alternative to Idempotency-Key.

Complete request example

{
  "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.json

202 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.

Errors

All failures use the shared error envelope.

StatusCodesWhen
401unauthorizedMissing or invalid bearer token.
403insufficient_scope, insufficient_workspace_role, workspace_token_mismatchToken or caller cannot write to the workspace.
404not_foundproject_id does not identify a linked dbt project in the workspace.
409lineage_idempotency_conflict, lineage_provider_scope_conflictKeys conflict, content changed for a reused key, or provider scope cannot be bound.
422validation_error, lineage_snapshot_invalidRequest 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.