POST a DataHub export into the shared lineage evidence and projection path.
POST /v1/lineage/datahubSend 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 stable import_source and a caller-supplied key. Use a new key for every acquisition and reuse it only for identical content.
| Field | Type | Required | Description |
|---|---|---|---|
workspace_id | string | Yes | Target workspace. |
connector_id | string | Yes | Connector scope for imported dataset identities. |
export | object or array of objects | Yes | DataHub lineage entries. An object may contain lineage or edges; an array is treated as the entries directly. |
import_source | string, 1–300 characters | For complete | Stable source label. Defaults to default for partial imports. |
completeness | partial or complete | No | Defaults to partial. Complete imports can retract evidence absent from the exact connector/source snapshot. |
source_event_key | string, 1–500 characters | No | Body alternative to Idempotency-Key. |
Each entry requires DataHub dataset upstreamUrn and downstreamUrn values. Optional fineGrainedLineages entries carry column-level mappings.
{
"workspace_id": "workspace-1",
"connector_id": "connector-1",
"import_source": "datahub-production",
"completeness": "complete",
"source_event_key": "datahub-export-2026-08-05",
"export": {
"lineage": [
{
"upstreamUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,RAW.PUBLIC.ORDERS,PROD)",
"downstreamUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,ANALYTICS.PUBLIC.ORDERS,PROD)",
"fineGrainedLineages": [
{
"upstreams": [
"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,RAW.PUBLIC.ORDERS,PROD),ORDER_ID)"
],
"downstreams": [
"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,ANALYTICS.PUBLIC.ORDERS,PROD),ORDER_ID)"
],
"transformOperation": "IDENTITY"
}
]
}
]
}
}curl --request POST https://api.embrasure.ai/v1/lineage/datahub \
--header "Authorization: Bearer $EMBRASURE_API_TOKEN" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: datahub-export-2026-08-05" \
--data-binary @datahub-lineage-request.json202 response{
"ok": true,
"delivery_id": "041bb319-b78d-4b8d-a442-0f878f34e7ee",
"status": "accepted",
"accepted": true,
"duplicate": false,
"item_count": 1,
"invalid_item_count": 0,
"dispatch_requested": true,
"edges_received": 1,
"observations": 1,
"unresolved": 0,
"completeness": "complete",
"scope_key": "connector:connector-1:datahub-source:datahub-production"
}The receipt confirms durable acceptance. unresolved counts entries whose DataHub identities could not be interpreted during import.
If the provider is paused, the route performs no import and returns:
{
"accepted": false,
"skipped": "provider_paused"
}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. |
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/export fields are invalid, or a complete snapshot lacks exact scope/key or is not lossless. |
See ingest lineage for provider scope and identity resolution.