Check InMail
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": {
"profiles": [
"<string>"
]
}
}
'import requests
url = "https://api.linkupapi.com/v2/profiles"
payload = {
"account_id": "<string>",
"action": "<string>",
"params": { "profiles": ["<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: {profiles: ['<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' => [
'profiles' => [
'<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 \"profiles\": [\n \"<string>\"\n ]\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 \"profiles\": [\n \"<string>\"\n ]\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 \"profiles\": [\n \"<string>\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"total_results": 2,
"inmail_free_count": 1,
"open_profile_badge_visible": true,
"results": [
{
"profile": "https://www.linkedin.com/in/jane-doe",
"status": "success",
"inmail_free": true,
"open_profile": true,
"inmail_restriction": "NO_RESTRICTION",
"premium": true,
"degree": 2,
"full_name": "Jane Doe",
"profile_url": "https://www.linkedin.com/in/jane-doe",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,name, )",
"member_urn": "urn:li:member:123456"
},
{
"profile": "john-smith",
"status": "success",
"inmail_free": false,
"open_profile": false,
"inmail_restriction": "NO_RESTRICTION",
"premium": false,
"degree": 3,
"full_name": "John Smith",
"profile_url": "https://www.linkedin.com/in/john-smith",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAB...,name, )",
"member_urn": "urn:li:member:654321"
}
]
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
{
"success": true,
"data": {
"total_results": 1,
"inmail_free_count": 0,
"open_profile_badge_visible": false,
"warning": "This Sales Navigator seat currently cannot see the Open Profile badge: LinkedIn reports every member as not open from it, so open_profile and inmail_free are not reliable in this response. Check these profiles from another seat, or probe the seat with profiles/check_inmail_seat.",
"results": [
{
"profile": "https://www.linkedin.com/in/jane-doe",
"status": "success",
"inmail_free": false,
"open_profile": false,
"inmail_restriction": "NO_RESTRICTION",
"premium": true,
"degree": 2,
"full_name": "Jane Doe",
"profile_url": "https://www.linkedin.com/in/jane-doe",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,name, )",
"member_urn": "urn:li:member:123456"
}
]
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
{
"success": false,
"error": {
"code": "CHANNEL_ERROR",
"message": "No Sales Nav license found for this account"
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
Profiles
Check InMail
Find out, for up to 100 profiles at once, who can be InMailed for free (Open Profile).
POST
/
v2
/
profiles
Check InMail
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": {
"profiles": [
"<string>"
]
}
}
'import requests
url = "https://api.linkupapi.com/v2/profiles"
payload = {
"account_id": "<string>",
"action": "<string>",
"params": { "profiles": ["<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: {profiles: ['<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' => [
'profiles' => [
'<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 \"profiles\": [\n \"<string>\"\n ]\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 \"profiles\": [\n \"<string>\"\n ]\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 \"profiles\": [\n \"<string>\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"total_results": 2,
"inmail_free_count": 1,
"open_profile_badge_visible": true,
"results": [
{
"profile": "https://www.linkedin.com/in/jane-doe",
"status": "success",
"inmail_free": true,
"open_profile": true,
"inmail_restriction": "NO_RESTRICTION",
"premium": true,
"degree": 2,
"full_name": "Jane Doe",
"profile_url": "https://www.linkedin.com/in/jane-doe",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,name, )",
"member_urn": "urn:li:member:123456"
},
{
"profile": "john-smith",
"status": "success",
"inmail_free": false,
"open_profile": false,
"inmail_restriction": "NO_RESTRICTION",
"premium": false,
"degree": 3,
"full_name": "John Smith",
"profile_url": "https://www.linkedin.com/in/john-smith",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAB...,name, )",
"member_urn": "urn:li:member:654321"
}
]
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
{
"success": true,
"data": {
"total_results": 1,
"inmail_free_count": 0,
"open_profile_badge_visible": false,
"warning": "This Sales Navigator seat currently cannot see the Open Profile badge: LinkedIn reports every member as not open from it, so open_profile and inmail_free are not reliable in this response. Check these profiles from another seat, or probe the seat with profiles/check_inmail_seat.",
"results": [
{
"profile": "https://www.linkedin.com/in/jane-doe",
"status": "success",
"inmail_free": false,
"open_profile": false,
"inmail_restriction": "NO_RESTRICTION",
"premium": true,
"degree": 2,
"full_name": "Jane Doe",
"profile_url": "https://www.linkedin.com/in/jane-doe",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,name, )",
"member_urn": "urn:li:member:123456"
}
]
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
{
"success": false,
"error": {
"code": "CHANNEL_ERROR",
"message": "No Sales Nav license found for this account"
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
Overview
An Open Profile member can be InMailed without spending an InMail credit, whatever the connection degree. This action checks a batch of profiles in one call and returns, for each one, whether the InMail is free, plus therecipient_urn needed to send it.
Uses the account’s Sales Nav seat — see Connect Account to activate it (it also auto-connects on first use).
This endpoint consumes 1 credit per 10 profiles checked. Requires a Sales Nav seat on the account. Ignore this if you’re on per-seat pricing: usage is unlimited.
LinkedIn hides the Open Profile badge from some seats (typically a seat on its monthly InMail limit): every member then looks “not open” from that seat. The API detects this by checking known Open Profiles on the same seat. When the seat is blind,
open_profile_badge_visible is false and a warning is included: open_profile and inmail_free keep LinkedIn’s raw value (false) but must not be trusted for that call. Check these profiles again from another seat, or use Check InMail Seat to know the seat’s state before batching.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
"check_inmail".object
required
Show params properties
Show params properties
string[]
required
Up to 100 profile references, in any mix of shapes: profile URL, vanity slug, member id (
ACoAA…), urn:li:fsd_profile:…, Sales Nav lead URL, Sales Nav id (ACwAA…) or urn:li:fs_salesProfile:(…). Each result echoes the reference you sent so you can match them back.Response
boolean
Indicates whether the request was successful.
object
Show data properties
Show data properties
integer
Number of profiles in
results.integer
How many of them can be InMailed for free.
boolean | null
Whether the seat that answered can see the Open Profile badge.
false means the open_profile / inmail_free values below are not reliable (see the warning above). null when it could not be determined; results are then LinkedIn’s raw values.string
Present only when
open_profile_badge_visible is false.array
One entry per requested profile, in the same order.
Show result properties
Show result properties
string
The reference you sent.
string
success, or error with a message (profile not found, could not be resolved).boolean
true when an InMail to this member costs no credit (Open Profile with no restriction).boolean
Whether the member is an Open Profile.
string
NO_RESTRICTION, or the restriction LinkedIn reports.boolean
Whether the member has a Premium account.
integer
Connection degree from the account.
string
Full name.
string
Standard profile URL.
string
urn:li:fs_salesProfile:(...) — pass it to Send Message to InMail this member.string
urn:li:member:….{
"success": true,
"data": {
"total_results": 2,
"inmail_free_count": 1,
"open_profile_badge_visible": true,
"results": [
{
"profile": "https://www.linkedin.com/in/jane-doe",
"status": "success",
"inmail_free": true,
"open_profile": true,
"inmail_restriction": "NO_RESTRICTION",
"premium": true,
"degree": 2,
"full_name": "Jane Doe",
"profile_url": "https://www.linkedin.com/in/jane-doe",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,name, )",
"member_urn": "urn:li:member:123456"
},
{
"profile": "john-smith",
"status": "success",
"inmail_free": false,
"open_profile": false,
"inmail_restriction": "NO_RESTRICTION",
"premium": false,
"degree": 3,
"full_name": "John Smith",
"profile_url": "https://www.linkedin.com/in/john-smith",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAB...,name, )",
"member_urn": "urn:li:member:654321"
}
]
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
{
"success": true,
"data": {
"total_results": 1,
"inmail_free_count": 0,
"open_profile_badge_visible": false,
"warning": "This Sales Navigator seat currently cannot see the Open Profile badge: LinkedIn reports every member as not open from it, so open_profile and inmail_free are not reliable in this response. Check these profiles from another seat, or probe the seat with profiles/check_inmail_seat.",
"results": [
{
"profile": "https://www.linkedin.com/in/jane-doe",
"status": "success",
"inmail_free": false,
"open_profile": false,
"inmail_restriction": "NO_RESTRICTION",
"premium": true,
"degree": 2,
"full_name": "Jane Doe",
"profile_url": "https://www.linkedin.com/in/jane-doe",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,name, )",
"member_urn": "urn:li:member:123456"
}
]
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
{
"success": false,
"error": {
"code": "CHANNEL_ERROR",
"message": "No Sales Nav license found for this account"
},
"metadata": {
"action": "check_inmail",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-09-23T09:33:51Z"
}
}
Example
{
"account_id": "your-account-id",
"action": "check_inmail",
"params": {
"profiles": [
"https://www.linkedin.com/in/jane-doe",
"john-smith",
"urn:li:fs_salesProfile:(ACwAAB...,name, )"
]
}
}
Was this page helpful?