> ## Documentation Index
> Fetch the complete documentation index at: https://docs.freshtalent.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Get person

> Fetch a person's full dossier by public identifier, slug, or LinkedIn URL.

Fetch the full, hydrated dossier for one visible person. The path value can be the person's `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](/api-reference/people/schema).

<ParamField path="slug" type="string" required>
  A LinkedIn public identifier or a LinkedIn profile URL, for example `derek-morrow` or `https://www.linkedin.com/in/derek-morrow`.
</ParamField>

<ParamField query="include" type="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.
</ParamField>

`coworkers` and `similar` are also available as standalone routes: [GET /people/{slug}/coworkers](/api-reference/people/get) and [GET /people/{slug}/similar](/api-reference/people/get). They use the same slug lookup but return only `{ "data": [...] }`.

<RequestExample>
  ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
  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"
  ```

  ```javascript JavaScript (fetch) theme={"theme":{"light":"github-light","dark":"github-dark"}}
  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);
  ```

  ```python Python (stdlib) theme={"theme":{"light":"github-light","dark":"github-dark"}}
  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"])
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
  {
    "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": []
  }
  ```
</ResponseExample>

The full field contract, including nullable nested values and match metadata, is in [Person response shapes](/api-reference/people/schema). The expansion arrays are omitted when not requested. `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](/api-reference/people/search).
* `401 unauthorized`: provide a valid API key in `Authorization: Bearer ...`.
* `402 payment_required`: restore active organization access.
* `5xx` or a transient network failure: retry this read with bounded backoff, jitter, and a timeout.
* `429`: retry the idempotent `GET` with exponential backoff and jitter after slowing down. The shared Gateway limit is 300 requests per minute per client IP as the Gateway sees it. Honor `Retry-After`; see [Rate limits](/rate-limits).

`400 invalid_request` is possible for authentication or organization context errors, but this route has no schema-validated query filter. See [Errors](/errors) for the common envelope.

## Next steps

* [Search people](/api-reference/people/search) to discover slugs and persist a query.
* [Person response shapes](/api-reference/people/schema) for full versus compact rows.
* [POST /targets](/api-reference/targets/create) to monitor a saved people search.
