> ## 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 notification preferences

> Read graph-wide profile-diff subscriptions and email/Slack delivery settings.

Returns the authenticated organization's notification preferences. These preferences control which profile diffs are eligible for graph-wide email and Slack notifications; they do not change the membership-scoped [List events](/api-reference/events/list) feed. Slack OAuth installation itself happens in the dashboard under Settings → Notifications.

## Inputs

There are no path parameters, query parameters, or request body fields.

## Response

```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "data": {
    "org_id": "a7590925-3e96-4f89-898c-bf7ed02fbd97",
    "fields": ["open_to_work", "left_company", "joined_company", "removed_position"],
    "email_enabled": true,
    "emails": ["you@acme.com"],
    "slack_enabled": true,
    "slack_channel_id": "C0123",
    "slack_channel_name": "recruiting"
  }
}
```

`org_id` is a string. `fields`, `emails`, and the two enabled flags are non-nullable. `slack_channel_id` and `slack_channel_name` are `string | null` when no channel is stored.

Known fields are `open_to_work`, `between_roles`, `exploring`, `left_company`, `joined_company`, `removed_position`, `headline`, `about`, and `role_description`. When no saved row is available, the service falls back to defaults (including on a preference-read database error). These defaults are: `open_to_work`, `between_roles`, `left_company`, `joined_company`, and `removed_position`; email is enabled; `emails` is empty; Slack is disabled; and both Slack channel values are `null`.

The API returns no webhook URL or secret. Use [Update notification preferences](/api-reference/signals/update-preferences) to store those organization settings; the response only exposes `webhook.configured` on the update, and [Get account](/api-reference/account/me) exposes the same boolean.

## Errors and retries

| Status | Meaning                                | Recovery                                                       |
| ------ | -------------------------------------- | -------------------------------------------------------------- |
| `400`  | Invalid platform-org scoping header    | Correct `X-FreshTalent-Org-Id`, or omit it for a customer key. |
| `401`  | Missing, malformed, or revoked API key | Supply a valid key.                                            |
| `429`  | Shared Gateway limit exceeded          | Honor `Retry-After` and back off.                              |
| `5xx`  | Gateway or dependency failure          | Retry this read with bounded backoff.                          |

This read is safe to retry on transient network failures, `429`, or `5xx`. Do not retry `400` or `401` unchanged. The default Gateway limit is 300 requests per minute per client IP, not per API key.

<RequestExample>
  ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
  curl --fail-with-body --max-time 30 "https://api.freshtalent.ai/v1/signals/preferences" \
    -H "Authorization: Bearer $FRESHTALENT_API_KEY"
  ```

  ```js JavaScript theme={"theme":{"light":"github-light","dark":"github-dark"}}
  const response = await fetch("https://api.freshtalent.ai/v1/signals/preferences", {
    signal: AbortSignal.timeout(30_000), headers: { Authorization: `Bearer ${process.env.FRESHTALENT_API_KEY}` },
  });
  if (!response.ok) throw new Error(`FreshTalent HTTP ${response.status}`);
  const preferences = (await response.json()).data;
  console.log(preferences.fields, preferences.email_enabled);
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
  import json
  import os
  from urllib.request import Request, urlopen

  request = Request(
      "https://api.freshtalent.ai/v1/signals/preferences",
      headers={"Authorization": "Bearer " + os.environ["FRESHTALENT_API_KEY"]},
  )
  with urlopen(request, timeout=30) as response:
      preferences = json.load(response)["data"]
  print(preferences["fields"], preferences["email_enabled"])
  ```
</RequestExample>

## Related

* [Update notification preferences](/api-reference/signals/update-preferences)
* [Send test digest](/api-reference/signals/test)
* [Get account](/api-reference/account/me)
* [List events](/api-reference/events/list)
