curl --fail-with-body --max-time 30 --get "https://api.freshtalent.ai/v1/people/derek-morrow" \
--data-urlencode "include=coworkers,similar" \
-H "Authorization: Bearer $FRESHTALENT_API_KEY"
const slug = "derek-morrow";
const params = new URLSearchParams({ include: "coworkers,similar" });
const response = await fetch(
`https://api.freshtalent.ai/v1/people/${encodeURIComponent(slug)}?${params}`,
{ signal: AbortSignal.timeout(30_000), headers: { Authorization: `Bearer ${process.env.FRESHTALENT_API_KEY}` } },
);
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const body = await response.json();
console.log(body.data.full_name, body.coworkers?.length ?? 0);
import json
import os
from urllib.parse import quote, urlencode
from urllib.request import Request, urlopen
slug = "derek-morrow"
url = (
"https://api.freshtalent.ai/v1/people/"
+ quote(slug, safe="")
+ "?"
+ urlencode({"include": "coworkers,similar"})
)
request = Request(
url,
headers={"Authorization": f"Bearer {os.environ['FRESHTALENT_API_KEY']}"},
)
with urlopen(request, timeout=30) as response:
body = json.load(response)
print(body["data"]["full_name"])
{
"data": {
"slug": "derek-morrow",
"full_name": "Derek Morrow",
"headline": "FDE, Anduril",
"linkedin_url": "https://www.linkedin.com/in/derek-morrow",
"profile_picture_url": null,
"location": { "city": "New York", "region": "New York", "country": "United States" },
"is_open_to_work": false,
"is_between_roles": false,
"between_roles_since": null,
"is_exploring": false,
"exploring_since": null,
"exploring_reasons": [],
"exploring_interpretation": null,
"connections_count": 500,
"followers_count": null,
"last_enriched_at": "2026-09-07T10:00:00.000Z",
"dq_flags": [],
"github": null,
"x": null,
"positions": [
{
"company": "Anduril",
"company_url": "https://www.linkedin.com/company/anduril-industries",
"title": "FDE",
"started_at": "2025-01",
"ended_at": null,
"tenure_months": 14,
"is_current": true,
"role_family": "forward-deployed-engineer"
}
],
"education": [],
"skills": [],
"languages": [],
"certifications": [],
"match": {}
},
"coworkers": [],
"stints": [],
"similar": []
}
Get person
Fetch a person’s full dossier by public identifier, slug, or LinkedIn URL.
GET
/
people
/
{slug}
curl --fail-with-body --max-time 30 --get "https://api.freshtalent.ai/v1/people/derek-morrow" \
--data-urlencode "include=coworkers,similar" \
-H "Authorization: Bearer $FRESHTALENT_API_KEY"
const slug = "derek-morrow";
const params = new URLSearchParams({ include: "coworkers,similar" });
const response = await fetch(
`https://api.freshtalent.ai/v1/people/${encodeURIComponent(slug)}?${params}`,
{ signal: AbortSignal.timeout(30_000), headers: { Authorization: `Bearer ${process.env.FRESHTALENT_API_KEY}` } },
);
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const body = await response.json();
console.log(body.data.full_name, body.coworkers?.length ?? 0);
import json
import os
from urllib.parse import quote, urlencode
from urllib.request import Request, urlopen
slug = "derek-morrow"
url = (
"https://api.freshtalent.ai/v1/people/"
+ quote(slug, safe="")
+ "?"
+ urlencode({"include": "coworkers,similar"})
)
request = Request(
url,
headers={"Authorization": f"Bearer {os.environ['FRESHTALENT_API_KEY']}"},
)
with urlopen(request, timeout=30) as response:
body = json.load(response)
print(body["data"]["full_name"])
{
"data": {
"slug": "derek-morrow",
"full_name": "Derek Morrow",
"headline": "FDE, Anduril",
"linkedin_url": "https://www.linkedin.com/in/derek-morrow",
"profile_picture_url": null,
"location": { "city": "New York", "region": "New York", "country": "United States" },
"is_open_to_work": false,
"is_between_roles": false,
"between_roles_since": null,
"is_exploring": false,
"exploring_since": null,
"exploring_reasons": [],
"exploring_interpretation": null,
"connections_count": 500,
"followers_count": null,
"last_enriched_at": "2026-09-07T10:00:00.000Z",
"dq_flags": [],
"github": null,
"x": null,
"positions": [
{
"company": "Anduril",
"company_url": "https://www.linkedin.com/company/anduril-industries",
"title": "FDE",
"started_at": "2025-01",
"ended_at": null,
"tenure_months": 14,
"is_current": true,
"role_family": "forward-deployed-engineer"
}
],
"education": [],
"skills": [],
"languages": [],
"certifications": [],
"match": {}
},
"coworkers": [],
"stints": [],
"similar": []
}
Fetch the full, hydrated dossier for one visible person. The path value can be the person’s
The full field contract, including nullable nested values and match metadata, is in Person response shapes. The expansion arrays are omitted when not requested.
public_identifier (the usual LinkedIn slug), a raw slug, or a LinkedIn profile URL. URL-encode a path value that contains reserved characters.
Unlike GET /people?view=full, this endpoint hydrates all available positions after overlapping rows are collapsed, plus education, skills, languages, and certifications. The response always uses the full Person shape. See Person response shapes.
string
required
A LinkedIn public identifier or a LinkedIn profile URL, for example
derek-morrow or https://www.linkedin.com/in/derek-morrow.string
Optional comma-separated expansions.
coworkers adds top-level coworkers and stints; similar adds top-level similar. Include both to request both expansions. Unknown values are ignored.coworkers and similar are also available as standalone routes: GET /people//coworkers and GET /people//similar. They use the same slug lookup but return only { "data": [...] }.
curl --fail-with-body --max-time 30 --get "https://api.freshtalent.ai/v1/people/derek-morrow" \
--data-urlencode "include=coworkers,similar" \
-H "Authorization: Bearer $FRESHTALENT_API_KEY"
const slug = "derek-morrow";
const params = new URLSearchParams({ include: "coworkers,similar" });
const response = await fetch(
`https://api.freshtalent.ai/v1/people/${encodeURIComponent(slug)}?${params}`,
{ signal: AbortSignal.timeout(30_000), headers: { Authorization: `Bearer ${process.env.FRESHTALENT_API_KEY}` } },
);
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const body = await response.json();
console.log(body.data.full_name, body.coworkers?.length ?? 0);
import json
import os
from urllib.parse import quote, urlencode
from urllib.request import Request, urlopen
slug = "derek-morrow"
url = (
"https://api.freshtalent.ai/v1/people/"
+ quote(slug, safe="")
+ "?"
+ urlencode({"include": "coworkers,similar"})
)
request = Request(
url,
headers={"Authorization": f"Bearer {os.environ['FRESHTALENT_API_KEY']}"},
)
with urlopen(request, timeout=30) as response:
body = json.load(response)
print(body["data"]["full_name"])
{
"data": {
"slug": "derek-morrow",
"full_name": "Derek Morrow",
"headline": "FDE, Anduril",
"linkedin_url": "https://www.linkedin.com/in/derek-morrow",
"profile_picture_url": null,
"location": { "city": "New York", "region": "New York", "country": "United States" },
"is_open_to_work": false,
"is_between_roles": false,
"between_roles_since": null,
"is_exploring": false,
"exploring_since": null,
"exploring_reasons": [],
"exploring_interpretation": null,
"connections_count": 500,
"followers_count": null,
"last_enriched_at": "2026-09-07T10:00:00.000Z",
"dq_flags": [],
"github": null,
"x": null,
"positions": [
{
"company": "Anduril",
"company_url": "https://www.linkedin.com/company/anduril-industries",
"title": "FDE",
"started_at": "2025-01",
"ended_at": null,
"tenure_months": 14,
"is_current": true,
"role_family": "forward-deployed-engineer"
}
],
"education": [],
"skills": [],
"languages": [],
"certifications": [],
"match": {}
},
"coworkers": [],
"stints": [],
"similar": []
}
coworkers also returns stints; similar is calculated from shared graph signals and can be empty.
Errors and recovery
404 not_found: the slug, public identifier, or URL did not resolve to a person visible to this organization. Check the identifier, URL-encode the path, or search first with Search people.401 unauthorized: provide a valid API key inAuthorization: Bearer ....402 payment_required: restore active organization access.5xxor a transient network failure: retry this read with bounded backoff, jitter, and a timeout.429: retry the idempotentGETwith exponential backoff and jitter after slowing down. The shared Gateway limit is 300 requests per minute per client IP as the Gateway sees it. HonorRetry-After; see Rate limits.
400 invalid_request is possible for authentication or organization context errors, but this route has no schema-validated query filter. See Errors for the common envelope.
Next steps
- Search people to discover slugs and persist a query.
- Person response shapes for full versus compact rows.
- POST /targets to monitor a saved people search.