# 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-01

```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`. |

## Frequently asked questions

### Can this send anything on LinkedIn?

No. It only reads. Nothing on this route 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 the agent shares, so the account never looks like a scraper. 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?

LinkedIn does not report when an invite was accepted. `revnuInvite.acceptedAt` is when Revnu noticed, for invites Revnu sent.

### 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.
