Send OpenLineage events, import artifacts, or submit lineage through MCP.
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.
A workspace-scoped API 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 a workspace-scoped token. Without connector_id, dataset identity resolves through the provider's namespace binding rules.
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.
Send Idempotency-Key on retries. Reusing a key with different bytes returns a conflict. Without a key, byte-identical deliveries deduplicate by payload digest.
submit_lineage uses the same delivery contract as HTTP:
{
"workspace_id": "workspace-id",
"connector_id": "connector-id",
"provider_key": "application:risk-api",
"events": [{"eventType": "COMPLETE"}],
"idempotency_key": "risk-api-run-0190"
}events accepts 1 to 1,000 OpenLineage objects. The result contains delivery_id, state, duplicate, item_count, and invalid_item_count. The tool requires write scope and is idempotent but not read-only.
| Source | Route | Primary payload |
|---|---|---|
| dbt | POST /v1/pipelines/dbt/manifest | manifest |
| SQLMesh project export | POST /v1/pipelines/sqlmesh/project | project |
| DataHub | POST /v1/pipelines/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.