curl --request GET \
--url https://tako.com/api/v1/graph/related \
--header 'X-API-Key: <api-key>'import requests
url = "https://tako.com/api/v1/graph/related"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://tako.com/api/v1/graph/related', 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://tako.com/api/v1/graph/related",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://tako.com/api/v1/graph/related"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://tako.com/api/v1/graph/related")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://tako.com/api/v1/graph/related")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"node": {
"id": "<string>",
"type": "metric",
"name": "<string>",
"aliases": [
"<string>"
],
"description": "<string>",
"subtype": "Companies",
"label": "PERSON"
},
"relations": [
{
"key": "<string>",
"kind": "related",
"label": "<string>",
"items": [
{
"id": "<string>",
"type": "metric",
"name": "<string>",
"aliases": [
"<string>"
],
"description": "<string>",
"subtype": "Companies",
"label": "PERSON"
}
],
"total": 123,
"total_capped": false
}
],
"relation": {
"key": "<string>",
"kind": "related",
"label": "<string>",
"items": [
{
"id": "<string>",
"type": "metric",
"name": "<string>",
"aliases": [
"<string>"
],
"description": "<string>",
"subtype": "Companies",
"label": "PERSON"
}
],
"total": 123,
"total_capped": false,
"next_cursor": "<string>"
},
"inferred_labels": [
"PERSON"
]
}{
"error_message": "<string>",
"error_type": "BAD_REQUEST"
}{
"error_message": "<string>",
"error_type": "BAD_REQUEST"
}{
"error_message": "<string>",
"error_type": "BAD_REQUEST"
}{
"error_message": "<string>",
"error_type": "BAD_REQUEST"
}Graph Related
Explore the nodes connected to a metric or entity in Tako’s data graph
curl --request GET \
--url https://tako.com/api/v1/graph/related \
--header 'X-API-Key: <api-key>'import requests
url = "https://tako.com/api/v1/graph/related"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://tako.com/api/v1/graph/related', 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://tako.com/api/v1/graph/related",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://tako.com/api/v1/graph/related"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://tako.com/api/v1/graph/related")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://tako.com/api/v1/graph/related")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"node": {
"id": "<string>",
"type": "metric",
"name": "<string>",
"aliases": [
"<string>"
],
"description": "<string>",
"subtype": "Companies",
"label": "PERSON"
},
"relations": [
{
"key": "<string>",
"kind": "related",
"label": "<string>",
"items": [
{
"id": "<string>",
"type": "metric",
"name": "<string>",
"aliases": [
"<string>"
],
"description": "<string>",
"subtype": "Companies",
"label": "PERSON"
}
],
"total": 123,
"total_capped": false
}
],
"relation": {
"key": "<string>",
"kind": "related",
"label": "<string>",
"items": [
{
"id": "<string>",
"type": "metric",
"name": "<string>",
"aliases": [
"<string>"
],
"description": "<string>",
"subtype": "Companies",
"label": "PERSON"
}
],
"total": 123,
"total_capped": false,
"next_cursor": "<string>"
},
"inferred_labels": [
"PERSON"
]
}{
"error_message": "<string>",
"error_type": "BAD_REQUEST"
}{
"error_message": "<string>",
"error_type": "BAD_REQUEST"
}{
"error_message": "<string>",
"error_type": "BAD_REQUEST"
}{
"error_message": "<string>",
"error_type": "BAD_REQUEST"
}Notes
- Authenticated, no credits — send the same
X-API-Keyheader as every Tako endpoint. Graph calls consume no credits; rate limits are 180/minute and 10,000/day. - Start from a
node_idreturned by Graph Search, then use graph related to find which entity + metric combinations Tako actually covers. Once you’ve found a covered combination, query Search (/v3/search) or Answer (/v1/answer) for it — pinning the ids viasources.data.node_ids. - Results in each group are ranked by popularity, blended with how strongly each node matches
qwhen a filter is provided. On big entities, always passq— unfiltered, a big entity returns hundreds of items.
Response shape: overview vs. one group
The response always includes the resolvednode. The rest depends on whether you paginate:
- No
relation→relationsholds an ordered overview: one group per relation, each{key, kind, label, items (preview), total, total_capped}. Named semantic edges come first, then membership, data, and siblings; empty groups are dropped. relation=<key>set →relationholds a single paginated page for that one group, withitems,total,total_capped, and anext_cursor. Passnext_cursorback ascursorto page through. Items live inrelation.items.
kind:
kind | Keys | Meaning |
|---|---|---|
related | rel:<phrase> — e.g. rel:competes_with, rel:subsidiaries_of, rel:in_industry | Named semantic edges — the richest signal for entities. Keys are per-node: read the overview to discover them, then drill. |
membership | part_of, members | Cohort/geo membership (Apple part_of FAANG; a league’s members). |
data | metrics, entities | Table co-reference — the metrics/entities sharing datasets with this node. |
sibling | siblings | Same-type peers — the class namespace (“Other Companies”), not a curated cohort. |
relation key returns 200 with empty items, not an error — so a typo’d key reads as “no relation.” Keys are per-node: read the overview to discover them, then drill.Narrowing with q
The optional q is a case-insensitive substring filter on related nodes’ names/aliases. It filters every group of the overview, or the single paginated group when relation is set:
# Metrics available for an entity, matching "gdp"
curl "https://tako.com/api/v1/graph/related?node_id=$NODE_ID&relation=metrics&q=gdp" \
-H "X-API-Key: $TAKO_API_KEY"
label/infer_label boosts work as on Graph Search and apply within each group; inference runs only when q is set.
Capped totals
total stops counting at 250: total_capped: true means the true count is at least total — render it as “250+”. Pagination also ends at the cap, so narrow with q to reach the tail.
404 means the node_id does not resolve. A node with no relations returns 200 with empty groups — that’s the normal “nothing connected” outcome, not an error.Example response (overview)
{
"node": { "id": "ent::nvidia_corporation::5ea55992", "type": "entity", "name": "NVIDIA Corporation", "subtype": "Companies", "label": "ORG" },
"relations": [
{ "key": "rel:competes_with", "kind": "related", "label": "Competes with",
"items": [/* GraphNode previews */], "total": 179, "total_capped": false },
{ "key": "rel:subsidiaries_of", "kind": "related", "label": "Subsidiaries of",
"items": [/* ... */], "total": 24, "total_capped": false },
{ "key": "part_of", "kind": "membership", "label": "Part of",
"items": [/* ... */], "total": 2, "total_capped": false },
{ "key": "metrics", "kind": "data", "label": "Related Metrics",
"items": [/* ... */], "total": 250, "total_capped": true },
{ "key": "entities", "kind": "data", "label": "Entities",
"items": [/* ... */], "total": 62, "total_capped": false },
{ "key": "siblings", "kind": "sibling", "label": "Other Companies",
"items": [/* ... */], "total": 250, "total_capped": true }
]
}
Authorizations
Query Parameters
Opaque public id of the node.
Relation key to paginate. Read the keys from the overview, for example rel:competes_with, breakdown:segment, breakdown:soc_code, metrics, entities, siblings, or members.
Deprecated: use relation. A legacy facet name (metric, entity, sibling, or member) that maps to a key.
Optional case-insensitive substring filter on the related nodes' names and aliases. It filters every group of the overview, or the single paginated group when you set relation.
Opaque pagination cursor.
Page size (default 50, max 100).
Maximum number of nodes counted and paginated in each relation (default 250, max 2000). A relation with more nodes reports this total with total_capped set, and pagination ends at it. Higher values make the request slower.
Prefer related nodes with this NER label. This is a boost, not a filter: matching nodes rank higher within each relation, and totals do not change. Supplying label disables inference.
PERSON, ORG, GPE, LOC, PRODUCT, EVENT, LANGUAGE, MONEY, METRIC, STOCK_TICKER, WEBSITE When true, Tako NER infers the label and grounded-node boosts from q. Set false to disable. Tako ignores this parameter when you supply label. It applies only when q is present. Default true.
Response
A node's details plus related nodes by facet
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Labels that Tako NER inferred from q when infer_label ran (boost applied). An empty list means inference ran and found nothing. The field is absent when you supplied an explicit label, when infer_label=false, or when there was no q.
PERSON, ORG, GPE, LOC, PRODUCT, EVENT, LANGUAGE, MONEY, METRIC, STOCK_TICKER, WEBSITE