---
title: "Connect a browser with a sender's connection token"
method: POST
path: "/linkedin/agent/pair/"
tags: ["linkedin"]
---

# Connect a browser with a sender's connection token

`POST /linkedin/agent/pair/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/linkedin/agent/pair/`
- Auth: none declared

The only unauthenticated route in this package: the connection token a person pasted IS the credential, and the sender it names was fixed server-side when the token was minted, so nothing the extension sends can redirect it. Every browser that connects gets its own agent token. A connected sender accepts only the LinkedIn member it is bound to; a disconnected or never-connected sender takes whoever connects. One LinkedIn member is connected to at most one sender. A browser pairing again passes its previous session so that one is signed out.

## Request body

- AgentPairSchema: The pasted connection token plus what the extension read from the live LinkedIn session.
  - `browser_label` string: How the dashboard names this browser, e.g. 'Chrome on macOS'.
  - `connection_token` string, required
  - `display_name` string
  - `extension_version` string
  - `headline` string
  - `lease_nonce` string, nullable: The lease identity this browser will use with the new session, named before it pairs and kept until a pairing is answered. A live session of the account already carrying it is this same browser's pairing whose answer was lost, and is signed out first, so asking again never leaves a second entry for one browser.
  - `member_urn` string, required
  - `photo_url` string, nullable
  - `previous_session_id` string, uuid, nullable: The session this same browser held before, when it is pairing again. It is signed out first, so re-pairing does not leave a second entry for one browser.
  - `supported_kinds` string[], nullable: The step kinds this build can run, and the capabilities it has beyond them (such as profile_view:read_relationship). Nothing is handed to a browser that it cannot run. Leave it out (an older build) and the browser runs the kinds that existed before builds said.
  - `timezone` string, nullable: The browser's IANA timezone (Intl.DateTimeFormat().resolvedOptions().timeZone). It fills the sender's timezone when the sender has none: their daily limits reset at its midnight and sequences send in its hours. A timezone the sender has is never moved by it. Taken only from the browser driving the account.
  - `vanity_name` string

## Response `201`

Successful Response

- AgentPairResultSchema
  - `account_id` string, uuid, required
  - `agent_token` string, required
  - `display_name` string, required
  - `member_urn` string, nullable, required
  - `run_mode` 'manual' | 'auto', required: Whether a person approves a sender's LinkedIn steps before they run, or they run on their own. The sender's own LinkedIn setting, kept on the sender beside their email modes so the approval queue reads one home for both. The absence of one (``SenderProfileDTO.linkedin_approval_mode`` is None) reads as MANUAL: nothing runs on somebody's LinkedIn unattended until they have said so. The approval queue still tells "never set" apart from "chose manual", which is the level its settings surfaces name.
  - `sender_profile_id` string, uuid, required
  - `session_id` string, uuid, required

## Other responses

- `401`: Unauthorized
- `403`: The connection token is invalid, or the sender is connected as another member.
- `409`: This LinkedIn member is already connected to another sender.
- `422`: Invalid request made to the API.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

[API](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile.md) · [All operations](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/llms.txt) · [OpenAPI document](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/revisions/4a6bd71e3f02?raw)
