curl --request POST \
--url https://developer.synq.io/api/lineage/folds/v1alpha/{id}/matcher \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"matcher": {
"idPattern": {
"pattern": "<string>"
}
},
"etag": "<string>",
"actor": {
"name": "<string>",
"email": {
"userEmail": "jsmith@example.com"
}
}
}
'import requests
url = "https://developer.synq.io/api/lineage/folds/v1alpha/{id}/matcher"
payload = {
"matcher": { "idPattern": { "pattern": "<string>" } },
"etag": "<string>",
"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>'}},
etag: '<string>',
actor: {name: '<string>', email: {userEmail: 'jsmith@example.com'}}
})
};
fetch('https://developer.synq.io/api/lineage/folds/v1alpha/{id}/matcher', 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/{id}/matcher",
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>'
]
],
'etag' => '<string>',
'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/{id}/matcher"
payload := strings.NewReader("{\n \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"etag\": \"<string>\",\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/{id}/matcher")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"etag\": \"<string>\",\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/{id}/matcher")
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 \"etag\": \"<string>\",\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"
}
}
}UpdateFoldMatcher
Change which entities a fold matches. The fold’s node keeps its entity id.
curl --request POST \
--url https://developer.synq.io/api/lineage/folds/v1alpha/{id}/matcher \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"matcher": {
"idPattern": {
"pattern": "<string>"
}
},
"etag": "<string>",
"actor": {
"name": "<string>",
"email": {
"userEmail": "jsmith@example.com"
}
}
}
'import requests
url = "https://developer.synq.io/api/lineage/folds/v1alpha/{id}/matcher"
payload = {
"matcher": { "idPattern": { "pattern": "<string>" } },
"etag": "<string>",
"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>'}},
etag: '<string>',
actor: {name: '<string>', email: {userEmail: 'jsmith@example.com'}}
})
};
fetch('https://developer.synq.io/api/lineage/folds/v1alpha/{id}/matcher', 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/{id}/matcher",
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>'
]
],
'etag' => '<string>',
'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/{id}/matcher"
payload := strings.NewReader("{\n \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"etag\": \"<string>\",\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/{id}/matcher")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"matcher\": {\n \"idPattern\": {\n \"pattern\": \"<string>\"\n }\n },\n \"etag\": \"<string>\",\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/{id}/matcher")
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 \"etag\": \"<string>\",\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.
Path Parameters
Body
FoldMatcher selects the entities a fold shows as its node.
Show child attributes
Show child attributes
When set, the change is refused with ABORTED if the fold changed since this etag was read.
200Actor identifies who performed a write — set by the calling client and carried end-to-end through the public API into stored audit trails (issue status changes, comments, incident assignments) and rendered downstream (e.g. Slack/MSTeams/email alerts).
Producers should populate:
name— human-readable display label, derived fromsynq.auth.iam.v1.IamResponse.user_namewhen available, falling back touser_email. Avoid generic placeholders ("MCP", "API"); readers treat those as "no identity resolved" and fall back to impersonal copy.user— the strongest identifier the caller can prove. For human callers, setemailfromIamResponse.user_emailso the server can resolve the caller back to a workspace user.via— entry-point label for the channel through which the request arrived (e.g. VIA_MCP for the MCP server), regardless of who the caller is.
- 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