Ingest one lineage event

POST one OpenLineage RunEvent, JobEvent, or DatasetEvent and receive a durable receipt.

POST /api/v1/lineage

Accepts one event conforming to the OpenLineage object model and the OpenLineage 2-0-2 JSON schema. Embrasure preserves the original request bytes, then validates and projects the event asynchronously.

Authentication and idempotency

Send Authorization: Bearer <token>. The token needs write scope and the caller needs the editor workspace role or higher. See authentication.

Idempotency-Key is optional and accepts 1 to 600 characters. Reuse a key only when retrying the exact same request bytes; using it with different bytes returns 409 lineage_idempotency_conflict. Without a key, Embrasure deduplicates byte-identical requests by SHA-256 digest.

Query parameters

NameTypeRequiredDescription
workspace_idstringWith session JWTs or other unscoped tokensTarget workspace. A workspace-scoped PAT can omit it; an explicit value must match the token's workspace.
connector_idstringNoConnector scope used to resolve dataset identities.
provider_keystring, 1–500 charactersNoStable producer identity. Its connector binding cannot be changed after first use.

Requests with neither a workspace_id parameter nor a workspace-scoped PAT fail with openlineage_workspace_required. The PAT needs write scope and its user needs editor or administrator access in the workspace.

Headers

NameRequiredDescription
AuthorizationYesBearer token with write scope.
Content-TypeYesapplication/json.
Idempotency-KeyNoRetry key, 1–600 characters.

The uncompressed request body must be no larger than 8 MiB. Content-Encoding values other than identity are rejected.

Request body

The body is one of the standard OpenLineage event types:

TypeRequired event-specific fieldsUse
RunEventrun, job; optional eventType, inputs, outputsRuntime job-state and data-flow observations.
JobEventjob; optional inputs, outputs; no runDesign-time job metadata and declared lineage.
DatasetEventdataset; no job or runDesign-time dataset metadata.

Every event requires eventTime (RFC 3339 timestamp), producer (URI), and schemaURL (URI). Jobs and datasets require a non-empty namespace and name. A run requires a UUID runId. eventType, when supplied, is START, RUNNING, COMPLETE, ABORT, FAIL, or OTHER. Standard and custom OpenLineage facets are accepted.

Complete RunEvent example

{
  "eventType": "COMPLETE",
  "eventTime": "2026-08-05T18:42:12Z",
  "producer": "https://github.com/acme/orders-pipeline",
  "schemaURL": "https://openlineage.io/spec/2-0-2/OpenLineage.json",
  "run": {
    "runId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
  },
  "job": {
    "namespace": "airflow-production",
    "name": "orders.refresh_orders"
  },
  "inputs": [
    {
      "namespace": "snowflake://acme.us-east-1",
      "name": "RAW.PUBLIC.ORDERS"
    }
  ],
  "outputs": [
    {
      "namespace": "snowflake://acme.us-east-1",
      "name": "ANALYTICS.PUBLIC.ORDERS"
    }
  ]
}
curl --request POST \
  --url "https://api.embrasure.ai/api/v1/lineage?workspace_id=workspace-1&connector_id=connector-1&provider_key=airflow-production" \
  --header "Authorization: Bearer $EMBRASURE_API_TOKEN" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: run-0190-complete" \
  --data-binary @openlineage-event.json

202 response

{
  "delivery_id": "c5ecf66d-1ca4-4e86-ae60-51c9108490cf",
  "state": "accepted",
  "duplicate": false,
  "item_count": 1,
  "invalid_item_count": 0
}
FieldTypeMeaning
delivery_idstringDurable delivery identifier.
stateacceptedTransport acceptance; semantic validation and graph projection are still asynchronous.
duplicatebooleanThe idempotency key or payload digest matched an existing delivery.
item_countintegerAlways 1 for this route.
invalid_item_countintegerAlways 0 in a successful single-event receipt.

Errors

All failures use the shared error envelope.

StatusCodesWhen
400openlineage_body_required, openlineage_invalid_json, openlineage_invalid_event, invalid_content_lengthMissing body, malformed JSON, duplicate JSON keys, non-object body, or invalid length header.
401unauthorizedMissing or invalid bearer token.
403insufficient_scope, insufficient_workspace_role, workspace_token_mismatchToken or caller cannot write to the workspace.
409lineage_idempotency_conflict, lineage_provider_scope_conflictA retry key has different bytes, or the provider/connector binding conflicts.
413openlineage_body_too_largeBody exceeds 8 MiB.
415openlineage_content_encoding_unsupportedRequest body is compressed.
422openlineage_workspace_required, validation_errorWorkspace cannot be inferred or a query/header constraint fails.

The 202 LineageDeliveryReceipt confirms durable acceptance, not completed graph projection. Read ingest lineage for identity-resolution behavior.