curl --request POST \
--url https://developer.synq.io/api/lineage/folds/v1alpha \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"matcher": {
"idPattern": {
"pattern": "<string>"
}
},
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"enabled": true,
"actor": {
"name": "<string>",
"email": {
"userEmail": "jsmith@example.com"
}
}
}
'import requests
url = "https://developer.synq.io/api/lineage/folds/v1alpha"
payload = {
"matcher": { "idPattern": { "pattern": "<string>" } },
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"enabled": True,
"actor": {
"name": "<string>",
"email": { "userEmail": "jsmith@example.com" }
}
}
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({
matcher: {idPattern: {pattern: '<string>'}},
id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
name: '<string>',
enabled: true,
actor: {name: '<string>', email: {userEmail: 'jsmith@example.com'}}
})
};
fetch('https://developer.synq.io/api/lineage/folds/v1alpha', 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://developer.synq.io/api/lineage/folds/v1alpha",
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([
'matcher' => [
'idPattern' => [
'pattern' => '<string>'
]
],
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'name' => '<string>',
'enabled' => true,
'actor' => [
'name' => '<string>',
'email' => [
'userEmail' => 'jsmith@example.com'
]
]
]),
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://developer.synq.io/api/lineage/folds/v1alpha"
payload := strings.NewReader("{\n \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"enabled\": true,\n \"actor\": {\n \"name\": \"<string>\",\n \"email\": {\n \"userEmail\": \"jsmith@example.com\"\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://developer.synq.io/api/lineage/folds/v1alpha")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"enabled\": true,\n \"actor\": {\n \"name\": \"<string>\",\n \"email\": {\n \"userEmail\": \"jsmith@example.com\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://developer.synq.io/api/lineage/folds/v1alpha")
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 \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"enabled\": true,\n \"actor\": {\n \"name\": \"<string>\",\n \"email\": {\n \"userEmail\": \"jsmith@example.com\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"fold": {
"id": "<string>",
"name": "<string>",
"matcher": {
"idPattern": {
"pattern": "<string>"
}
},
"enabled": true,
"etag": "<string>",
"createdAt": "2023-01-15T01:30:15.01Z",
"updatedAt": "2023-01-15T01:30:15.01Z",
"createdBy": {
"name": "<string>",
"email": {
"userEmail": "jsmith@example.com"
},
"via": "VIA_UNSPECIFIED"
},
"updatedBy": {
"name": "<string>",
"email": {
"userEmail": "jsmith@example.com"
},
"via": "VIA_UNSPECIFIED"
}
}
}CreateFold
Create a fold. Repeating the same request returns the fold it created; creating a different fold under an id already in use is refused with ALREADY_EXISTS.
curl --request POST \
--url https://developer.synq.io/api/lineage/folds/v1alpha \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"matcher": {
"idPattern": {
"pattern": "<string>"
}
},
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"enabled": true,
"actor": {
"name": "<string>",
"email": {
"userEmail": "jsmith@example.com"
}
}
}
'import requests
url = "https://developer.synq.io/api/lineage/folds/v1alpha"
payload = {
"matcher": { "idPattern": { "pattern": "<string>" } },
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"enabled": True,
"actor": {
"name": "<string>",
"email": { "userEmail": "jsmith@example.com" }
}
}
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({
matcher: {idPattern: {pattern: '<string>'}},
id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
name: '<string>',
enabled: true,
actor: {name: '<string>', email: {userEmail: 'jsmith@example.com'}}
})
};
fetch('https://developer.synq.io/api/lineage/folds/v1alpha', 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://developer.synq.io/api/lineage/folds/v1alpha",
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([
'matcher' => [
'idPattern' => [
'pattern' => '<string>'
]
],
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'name' => '<string>',
'enabled' => true,
'actor' => [
'name' => '<string>',
'email' => [
'userEmail' => 'jsmith@example.com'
]
]
]),
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://developer.synq.io/api/lineage/folds/v1alpha"
payload := strings.NewReader("{\n \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"enabled\": true,\n \"actor\": {\n \"name\": \"<string>\",\n \"email\": {\n \"userEmail\": \"jsmith@example.com\"\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://developer.synq.io/api/lineage/folds/v1alpha")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"enabled\": true,\n \"actor\": {\n \"name\": \"<string>\",\n \"email\": {\n \"userEmail\": \"jsmith@example.com\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://developer.synq.io/api/lineage/folds/v1alpha")
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 \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"enabled\": true,\n \"actor\": {\n \"name\": \"<string>\",\n \"email\": {\n \"userEmail\": \"jsmith@example.com\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"fold": {
"id": "<string>",
"name": "<string>",
"matcher": {
"idPattern": {
"pattern": "<string>"
}
},
"enabled": true,
"etag": "<string>",
"createdAt": "2023-01-15T01:30:15.01Z",
"updatedAt": "2023-01-15T01:30:15.01Z",
"createdBy": {
"name": "<string>",
"email": {
"userEmail": "jsmith@example.com"
},
"via": "VIA_UNSPECIFIED"
},
"updatedBy": {
"name": "<string>",
"email": {
"userEmail": "jsmith@example.com"
},
"via": "VIA_UNSPECIFIED"
}
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Which entities the fold shows as its node.
Show child attributes
Show child attributes
Id of the new fold, a UUID.
Name shown on the fold's node.
1 - 200Whether lineage applies the fold from the start. Defaults to on.
Who is making the change. Optional: the identity is completed from the calling credentials. Set it to attribute the change to a person.
- Actor
- Actor
- Actor
Show child attributes
Show child attributes
Response
Success
LineageFold shows many similar entities as one node in lineage.
Some tools write to a new table or a new storage path on every run: a date
sharded table (events_20261008), a staging table per load
(tmp_load_<uuid>), an export per day (exports/orders_20261008). Each of
them is its own entity, so lineage shows one node per day or per run. A fold
matches those entities and lineage shows them as the single fold node
instead, connected to everything any of them is connected to.
Folding changes only how lineage is drawn. Every folded entity keeps its own page, checks, owners and documentation, and switching a fold off brings the original nodes back.
Show child attributes
Show child attributes