curl --request POST \
--url https://developer.synq.io/api/entities/annotations/v1/batchGet \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
{
"airflowDag": {
"integrationId": "<string>",
"dagId": "<string>"
},
"entityId": "<string>"
}
]
}
'import requests
url = "https://developer.synq.io/api/entities/annotations/v1/batchGet"
payload = { "ids": [
{
"airflowDag": {
"integrationId": "<string>",
"dagId": "<string>"
},
"entityId": "<string>"
}
] }
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({
ids: [
{
airflowDag: {integrationId: '<string>', dagId: '<string>'},
entityId: '<string>'
}
]
})
};
fetch('https://developer.synq.io/api/entities/annotations/v1/batchGet', 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/entities/annotations/v1/batchGet",
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([
'ids' => [
[
'airflowDag' => [
'integrationId' => '<string>',
'dagId' => '<string>'
],
'entityId' => '<string>'
]
]
]),
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/entities/annotations/v1/batchGet"
payload := strings.NewReader("{\n \"ids\": [\n {\n \"airflowDag\": {\n \"integrationId\": \"<string>\",\n \"dagId\": \"<string>\"\n },\n \"entityId\": \"<string>\"\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/entities/annotations/v1/batchGet")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n {\n \"airflowDag\": {\n \"integrationId\": \"<string>\",\n \"dagId\": \"<string>\"\n },\n \"entityId\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://developer.synq.io/api/entities/annotations/v1/batchGet")
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 \"ids\": [\n {\n \"airflowDag\": {\n \"integrationId\": \"<string>\",\n \"dagId\": \"<string>\"\n },\n \"entityId\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"entityAnnotations": [
{
"id": {
"airflowDag": {
"integrationId": "<string>",
"dagId": "<string>"
},
"entityId": "<string>"
},
"annotations": [
{
"name": "<string>",
"values": [
"<string>"
]
}
]
}
]
}BatchGetEntityAnnotations
Read the annotations carried by specific entities.
ListAnnotations answers what the workspace annotates by and how often;
this answers what one entity carries. They are separate reads because an
entity’s annotations are not part of the entity: synq.entities.v1.Entity
is the shape synq.entities.custom.v1.UpsertEntity accepts, so the
annotations field on it is what a producer ASSERTS about an entity, and
answering a read with it would make a read-edit-write round trip write one
entity’s annotations onto another.
curl --request POST \
--url https://developer.synq.io/api/entities/annotations/v1/batchGet \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
{
"airflowDag": {
"integrationId": "<string>",
"dagId": "<string>"
},
"entityId": "<string>"
}
]
}
'import requests
url = "https://developer.synq.io/api/entities/annotations/v1/batchGet"
payload = { "ids": [
{
"airflowDag": {
"integrationId": "<string>",
"dagId": "<string>"
},
"entityId": "<string>"
}
] }
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({
ids: [
{
airflowDag: {integrationId: '<string>', dagId: '<string>'},
entityId: '<string>'
}
]
})
};
fetch('https://developer.synq.io/api/entities/annotations/v1/batchGet', 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/entities/annotations/v1/batchGet",
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([
'ids' => [
[
'airflowDag' => [
'integrationId' => '<string>',
'dagId' => '<string>'
],
'entityId' => '<string>'
]
]
]),
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/entities/annotations/v1/batchGet"
payload := strings.NewReader("{\n \"ids\": [\n {\n \"airflowDag\": {\n \"integrationId\": \"<string>\",\n \"dagId\": \"<string>\"\n },\n \"entityId\": \"<string>\"\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/entities/annotations/v1/batchGet")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n {\n \"airflowDag\": {\n \"integrationId\": \"<string>\",\n \"dagId\": \"<string>\"\n },\n \"entityId\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://developer.synq.io/api/entities/annotations/v1/batchGet")
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 \"ids\": [\n {\n \"airflowDag\": {\n \"integrationId\": \"<string>\",\n \"dagId\": \"<string>\"\n },\n \"entityId\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"entityAnnotations": [
{
"id": {
"airflowDag": {
"integrationId": "<string>",
"dagId": "<string>"
},
"entityId": "<string>"
},
"annotations": [
{
"name": "<string>",
"values": [
"<string>"
]
}
]
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
BatchGetEntityAnnotationsRequest is the request message for the BatchGetEntityAnnotations method.
The entities to read annotations for.
Each entry is validated by Identifier's own rules — its id oneof is
required, and protovalidate recurses into the elements of a repeated
message field — so an identifier naming nothing is refused here. There is no
per-item required to add beside it: repeated.items.required is
unenforceable and buf lint rejects it, and it would have nothing to catch,
because an entry on the wire is always a message rather than a null.
1 - 1000 elementsIdentifier is a unique reference to an entity in Coalesce Quality system. Entity identifiers are designed to closely mimic identifiers used by data platforms and tools. To construct an identifier, you need to know the kind of the entity and the ids that you would normally use to identify it in the data platform or tool. For example, to identify a table in BigQuery, you would need to know the project, dataset, and table names.
Every identifier the API RETURNS also carries entity_id, the entity's opaque
id. Read it when you just need to name the entity again — it is one string for
every platform, where the structured variants below only cover the platforms
that have one.
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
- Identifier
Show child attributes
Show child attributes
Response
Success
BatchGetEntityAnnotationsResponse is the response message for the BatchGetEntityAnnotations method.
One entry per requested entity that carries any annotation. An entity with none is omitted rather than returned empty, so the response says which of the requested entities are annotated at all.
Show child attributes
Show child attributes