curl --request POST \
--url https://oleander.dev/api/v1/lineage \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"eventTime": "2023-11-07T05:31:56Z",
"producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
"schemaURL": "https://openlineage.io/spec/0-0-1/OpenLineage.json",
"run": {
"runId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"facets": {}
},
"job": {
"namespace": "my-scheduler-namespace",
"name": "myjob.mytask",
"facets": {}
},
"eventType": "START|RUNNING|COMPLETE|ABORT|FAIL|OTHER",
"inputs": [
{
"namespace": "my-datasource-namespace",
"name": "instance.schema.table",
"facets": {},
"inputFacets": {}
}
],
"outputs": [
{
"namespace": "my-datasource-namespace",
"name": "instance.schema.table",
"facets": {},
"outputFacets": {}
}
]
}
'import requests
url = "https://oleander.dev/api/v1/lineage"
payload = {
"eventTime": "2023-11-07T05:31:56Z",
"producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
"schemaURL": "https://openlineage.io/spec/0-0-1/OpenLineage.json",
"run": {
"runId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"facets": {}
},
"job": {
"namespace": "my-scheduler-namespace",
"name": "myjob.mytask",
"facets": {}
},
"eventType": "START|RUNNING|COMPLETE|ABORT|FAIL|OTHER",
"inputs": [
{
"namespace": "my-datasource-namespace",
"name": "instance.schema.table",
"facets": {},
"inputFacets": {}
}
],
"outputs": [
{
"namespace": "my-datasource-namespace",
"name": "instance.schema.table",
"facets": {},
"outputFacets": {}
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
eventTime: '2023-11-07T05:31:56Z',
producer: 'https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client',
schemaURL: 'https://openlineage.io/spec/0-0-1/OpenLineage.json',
run: {runId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', facets: {}},
job: {namespace: 'my-scheduler-namespace', name: 'myjob.mytask', facets: {}},
eventType: 'START|RUNNING|COMPLETE|ABORT|FAIL|OTHER',
inputs: [
{
namespace: 'my-datasource-namespace',
name: 'instance.schema.table',
facets: {},
inputFacets: {}
}
],
outputs: [
{
namespace: 'my-datasource-namespace',
name: 'instance.schema.table',
facets: {},
outputFacets: {}
}
]
})
};
fetch('https://oleander.dev/api/v1/lineage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://oleander.dev/api/v1/lineage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'eventTime' => '2023-11-07T05:31:56Z',
'producer' => 'https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client',
'schemaURL' => 'https://openlineage.io/spec/0-0-1/OpenLineage.json',
'run' => [
'runId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'facets' => [
]
],
'job' => [
'namespace' => 'my-scheduler-namespace',
'name' => 'myjob.mytask',
'facets' => [
]
],
'eventType' => 'START|RUNNING|COMPLETE|ABORT|FAIL|OTHER',
'inputs' => [
[
'namespace' => 'my-datasource-namespace',
'name' => 'instance.schema.table',
'facets' => [
],
'inputFacets' => [
]
]
],
'outputs' => [
[
'namespace' => 'my-datasource-namespace',
'name' => 'instance.schema.table',
'facets' => [
],
'outputFacets' => [
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://oleander.dev/api/v1/lineage"
payload := strings.NewReader("{\n \"eventTime\": \"2023-11-07T05:31:56Z\",\n \"producer\": \"https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client\",\n \"schemaURL\": \"https://openlineage.io/spec/0-0-1/OpenLineage.json\",\n \"run\": {\n \"runId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"facets\": {}\n },\n \"job\": {\n \"namespace\": \"my-scheduler-namespace\",\n \"name\": \"myjob.mytask\",\n \"facets\": {}\n },\n \"eventType\": \"START|RUNNING|COMPLETE|ABORT|FAIL|OTHER\",\n \"inputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"inputFacets\": {}\n }\n ],\n \"outputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"outputFacets\": {}\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://oleander.dev/api/v1/lineage")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"eventTime\": \"2023-11-07T05:31:56Z\",\n \"producer\": \"https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client\",\n \"schemaURL\": \"https://openlineage.io/spec/0-0-1/OpenLineage.json\",\n \"run\": {\n \"runId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"facets\": {}\n },\n \"job\": {\n \"namespace\": \"my-scheduler-namespace\",\n \"name\": \"myjob.mytask\",\n \"facets\": {}\n },\n \"eventType\": \"START|RUNNING|COMPLETE|ABORT|FAIL|OTHER\",\n \"inputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"inputFacets\": {}\n }\n ],\n \"outputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"outputFacets\": {}\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://oleander.dev/api/v1/lineage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"eventTime\": \"2023-11-07T05:31:56Z\",\n \"producer\": \"https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client\",\n \"schemaURL\": \"https://openlineage.io/spec/0-0-1/OpenLineage.json\",\n \"run\": {\n \"runId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"facets\": {}\n },\n \"job\": {\n \"namespace\": \"my-scheduler-namespace\",\n \"name\": \"myjob.mytask\",\n \"facets\": {}\n },\n \"eventType\": \"START|RUNNING|COMPLETE|ABORT|FAIL|OTHER\",\n \"inputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"inputFacets\": {}\n }\n ],\n \"outputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"outputFacets\": {}\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": 200
}{
"error": "Unauthorized"
}{
"status": 500
}Record event
Submit an OpenLineage compliant event to record lineage metadata. This is the primary endpoint for ingesting lineage data from your pipelines and integrations.
curl --request POST \
--url https://oleander.dev/api/v1/lineage \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"eventTime": "2023-11-07T05:31:56Z",
"producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
"schemaURL": "https://openlineage.io/spec/0-0-1/OpenLineage.json",
"run": {
"runId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"facets": {}
},
"job": {
"namespace": "my-scheduler-namespace",
"name": "myjob.mytask",
"facets": {}
},
"eventType": "START|RUNNING|COMPLETE|ABORT|FAIL|OTHER",
"inputs": [
{
"namespace": "my-datasource-namespace",
"name": "instance.schema.table",
"facets": {},
"inputFacets": {}
}
],
"outputs": [
{
"namespace": "my-datasource-namespace",
"name": "instance.schema.table",
"facets": {},
"outputFacets": {}
}
]
}
'import requests
url = "https://oleander.dev/api/v1/lineage"
payload = {
"eventTime": "2023-11-07T05:31:56Z",
"producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
"schemaURL": "https://openlineage.io/spec/0-0-1/OpenLineage.json",
"run": {
"runId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"facets": {}
},
"job": {
"namespace": "my-scheduler-namespace",
"name": "myjob.mytask",
"facets": {}
},
"eventType": "START|RUNNING|COMPLETE|ABORT|FAIL|OTHER",
"inputs": [
{
"namespace": "my-datasource-namespace",
"name": "instance.schema.table",
"facets": {},
"inputFacets": {}
}
],
"outputs": [
{
"namespace": "my-datasource-namespace",
"name": "instance.schema.table",
"facets": {},
"outputFacets": {}
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
eventTime: '2023-11-07T05:31:56Z',
producer: 'https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client',
schemaURL: 'https://openlineage.io/spec/0-0-1/OpenLineage.json',
run: {runId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', facets: {}},
job: {namespace: 'my-scheduler-namespace', name: 'myjob.mytask', facets: {}},
eventType: 'START|RUNNING|COMPLETE|ABORT|FAIL|OTHER',
inputs: [
{
namespace: 'my-datasource-namespace',
name: 'instance.schema.table',
facets: {},
inputFacets: {}
}
],
outputs: [
{
namespace: 'my-datasource-namespace',
name: 'instance.schema.table',
facets: {},
outputFacets: {}
}
]
})
};
fetch('https://oleander.dev/api/v1/lineage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://oleander.dev/api/v1/lineage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'eventTime' => '2023-11-07T05:31:56Z',
'producer' => 'https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client',
'schemaURL' => 'https://openlineage.io/spec/0-0-1/OpenLineage.json',
'run' => [
'runId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'facets' => [
]
],
'job' => [
'namespace' => 'my-scheduler-namespace',
'name' => 'myjob.mytask',
'facets' => [
]
],
'eventType' => 'START|RUNNING|COMPLETE|ABORT|FAIL|OTHER',
'inputs' => [
[
'namespace' => 'my-datasource-namespace',
'name' => 'instance.schema.table',
'facets' => [
],
'inputFacets' => [
]
]
],
'outputs' => [
[
'namespace' => 'my-datasource-namespace',
'name' => 'instance.schema.table',
'facets' => [
],
'outputFacets' => [
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://oleander.dev/api/v1/lineage"
payload := strings.NewReader("{\n \"eventTime\": \"2023-11-07T05:31:56Z\",\n \"producer\": \"https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client\",\n \"schemaURL\": \"https://openlineage.io/spec/0-0-1/OpenLineage.json\",\n \"run\": {\n \"runId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"facets\": {}\n },\n \"job\": {\n \"namespace\": \"my-scheduler-namespace\",\n \"name\": \"myjob.mytask\",\n \"facets\": {}\n },\n \"eventType\": \"START|RUNNING|COMPLETE|ABORT|FAIL|OTHER\",\n \"inputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"inputFacets\": {}\n }\n ],\n \"outputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"outputFacets\": {}\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://oleander.dev/api/v1/lineage")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"eventTime\": \"2023-11-07T05:31:56Z\",\n \"producer\": \"https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client\",\n \"schemaURL\": \"https://openlineage.io/spec/0-0-1/OpenLineage.json\",\n \"run\": {\n \"runId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"facets\": {}\n },\n \"job\": {\n \"namespace\": \"my-scheduler-namespace\",\n \"name\": \"myjob.mytask\",\n \"facets\": {}\n },\n \"eventType\": \"START|RUNNING|COMPLETE|ABORT|FAIL|OTHER\",\n \"inputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"inputFacets\": {}\n }\n ],\n \"outputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"outputFacets\": {}\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://oleander.dev/api/v1/lineage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"eventTime\": \"2023-11-07T05:31:56Z\",\n \"producer\": \"https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client\",\n \"schemaURL\": \"https://openlineage.io/spec/0-0-1/OpenLineage.json\",\n \"run\": {\n \"runId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"facets\": {}\n },\n \"job\": {\n \"namespace\": \"my-scheduler-namespace\",\n \"name\": \"myjob.mytask\",\n \"facets\": {}\n },\n \"eventType\": \"START|RUNNING|COMPLETE|ABORT|FAIL|OTHER\",\n \"inputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"inputFacets\": {}\n }\n ],\n \"outputs\": [\n {\n \"namespace\": \"my-datasource-namespace\",\n \"name\": \"instance.schema.table\",\n \"facets\": {},\n \"outputFacets\": {}\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": 200
}{
"error": "Unauthorized"
}{
"status": 500
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
This is an OpenLineage compliant payload
A RunEvent is an event that describes the lifecycle of a run.
the time the event occurred at
URI identifying the producer of this metadata. For example this could be a git url with a given tag or sha
"https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client"
The JSON Pointer (https://tools.ietf.org/html/rfc6901) URL to the corresponding version of the schema definition for this RunEvent
"https://openlineage.io/spec/0-0-1/OpenLineage.json"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
the current transition of the run state. It is required to issue 1 START event and 1 of [ COMPLETE, ABORT, FAIL ] event per run. Additional events with OTHER eventType can be added to the same run. For example to send additional metadata after the run is complete
START, RUNNING, COMPLETE, ABORT, FAIL, OTHER "START|RUNNING|COMPLETE|ABORT|FAIL|OTHER"
The set of input datasets.
Show child attributes
Show child attributes
The set of output datasets.
Show child attributes
Show child attributes
Response
Success response
Was this page helpful?