---
title: "Look up a LinkedIn person"
method: GET
path: "/api/v1/linkedin/person"
tags: ["API Reference"]
---

# Look up a LinkedIn person

`GET /api/v1/linkedin/person`

## Request

- Base URL: `https://revnu.com`
- URL: `https://revnu.com/api/v1/linkedin/person`
- Auth: HTTP bearer

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.

Requires the `leads:read` scope.

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

## Query parameters

- `profile` string, required
- `account` string

## Response `200`

{ "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 w

- object
  - `person` object, nullable, required
    - `providerId` string, nullable, required
    - `publicIdentifier` string, nullable, required
    - `name` string, nullable, required
    - `headline` string, nullable, required
  - `accounts` LinkedinPersonAccount[], required
    - union
      - object
        - `account` string, required
        - `connectedAs` string, nullable, required
        - `state` 'error', required
        - `message` string, required
      - object
        - `account` string, required
        - `connectedAs` string, nullable, required
        - `state` 'ok', required
        - `connected` boolean, required
        - `invite` object, nullable, required
          - `direction` 'received' | 'sent' | 'null', nullable, required
          - `status` 'ignored' | 'pending' | 'withdrawn' | 'null', nullable, required
          - `at` number, nullable, required
        - `revnuInvite` object, nullable, required
          - `sentAt` number, required
          - `acceptedAt` number, nullable, required
          - `withdrawnAt` number, nullable, required
        - `messages` LinkedinPersonMessage[], required
          - `at` number, required
          - `from` 'them' | 'you', required
          - `sentBy` 'agent' | 'person' | 'null', nullable, required
          - `kind` 'event' | 'inmail' | 'invitation' | 'message', required
          - `text` string, nullable, required
        - `messagesTruncated` boolean, required
        - `lastReplyAt` number, nullable, required
      - object
        - `account` string, required
        - `connectedAs` string, nullable, required
        - `state` 'paced', required
        - `message` string, required
        - `retryAt` number, required
      - object
        - `account` string, required
        - `connectedAs` string, nullable, required
        - `state` 'needs_reauth' | 'not_connected', required

## Other responses

- `400`: profile is missing or is not a LinkedIn profile URL or id.
- `401`: Missing, malformed, unknown or revoked token.
- `402`: `setup_pending`: the account hasn't started its trial. Finish setup with `GET /setup`.
- `403`: The token lacks the scope in `requiredScope`.
- `404`: No connected LinkedIn account has the name in account.
- `429`: Rate limited.
- `503`: Temporarily unavailable; retry the same call.

---

[API](https://skmtc.dev/revnu/apis/revnu-api.md) · [All operations](https://skmtc.dev/revnu/apis/revnu-api/llms.txt) · [OpenAPI document](https://skmtc.dev/revnu/apis/revnu-api/revisions/52e523c2db61?raw)
