Receive OpenLineage event Receive OpenLineage event (standard endpoint)
The Standard OpenLineage HTTP Transport endpoint receives OpenLineage
RunEvent payloads and processes them to create or update assets and
lineage relationships. It fully conforms to the official OpenLineage
HTTP transport specification. This endpoint is idempotent—duplicate
events (with the same runId and
eventType) are safely ignored to ensure consistent
lineage state without duplication.
export OPENLINEAGE_URL=https://your-catalog-host/api/v1/lineagePOST https://[hostname]/api/v1/lineage
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
eventType |
string | Yes | Type of run event. |
eventTime |
string | Yes | Timestamp of the event in ISO 8601 format. |
producer |
string | Yes | URI identifying the producer of this event. |
schemaURL |
string | Yes | URL to the OpenLineage JSON schema used for the event. |
run |
object | Yes | Run reference containing the run identifier and associated facets. |
job |
object | Yes | Job reference containing the job namespace, name, and associated facets. |
inputs |
array[object] | No | Input datasets associated with the event (typically present on COMPLETE) |
outputs |
array[object] | No | Output datasets associated with the event (typically present on COMPLETE) |
run Properties
| Field | Type | Required | Description |
|---|---|---|---|
runId |
string | Yes | Unique identifier for this run. |
facets |
object | No |
Additional run details, such as nominal time, parent run, or error information. |
job Properties
| Field | Type | Required | Description |
|---|---|---|---|
namespace |
string | Yes | Job namespace (e.g., "dagster-prod"). |
name |
string | Yes | Job name within the namespace. |
facets |
object | No |
Additional job details, such as documentation, SQL, or ownership. |
inputs Item Properties
| Field | Type | Required | Description |
|---|---|---|---|
namespace |
string | Yes | Dataset namespace (e.g., "snowflake://account.region") |
name |
string | Yes | Dataset name (e.g., "db.schema.table") |
facets |
object | No |
Additional dataset details, such as schema, data source, or documentation. |
inputFacets |
object | No |
Additional details specific to input datasets. |
outputFacets |
object | No |
Additional details specific to output datasets. |
outputs Item Properties
| Field | Type | Required | Description |
|---|---|---|---|
namespace |
string | Yes | Dataset namespace (e.g., "snowflake://account.region") |
name |
string | Yes | Dataset name (e.g., "db.schema.table") |
facets |
object | No | Dataset facets (schema, dataSource, documentation, etc.) |
inputFacets |
object | No |
Additional details specific to input datasets. |
outputFacets |
object | No |
Additional details specific to output datasets. |
For the complete OpenLineageRunEvent schema definition, see the example below.
{
"eventType": "COMPLETE",
"eventTime": "2026-04-16T10:30:00Z",
"producer": "https://github.com/dagster-io/dagster",
"schemaURL": "https://openlineage.io/spec/1-2-0/OpenLineage.json#/definitions/RunEvent",
"run": {
"runId": "550e8400-e29b-41d4-a716-446655440000"
},
"job": {
"namespace": "dagster-prod",
"name": "etl_pipeline"
},
"inputs": [
{
"namespace": "oracle://prod-oracle:1521",
"name": "sales_db.customers"
}
],
"outputs": [
{
"namespace": "snowflake://account.snowflakecomputing.com",
"name": "analytics.staging.customers"
}
]
}
Request Examples
Each example shows how to call this endpoint with the documented method, URL, headers, and request body format.
curl -X POST "/api/v1/lineage" \
-H "Authorization: Bearer <JWT>" \
-H "Content-Type: application/json" \
-d '{
"eventType": "example",
"eventTime": "example",
"producer": "example",
"schemaURL": "example",
"run": {
"runId": "example"
},
"job": {
"namespace": "example",
"name": "example"
}
}'
fetch("/api/v1/lineage", {
method: "POST",
headers: {
"Authorization": "Bearer <JWT>",
"Content-Type": "application/json"
},
body: JSON.stringify({
"eventType": "example",
"eventTime": "example",
"producer": "example",
"schemaURL": "example",
"run": {
"runId": "example"
},
"job": {
"namespace": "example",
"name": "example"
}
})
})
.then(res => res.json())
.then(data => console.log(data));
import json
import requests
url = "/api/v1/lineage"
headers = {
"Authorization": "Bearer <JWT>",
"Content-Type": "application/json"
}
payload = json.loads('''{
"eventType": "example",
"eventTime": "example",
"producer": "example",
"schemaURL": "example",
"run": {
"runId": "example"
},
"job": {
"namespace": "example",
"name": "example"
}
}''')
response = requests.post(url, headers=headers, json=payload)
print(response.json())
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"eventType": "example",
"eventTime": "example",
"producer": "example",
"schemaURL": "example",
"run": {
"runId": "example"
},
"job": {
"namespace": "example",
"name": "example"
}
}`)
req, _ := http.NewRequest("POST", "/api/v1/lineage", body)
req.Header.Set("Authorization", "Bearer <JWT>")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body2, _ := io.ReadAll(resp.Body)
fmt.Println(string(body2))
}
Success Responses
Indicates that the event was accepted. The response provides identifiers for the event and run, the event type, acceptance status, a summary of assets and relationships, and the timestamp of the event.
{
"eventId": "evt-123e4567-e89b-12d3-a456-426614174000",
"runId": "550e8400-e29b-41d4-a716-446655440000",
"eventType": "COMPLETE",
"status": "accepted",
"assetsResolved": {
"created": 2,
"existing": 0
},
"relationsCreated": 1,
"timestamp": "2026-04-16T10:30:05Z"
}
Minimal OpenLineage-compliant acknowledgment payload:
{
"status": "accepted"
}
Error Responses
Indicates that the request could not be accepted due to invalid input. The response provides an error code, a message describing the issue, and validation details (including the field and reason) to help identify and correct the problem.
{
"statusCode": 400,
"code": "GOV-CATALOG-SVC-OL-001",
"error": "Bad Request",
"message": "Invalid OpenLineage event: missing required field 'eventTime'",
"validationErrors": [
{
"path": "/eventTime",
"message": "Required field is missing"
}
]
}