Send OpenLineage events or import complete lineage artifacts.
Use OpenLineage for runtime producers and the artifact endpoints for systems that already emit a complete project or catalog snapshot.
| Method | Path | Body |
|---|---|---|
POST | /api/v1/lineage | One OpenLineage event |
POST | /api/v1/lineage/batch | An array or { "events": [...] } |
Both routes require a bearer token with write scope and workspace editor access. Requests are limited to 8 MiB. Batches accept 1 to 1,000 events. Compressed requests are not accepted.
See OpenLineage types for the supported event union, datasets, column-lineage facet, batch envelope, delivery receipt, and per-event bounds.
A workspace-scoped personal access token can omit the workspace_id query parameter. This lets standard OpenLineage emitters that only support a base URL plus API key target Embrasure directly: set the emitter's URL to https://api.embrasure.ai (the client appends /api/v1/lineage) and its API key to the PAT. The token needs write scope, and its user needs editor or administrator access in that workspace. Without connector_id, dataset identity resolves through the provider's namespace binding rules.
Need a workspace-scoped token?
Create one under Access Embrasure → API → Personal access tokens. See Authentication for the admin prerequisite, scope selection, and secret-handling guidance.
curl --request POST \
--url "https://api.embrasure.ai/api/v1/lineage?workspace_id=$WORKSPACE_ID&connector_id=$CONNECTOR_ID" \
--header "Authorization: Bearer $EMBRASURE_API_TOKEN" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: orders-refresh-0190" \
--data-binary @openlineage-event.jsonAccepted delivery returns a durable receipt:
{
"delivery_id": "c5ecf66d-1ca4-4e86-ae60-51c9108490cf",
"state": "accepted",
"duplicate": false,
"item_count": 1,
"invalid_item_count": 0
}Processing is asynchronous. A receipt confirms durable acceptance, not completed graph projection.
Send an input-only OpenLineage event to trace an application or service that reads a table. Use a stable, per-service provider_key and include job and inputs without outputs.
curl -X POST "$EMBRASURE_API/api/v1/lineage?workspace_id=$WORKSPACE_ID&connector_id=$CONNECTOR_ID&provider_key=risk-api" \
-H "Authorization: Bearer $EMBRASURE_PAT" \
-H "Content-Type: application/json" \
-d '{"eventType":"COMPLETE","eventTime":"2026-08-04T12:00:00Z","job":{"namespace":"production","name":"risk-api"},"run":{"runId":"8a3c"},"inputs":[{"namespace":"warehouse","name":"analytics.transactions"}]}'Embrasure creates the service identity from job.namespace and job.name, then records a reads_from edge for each resolved input. The service appears downstream when you inspect a table it reads.
Query-history discovery creates the same service nodes for service accounts. BigQuery uses referenced_tables from INFORMATION_SCHEMA.JOBS_BY_PROJECT; Snowflake and Databricks use collected query observations. Human users do not create service-read edges. Reads are aggregated into one evidence window per service and table each hour.
This route accepts enabled, user-bound dpt_ personal access tokens. A token's permissions still depend on its scopes and the creating user's current workspace role.
Send Idempotency-Key on retries. Reusing a key with different bytes returns a conflict. Without a key, byte-identical deliveries deduplicate by payload digest.
| Source | Route | Primary payload |
|---|---|---|
| dbt | POST /v1/lineage/dbt/manifest | manifest |
| SQLMesh project export | POST /v1/lineage/sqlmesh/project | project |
| DataHub | POST /v1/lineage/datahub | export |
Every artifact request includes workspace_id, connector_id, completeness, and an idempotency key for complete acquisitions.
Resolution is required
An edge reaches the served graph only after both endpoints resolve inside the provider's connector scope. Unresolved evidence remains stored for later resolution.