# Look up a LinkedIn person

> One person's LinkedIn relationship with each connected account, read live from LinkedIn: connected or not, any pending invite and when it was sent, and the conversation.

Canonical: https://revnu.com/docs/linkedin-person
Last updated: 2026-10-21

This route only reads. It never invites, messages or withdraws, and it keeps working when **Settings → Agent → LinkedIn Sending** is set to read-only, so you can watch LinkedIn relationships while Revnu sends nothing. Each call spends one of your LinkedIn account's 50 profile lookups a day. How Revnu paces LinkedIn to keep accounts safe is in [LinkedIn Limits](https://revnu.com/docs/linkedin-limits.md).

```bash
curl -G -H "Authorization: Bearer $REVNU_API_TOKEN" https://revnu.com/api/v1/linkedin/person \
  --data-urlencode "profile=https://www.linkedin.com/in/tom-park/"
```

## Query

| Param | Meaning |
|---|---|
| `profile` | Required. A `linkedin.com/in/` URL, a public id such as `tom-park`, or a member id (`ACoAA…`). |
| `account` | The name of one connected LinkedIn account in your workspace. Without it, every connected account is checked. |

## Response

`{ "person": { providerId, publicIdentifier, name, headline } | null, "accounts": [account, …] }`, one entry per connected LinkedIn account.

An account read in full is `{ account, connectedAs, state: "ok", connected, invite, revnuInvite, messages, messagesTruncated, lastReplyAt }`:

- `connected` is `true` when this account and the person are first-degree connections.
- `invite` is the request LinkedIn reports between them, or `null`: `{ direction: "sent" | "received" | null, status: "pending" | "ignored" | "withdrawn", at }`, where `at` is when it was sent (epoch milliseconds) if LinkedIn says.
- `revnuInvite` is Revnu's own record when Revnu sent the invite from this account: `{ sentAt, acceptedAt, withdrawnAt }`. `acceptedAt` is when Revnu first saw the person connected, not LinkedIn's exact time.
- `messages` are the newest 50 in the conversation, oldest first: `{ at, from: "you" | "them", sentBy, kind, text }`. `sentBy` is `"agent"` when Revnu sent it, `"person"` when someone replied from Revnu's inbox, and `null` when it was typed in LinkedIn. `messagesTruncated` says older messages exist.
- `lastReplyAt` is the time of their newest message, or `null`.

An account that could not be read has a `state` instead: `not_connected`, `needs_reauth` (reconnect it in the dashboard), `paced` with `message` and `retryAt` (the account's daily profile-lookup budget is spent), or `error` with `message`, including when no profile matches.

| Code | Meaning |
|---|---|
| 400 | `profile` is missing or is not a LinkedIn profile URL or id. |
| 404 | No connected LinkedIn account has the name in `account`. |

## With LinkedIn sending set to read-only

This route keeps working when **Settings → Agent → LinkedIn Sending** is switched to read-only. Read-only stops every invite, message and InMail across the workspace, but profile lookups and conversations are reads, so connection state and the last 50 messages still come back. That makes read-only plus this route a safe way to watch LinkedIn relationships without Revnu sending anything.

## Watching for changes

For people in one of your Revnu sequences, read `linkedin` on [`GET /leads`](https://revnu.com/docs/leads.md#linkedin-sequence-progress) instead. It carries when each invite was sent and accepted and when they replied, from Revnu's own records, and costs no lookups. This route is for people Revnu did not contact.

There is no route that lists all your connections, pending invites or conversations. Every lookup needs a profile, one person at a time. There are no LinkedIn events or webhooks either. To notice an accepted invite or a new reply, call this route for the people you care about on a schedule, such as once a day each, and compare `connected`, `invite` and `lastReplyAt` with what you stored last time. Every call spends lookups, so watch a short list, not your whole pipeline. For counts across the account, [`GET /results`](https://revnu.com/docs/results.md) has `linkedin.data.replies` and `invites` for any window.

## Frequently asked questions

### Can I list all my pending invites or LinkedIn conversations?

This route answers for one person you name. For totals over a window, read `invites`, `replies` and `accepts` in the LinkedIn section of [`GET /results`](https://revnu.com/docs/results.md). To browse conversations, open the **LinkedIn** tab in **Inbox** in the dashboard.

### Can this send anything on LinkedIn?

This route only reads. Nothing on it invites, messages or withdraws.

### Does each call count against my LinkedIn account?

Yes. Each account checked is one profile lookup on LinkedIn, from a budget of 50 a day per account that Revnu shares, and it also counts toward the account's 90 LinkedIn actions a day, so the account never looks like a scraper. When the budget is spent, that account comes back `paced` with `retryAt`. Looking up the same person again within ten minutes is not charged twice. Lookups work at any hour. Look people up when you need them rather than polling a whole list.

### Why is there no exact acceptance time?

`revnuInvite.acceptedAt` is when Revnu noticed the acceptance, for invites Revnu sent. LinkedIn doesn't report the exact moment.

### Does this work when LinkedIn is set to read-only?

Yes. Read-only blocks sends, not lookups. You get connection state, any pending invite and the last 50 messages.

### Which scope does this need?

`leads:read`. A token without it gets `403` with `requiredScope` in the body. `GET /me` shows a token's scopes.

### Are responses cached?

No. Every response is `Cache-Control: no-store`, so what you read is current.
