Unlock Profile
curl --request POST \
--url https://api.linkupapi.com/v2/profiles \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"account_id": "<string>",
"action": "<string>",
"params": {
"profile": "<string>"
}
}
'import requests
url = "https://api.linkupapi.com/v2/profiles"
payload = {
"account_id": "<string>",
"action": "<string>",
"params": { "profile": "<string>" }
}
headers = {
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({account_id: '<string>', action: '<string>', params: {profile: '<string>'}})
};
fetch('https://api.linkupapi.com/v2/profiles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.linkupapi.com/v2/profiles",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'account_id' => '<string>',
'action' => '<string>',
'params' => [
'profile' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.linkupapi.com/v2/profiles"
payload := strings.NewReader("{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"profile\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.linkupapi.com/v2/profiles")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"profile\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linkupapi.com/v2/profiles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"profile\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"unlocked": true,
"sales_profile_id": "ACwAAAstu10B6ONvINVM4_BzI_rFALPEOlLx7Ig",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAAstu10B6ONvINVM4_BzI_rFALPEOlLx7Ig,NAME_SEARCH,AbCd)",
"member_urn": "urn:li:member:187678557",
"full_name": "Jake Abrams",
"degree": 3,
"profile_url": "https://www.linkedin.com/in/abramsjake",
"inmail_restriction": "NO_RESTRICTION"
},
"metadata": {
"action": "unlock",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-10-12T14:02:11Z"
}
}
{
"success": false,
"error": {
"code": "CHANNEL_ERROR",
"message": "LinkedIn refused this Sales Nav request. The seat may have lost access, or the action is not permitted on this profile."
},
"metadata": {
"action": "unlock",
"credits_consumed": 1,
"timestamp": "2026-10-12T14:02:11Z"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "profile is required: a profile URL, slug, member id or Sales Nav lead reference"
},
"metadata": {
"action": "unlock",
"credits_consumed": 0,
"timestamp": "2026-10-12T14:02:11Z"
}
}
Profiles
Unlock Profile
Unlock an out-of-network profile on a Sales Navigator seat, before an InMail.
POST
/
v2
/
profiles
Unlock Profile
curl --request POST \
--url https://api.linkupapi.com/v2/profiles \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"account_id": "<string>",
"action": "<string>",
"params": {
"profile": "<string>"
}
}
'import requests
url = "https://api.linkupapi.com/v2/profiles"
payload = {
"account_id": "<string>",
"action": "<string>",
"params": { "profile": "<string>" }
}
headers = {
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({account_id: '<string>', action: '<string>', params: {profile: '<string>'}})
};
fetch('https://api.linkupapi.com/v2/profiles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.linkupapi.com/v2/profiles",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'account_id' => '<string>',
'action' => '<string>',
'params' => [
'profile' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.linkupapi.com/v2/profiles"
payload := strings.NewReader("{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"profile\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.linkupapi.com/v2/profiles")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"profile\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linkupapi.com/v2/profiles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"profile\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"unlocked": true,
"sales_profile_id": "ACwAAAstu10B6ONvINVM4_BzI_rFALPEOlLx7Ig",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAAstu10B6ONvINVM4_BzI_rFALPEOlLx7Ig,NAME_SEARCH,AbCd)",
"member_urn": "urn:li:member:187678557",
"full_name": "Jake Abrams",
"degree": 3,
"profile_url": "https://www.linkedin.com/in/abramsjake",
"inmail_restriction": "NO_RESTRICTION"
},
"metadata": {
"action": "unlock",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-10-12T14:02:11Z"
}
}
{
"success": false,
"error": {
"code": "CHANNEL_ERROR",
"message": "LinkedIn refused this Sales Nav request. The seat may have lost access, or the action is not permitted on this profile."
},
"metadata": {
"action": "unlock",
"credits_consumed": 1,
"timestamp": "2026-10-12T14:02:11Z"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "profile is required: a profile URL, slug, member id or Sales Nav lead reference"
},
"metadata": {
"action": "unlock",
"credits_consumed": 0,
"timestamp": "2026-10-12T14:02:11Z"
}
}
Overview
Sales Navigator withholds the profile of a member outside the seat’s network (3rd degree and beyond, no shared group): the lead shows as LinkedIn Member, the full profile is hidden and no InMail can be sent. This action spends one of the seat’s monthly unlock credits to reveal the member for good, so you can then send an InMail. LinkedIn grants each Sales Navigator seat 25 unlocks a month, not pooled between seats and not carried over. An unlocked member stays unlocked for every seat on the same contract.This endpoint consumes 1 credit and one of the seat’s monthly unlock credits when LinkedIn performs the unlock. Requires a Sales Nav seat on the account (connected automatically on first use). Ignore the 1 credit if you’re on per-seat pricing: usage is unlimited.
Request
string
required
Your API key for authentication.
string
required
The unique identifier of the account to use. Must have a Sales Nav seat.
string
required
Must be
"unlock".object
required
Show params properties
Show params properties
string
required
The member to unlock: profile URL, public slug, member id (
ACoAA…), or a Sales Nav lead reference (/sales/lead/ACwAA… URL, urn:li:fs_salesProfile:…, bare ACwAA…). profile_url is accepted as an alias.Response
boolean
Indicates whether the request was successful.
object
Show data properties
Show data properties
boolean
true once LinkedIn has accepted the unlock.string
The lead’s Sales Nav id (
ACwAA…).string
The lead’s
urn:li:fs_salesProfile:…, usable as recipient in Send Message with sales_navigator: true.string
The member’s
urn:li:member:….string | null
Full name as the seat sees it.
integer | null
Connection degree from the account.
string | null
The member’s public profile URL.
string | null
LinkedIn’s InMail restriction on this member,
NO_RESTRICTION when an InMail can be sent.object
{
"success": true,
"data": {
"unlocked": true,
"sales_profile_id": "ACwAAAstu10B6ONvINVM4_BzI_rFALPEOlLx7Ig",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAAstu10B6ONvINVM4_BzI_rFALPEOlLx7Ig,NAME_SEARCH,AbCd)",
"member_urn": "urn:li:member:187678557",
"full_name": "Jake Abrams",
"degree": 3,
"profile_url": "https://www.linkedin.com/in/abramsjake",
"inmail_restriction": "NO_RESTRICTION"
},
"metadata": {
"action": "unlock",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-10-12T14:02:11Z"
}
}
{
"success": false,
"error": {
"code": "CHANNEL_ERROR",
"message": "LinkedIn refused this Sales Nav request. The seat may have lost access, or the action is not permitted on this profile."
},
"metadata": {
"action": "unlock",
"credits_consumed": 1,
"timestamp": "2026-10-12T14:02:11Z"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "profile is required: a profile URL, slug, member id or Sales Nav lead reference"
},
"metadata": {
"action": "unlock",
"credits_consumed": 0,
"timestamp": "2026-10-12T14:02:11Z"
}
}
Was this page helpful?