curl --request GET \
--url https://api.affinity.co/v2/intro-paths \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.affinity.co/v2/intro-paths"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.affinity.co/v2/intro-paths', 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://api.affinity.co/v2/intro-paths",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.affinity.co/v2/intro-paths"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.affinity.co/v2/intro-paths")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.affinity.co/v2/intro-paths")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"rank": 1,
"tier": "strong",
"target": {
"id": 55,
"name": "Jane Doe",
"title": "CEO",
"linkedinUrl": "https://www.linkedin.com/in/janedoe",
"currentCompany": {
"id": 200,
"name": "Acme",
"domain": "acme.co"
}
},
"edges": [
{
"from": {
"id": 42,
"firstName": "Alice",
"lastName": "Roe",
"primaryEmailAddress": "alice@northpointvc.com",
"linkedinUrl": "https://www.linkedin.com/in/aliceroe"
},
"to": {
"id": 55,
"firstName": "Jane",
"lastName": "Doe",
"primaryEmailAddress": "jane.doe@acme.co",
"linkedinUrl": "https://www.linkedin.com/in/janedoe"
},
"connectionInfo": {
"interactionScore": 0.85,
"lastInteraction": {
"type": "email",
"sentAt": "2026-08-14T15:04:00Z"
},
"linkedIn": null,
"sharedWorkHistory": [],
"investmentHistory": []
},
"tier": "strong"
}
]
},
{
"rank": 2,
"tier": "moderate",
"target": {
"id": 55,
"name": "Jane Doe",
"title": "CEO",
"linkedinUrl": "https://www.linkedin.com/in/janedoe",
"currentCompany": {
"id": 200,
"name": "Acme",
"domain": "acme.co"
}
},
"edges": [
{
"from": {
"id": 42,
"firstName": "Alice",
"lastName": "Roe",
"primaryEmailAddress": "alice@northpointvc.com",
"linkedinUrl": "https://www.linkedin.com/in/aliceroe"
},
"to": {
"id": 22,
"firstName": "Alex",
"lastName": "Kim",
"primaryEmailAddress": "alex.kim@acme.co",
"linkedinUrl": "https://www.linkedin.com/in/alexkim"
},
"connectionInfo": {
"interactionScore": 0.55,
"lastInteraction": {
"type": "meeting",
"startTime": "2026-06-02T09:30:00Z",
"endTime": "2026-06-02T10:30:00Z"
},
"linkedIn": null,
"sharedWorkHistory": [],
"investmentHistory": []
},
"tier": "moderate"
},
{
"from": {
"id": 22,
"firstName": "Alex",
"lastName": "Kim",
"primaryEmailAddress": "alex.kim@acme.co",
"linkedinUrl": "https://www.linkedin.com/in/alexkim"
},
"to": {
"id": 55,
"firstName": "Jane",
"lastName": "Doe",
"primaryEmailAddress": "jane.doe@acme.co",
"linkedinUrl": "https://www.linkedin.com/in/janedoe"
},
"connectionInfo": {
"interactionScore": null,
"lastInteraction": null,
"linkedIn": null,
"sharedWorkHistory": [
{
"sharedEmployer": {
"id": 555,
"name": "Globex",
"domain": "globex.com"
},
"overlapStartDate": "2018-03-01",
"overlapEndDate": "2020-11-30"
}
],
"investmentHistory": []
},
"tier": "moderate"
}
]
}
],
"pagination": {
"prevUrl": null,
"nextUrl": null
}
}{
"errors": [
{
"code": "bad-request",
"message": "<string>"
}
]
}{
"errors": [
{
"code": "not-found",
"message": "<string>"
}
]
}{
"errors": [
{
"code": "authentication",
"message": "<string>"
}
]
}Get Introduction Paths
| ⚠️ This endpoint is currently in BETA |
|---|
Returns ranked introduction paths from an internal person to a target, strongest first. Each path is composed of one or two edges: a single edge is a direct relationship between an internal person and the target. Two edges represent an internal person reaching the target through a bridge person, where edges[0].to and edges[1].from are the same person.
The target is specified with the required filter parameter, using exactly one of the target.id or target.currentCompany.id filter terms. target.id targets a specific person, whether an existing contact or a person already identified at a target company. target.currentCompany.id targets any person at that company; returned paths may lead to different people, and each path’s target is edges[edges.length - 1].to, exposed as target for filtering.
Only relative ordering is exposed. rank reflects each path’s position among all paths to the target, computed before paging is applied, so a path keeps the same rank on whichever page it appears; it is not stable across requests as underlying data changes. tier is a qualitative strong, moderate, or weak band for the path as a whole. Neither rank nor tier exposes the underlying interaction score or inferred connection confidence used to compute them.
Each edge also carries its own tier, independent of the path-level tier, so a client can distinguish which specific hop is strong or weak within a two-edge path.
Results are always ordered by rank, strongest first. orderBy is not supported.
Filters
The filter parameter is required and must contain exactly one of the following filter terms. Providing both, or neither, returns a 400.
| Property Name | Type | Description | Allowed Operators | Examples |
|---|---|---|---|---|
target.id | integer | The target person’s id. | = | target.id = 123 |
target.currentCompany.id | integer | The id of the company the target person currently works at; ranks paths to any person at that company. | = | target.currentCompany.id = 456 |
Path types
An edge’s connectionInfo carries whichever signals connect its two people, and more than one can be present on the same edge. interactionScore reflects interaction history, lastInteraction the most recent email, meeting, call, or chat message behind it, linkedIn a LinkedIn connection, and sharedWorkHistory or investmentHistory an inferred connection through shared employment or an investor-portfolio relationship. Each is null or empty when that signal is absent.
curl --request GET \
--url https://api.affinity.co/v2/intro-paths \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.affinity.co/v2/intro-paths"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.affinity.co/v2/intro-paths', 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://api.affinity.co/v2/intro-paths",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.affinity.co/v2/intro-paths"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.affinity.co/v2/intro-paths")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.affinity.co/v2/intro-paths")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"rank": 1,
"tier": "strong",
"target": {
"id": 55,
"name": "Jane Doe",
"title": "CEO",
"linkedinUrl": "https://www.linkedin.com/in/janedoe",
"currentCompany": {
"id": 200,
"name": "Acme",
"domain": "acme.co"
}
},
"edges": [
{
"from": {
"id": 42,
"firstName": "Alice",
"lastName": "Roe",
"primaryEmailAddress": "alice@northpointvc.com",
"linkedinUrl": "https://www.linkedin.com/in/aliceroe"
},
"to": {
"id": 55,
"firstName": "Jane",
"lastName": "Doe",
"primaryEmailAddress": "jane.doe@acme.co",
"linkedinUrl": "https://www.linkedin.com/in/janedoe"
},
"connectionInfo": {
"interactionScore": 0.85,
"lastInteraction": {
"type": "email",
"sentAt": "2026-08-14T15:04:00Z"
},
"linkedIn": null,
"sharedWorkHistory": [],
"investmentHistory": []
},
"tier": "strong"
}
]
},
{
"rank": 2,
"tier": "moderate",
"target": {
"id": 55,
"name": "Jane Doe",
"title": "CEO",
"linkedinUrl": "https://www.linkedin.com/in/janedoe",
"currentCompany": {
"id": 200,
"name": "Acme",
"domain": "acme.co"
}
},
"edges": [
{
"from": {
"id": 42,
"firstName": "Alice",
"lastName": "Roe",
"primaryEmailAddress": "alice@northpointvc.com",
"linkedinUrl": "https://www.linkedin.com/in/aliceroe"
},
"to": {
"id": 22,
"firstName": "Alex",
"lastName": "Kim",
"primaryEmailAddress": "alex.kim@acme.co",
"linkedinUrl": "https://www.linkedin.com/in/alexkim"
},
"connectionInfo": {
"interactionScore": 0.55,
"lastInteraction": {
"type": "meeting",
"startTime": "2026-06-02T09:30:00Z",
"endTime": "2026-06-02T10:30:00Z"
},
"linkedIn": null,
"sharedWorkHistory": [],
"investmentHistory": []
},
"tier": "moderate"
},
{
"from": {
"id": 22,
"firstName": "Alex",
"lastName": "Kim",
"primaryEmailAddress": "alex.kim@acme.co",
"linkedinUrl": "https://www.linkedin.com/in/alexkim"
},
"to": {
"id": 55,
"firstName": "Jane",
"lastName": "Doe",
"primaryEmailAddress": "jane.doe@acme.co",
"linkedinUrl": "https://www.linkedin.com/in/janedoe"
},
"connectionInfo": {
"interactionScore": null,
"lastInteraction": null,
"linkedIn": null,
"sharedWorkHistory": [
{
"sharedEmployer": {
"id": 555,
"name": "Globex",
"domain": "globex.com"
},
"overlapStartDate": "2018-03-01",
"overlapEndDate": "2020-11-30"
}
],
"investmentHistory": []
},
"tier": "moderate"
}
]
}
],
"pagination": {
"prevUrl": null,
"nextUrl": null
}
}{
"errors": [
{
"code": "bad-request",
"message": "<string>"
}
]
}{
"errors": [
{
"code": "not-found",
"message": "<string>"
}
]
}{
"errors": [
{
"code": "authentication",
"message": "<string>"
}
]
}Authorizations
A static Affinity API key, presented as a bearer token.
Query Parameters
Filter options. Required; must contain exactly one of the target.id or target.currentCompany.id filter terms. See the Filters section above.
Cursor for the next or previous page.
Number of items to include in the page.
1 <= x <= 100Include total count of the collection in the pagination response.
Was this page helpful?