# Profile Viewers

Coming soon – the profileViewers signal reports each new person LinkedIn shows among your profile viewers, so you can follow up while it is recent.

> 🚧 **Coming soon.** Signals are not available yet. This page describes how they will work at launch – the `/signals` endpoints, `signal.*` events and the SDK, CLI and MCP signal commands do not work today.

The `profileViewers` signal watches the account's "Who viewed your profile" list and reports every new viewer LinkedIn identifies. A profile view is often the first sign of interest – someone checked you out after your invitation, your comment or your post – and it is worth a follow-up while it is recent.

## Events

| Event `type` | Webhook event | What happened |
|---|---|---|
| `profileViewed` | `signal.profileViewed` | A new identified viewer appeared in the list, or a person already reported viewed the profile again. |

## Creating

The signal watches the account itself and takes no target. An account has at most one.

```json
{
  "type": "profileViewers"
}
```

| Checked | Each check spends |
|---|---|
| every 3 hours | nothing from account limits |

A check reads the viewers list, the same as [`st.retrieveProfileViewers`](/docs/action-st-retrieve-profile-viewers). The baseline is the viewers already listed at the first check.

> 💡 **How many viewers you get depends on LinkedIn, not on the signal.** On an account without LinkedIn Premium, LinkedIn shows only a few recent viewers, so the signal can report only those. With Premium, it reports every viewer LinkedIn lists.

Only **identified** viewers produce events. Viewers who browse in semi-private mode appear in LinkedIn's list only as a description, such as "Someone at Example Company", with no profile to follow up with; read them with [`st.retrieveProfileViewers`](/docs/action-st-retrieve-profile-viewers) when you need them. Viewers in fully private mode are not shown by LinkedIn at all.

## Event fields

```json
{
  "id": "5d6e7f8a-9b0c-4d1e-8f2a-3b4c5d6e7f8a",
  "signalId": "8f9a0b1c-2d3e-4f4a-9b5c-6d7e8f9a0b1c",
  "signalType": "profileViewers",
  "label": null,
  "type": "profileViewed",
  "detectedAt": "2026-10-12T13:00:00Z",
  "viewer": {
    "viewedAt": "2026-10-12T11:00:00Z",
    "viewedAgo": "2h",
    "name": "Nicolai Elmqvist",
    "publicUrl": "https://www.linkedin.com/in/elmqvist",
    "urn": "urn:li:member:123456789",
    "headline": "Turn live event audiences into video creators",
    "connectionDegree": 2,
    "avatarUrl": "https://media.licdn.com/dms/image/profile-photo.jpg"
  }
}
```

- `viewer` – the viewer, with the same fields as an `identified` item of [`st.retrieveProfileViewers`](/docs/action-st-retrieve-profile-viewers#result-options).
  - `viewedAt` is an **estimate**: LinkedIn shows only a relative age such as `2h` or `3d`, so the time is as precise as that unit.

The common fields – `id`, `signalId`, `signalType`, `label`, `type`, `detectedAt` – are described in [Receiving events](/docs/signal-events#polling).

**Repeat views.** LinkedIn lists each viewer once, with their latest view. When a person already reported views the profile again, LinkedIn moves them up with a newer time, and the signal reports that as a new `profileViewed` event. Views by the same person within 24 hours are reported once.

## Following up with viewers

1. Create the `profileViewers` signal once per account.
2. For each `profileViewed` event, check `viewer.connectionDegree`:
   - `1` – already a connection: send a message with [`st.sendMessage`](/docs/action-st-send-message);
   - `2` or `3` – send an invitation with [`st.sendConnectionRequest`](/docs/action-st-send-connection-request).
3. Keep it human: someone who glanced at your profile did not ask to be contacted, so mention why you are writing and keep the volume within the account's daily limits.
