List Inbox
curl --request POST \
--url https://api.linkupapi.com/v2/messages \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"account_id": "<string>",
"action": "<string>",
"params": {
"count": 123,
"category": "<string>",
"cursor": "<string>",
"sales_nav": true,
"unread_only": true
}
}
'import requests
url = "https://api.linkupapi.com/v2/messages"
payload = {
"account_id": "<string>",
"action": "<string>",
"params": {
"count": 123,
"category": "<string>",
"cursor": "<string>",
"sales_nav": True,
"unread_only": True
}
}
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: {
count: 123,
category: '<string>',
cursor: '<string>',
sales_nav: true,
unread_only: true
}
})
};
fetch('https://api.linkupapi.com/v2/messages', 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/messages",
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' => [
'count' => 123,
'category' => '<string>',
'cursor' => '<string>',
'sales_nav' => true,
'unread_only' => true
]
]),
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/messages"
payload := strings.NewReader("{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"count\": 123,\n \"category\": \"<string>\",\n \"cursor\": \"<string>\",\n \"sales_nav\": true,\n \"unread_only\": true\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/messages")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"count\": 123,\n \"category\": \"<string>\",\n \"cursor\": \"<string>\",\n \"sales_nav\": true,\n \"unread_only\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linkupapi.com/v2/messages")
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 \"count\": 123,\n \"category\": \"<string>\",\n \"cursor\": \"<string>\",\n \"sales_nav\": true,\n \"unread_only\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"conversations": [
{
"conversation_id": "urn:li:msg_conversation:(urn:li:fsd_profile:ACoAA...,2-MDZiY2ExOTgtM2NjNy00OTU4LTgyNjUtZWFlMmIwZjM1NTlmXzEwMA==)",
"participant": {
"name": "Jane Doe",
"headline": "Founder at Acme Corp",
"profile_url": "https://www.linkedin.com/in/jane-doe-42",
"profile_picture": "https://media.licdn.com/dms/image/v2/.../profile.jpg"
},
"last_message": {
"text": "Sounds good, talk soon!",
"time": 1777147641366,
"sender": {
"name": "Jane Doe",
"headline": "Founder at Acme Corp",
"profile_url": "https://www.linkedin.com/in/jane-doe-42",
"profile_picture": "https://media.licdn.com/dms/image/v2/.../profile.jpg",
"is_me": false
}
},
"unread": 0,
"type": "normal"
}
],
"total_results": 1,
"next_cursor": "REVTQ0VORElORyYxNzc0OTU4MDE2NjQzJjItWlRFMk1qazBaV1F0Wm1JMFlpMDBNR1k1TFRrMlptTXRaRGcwWVRjM05qUTJZakExWHpFd01BPT0="
},
"metadata": {
"action": "list_inbox",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-04-26T10:35:00Z"
}
}
{
"success": true,
"data": {
"conversations": [
{
"conversation_id": "2-OTQwMTJlODEtOTUxMy00NGNlLWIyNmQtMDJjYTU4MmQyMTcxXzEwMA==",
"participant": {
"name": "Jessica Jensen",
"first_name": "Jessica",
"last_name": "Jensen",
"profile_url": "https://www.linkedin.com/in/ACwAAA...",
"sales_nav_url": "https://www.linkedin.com/sales/lead/ACwAAA...",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,NAME_SEARCH,JUf-)",
"profile_picture": "https://media.licdn.com/...",
"connection_level": "2",
"is_me": false
},
"last_message": {
"text": "Thanks for reaching out. I'd like to learn more.",
"time": 1785236943298,
"subject": "Quick question",
"sender": {
"name": "Jessica Jensen",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,NAME_SEARCH,JUf-)",
"is_me": false
}
},
"unread": 0,
"type": "inmail",
"total_message_count": 8,
"archived": false
}
],
"total_results": 1,
"next_cursor": "1785228162040"
},
"metadata": {
"action": "list_inbox",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-04-28T12:00:00Z"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "account_id is required."
},
"metadata": {
"action": "list_inbox",
"account_id": null,
"credits_consumed": 0,
"timestamp": "2026-04-26T10:35:00Z"
}
}
Messaging
List Inbox
Retrieve a list of conversations from the inbox.
POST
/
v2
/
messages
List Inbox
curl --request POST \
--url https://api.linkupapi.com/v2/messages \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"account_id": "<string>",
"action": "<string>",
"params": {
"count": 123,
"category": "<string>",
"cursor": "<string>",
"sales_nav": true,
"unread_only": true
}
}
'import requests
url = "https://api.linkupapi.com/v2/messages"
payload = {
"account_id": "<string>",
"action": "<string>",
"params": {
"count": 123,
"category": "<string>",
"cursor": "<string>",
"sales_nav": True,
"unread_only": True
}
}
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: {
count: 123,
category: '<string>',
cursor: '<string>',
sales_nav: true,
unread_only: true
}
})
};
fetch('https://api.linkupapi.com/v2/messages', 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/messages",
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' => [
'count' => 123,
'category' => '<string>',
'cursor' => '<string>',
'sales_nav' => true,
'unread_only' => true
]
]),
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/messages"
payload := strings.NewReader("{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"count\": 123,\n \"category\": \"<string>\",\n \"cursor\": \"<string>\",\n \"sales_nav\": true,\n \"unread_only\": true\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/messages")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"<string>\",\n \"action\": \"<string>\",\n \"params\": {\n \"count\": 123,\n \"category\": \"<string>\",\n \"cursor\": \"<string>\",\n \"sales_nav\": true,\n \"unread_only\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linkupapi.com/v2/messages")
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 \"count\": 123,\n \"category\": \"<string>\",\n \"cursor\": \"<string>\",\n \"sales_nav\": true,\n \"unread_only\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"conversations": [
{
"conversation_id": "urn:li:msg_conversation:(urn:li:fsd_profile:ACoAA...,2-MDZiY2ExOTgtM2NjNy00OTU4LTgyNjUtZWFlMmIwZjM1NTlmXzEwMA==)",
"participant": {
"name": "Jane Doe",
"headline": "Founder at Acme Corp",
"profile_url": "https://www.linkedin.com/in/jane-doe-42",
"profile_picture": "https://media.licdn.com/dms/image/v2/.../profile.jpg"
},
"last_message": {
"text": "Sounds good, talk soon!",
"time": 1777147641366,
"sender": {
"name": "Jane Doe",
"headline": "Founder at Acme Corp",
"profile_url": "https://www.linkedin.com/in/jane-doe-42",
"profile_picture": "https://media.licdn.com/dms/image/v2/.../profile.jpg",
"is_me": false
}
},
"unread": 0,
"type": "normal"
}
],
"total_results": 1,
"next_cursor": "REVTQ0VORElORyYxNzc0OTU4MDE2NjQzJjItWlRFMk1qazBaV1F0Wm1JMFlpMDBNR1k1TFRrMlptTXRaRGcwWVRjM05qUTJZakExWHpFd01BPT0="
},
"metadata": {
"action": "list_inbox",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-04-26T10:35:00Z"
}
}
{
"success": true,
"data": {
"conversations": [
{
"conversation_id": "2-OTQwMTJlODEtOTUxMy00NGNlLWIyNmQtMDJjYTU4MmQyMTcxXzEwMA==",
"participant": {
"name": "Jessica Jensen",
"first_name": "Jessica",
"last_name": "Jensen",
"profile_url": "https://www.linkedin.com/in/ACwAAA...",
"sales_nav_url": "https://www.linkedin.com/sales/lead/ACwAAA...",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,NAME_SEARCH,JUf-)",
"profile_picture": "https://media.licdn.com/...",
"connection_level": "2",
"is_me": false
},
"last_message": {
"text": "Thanks for reaching out. I'd like to learn more.",
"time": 1785236943298,
"subject": "Quick question",
"sender": {
"name": "Jessica Jensen",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,NAME_SEARCH,JUf-)",
"is_me": false
}
},
"unread": 0,
"type": "inmail",
"total_message_count": 8,
"archived": false
}
],
"total_results": 1,
"next_cursor": "1785228162040"
},
"metadata": {
"action": "list_inbox",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-04-28T12:00:00Z"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "account_id is required."
},
"metadata": {
"action": "list_inbox",
"account_id": null,
"credits_consumed": 0,
"timestamp": "2026-04-26T10:35:00Z"
}
}
Overview
Returns a paginated list of conversations from the inbox. Filter by category and paginate with thenext_cursor value.
This endpoint consumes 1 credit per 10 results returned. The platform returns up to 25 conversations per internal request, so larger
total_results values trigger multiple upstream calls automatically. Ignore this 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.
string
required
Must be
"list_inbox".object
Show params properties
Show params properties
integer
default:10
Maximum number of conversations to return. Defaults to
10.string
default:"INBOX"
Filter conversations by category. One of:
"INBOX", "UNREAD", "MY_CONNECTIONS", "INMAIL", "STARRED". Defaults to "INBOX".string
Cursor returned by a previous response as
data.next_cursor. Omit for the first page.boolean
default:false
Read the Sales Nav inbox instead of the classic one. See Sales Nav inbox below.
boolean
default:false
(Email) Only return unread emails.
Works for email mailboxes too — the response keeps the same shape (
conversations / total_results), each email mapped to a conversation. See Email inbox below.Response
boolean
Indicates whether the request was successful.
object
Show data properties
Show data properties
array
List of conversation objects.
Show conversation properties
Show conversation properties
string
Unique identifier of the conversation. Treat it as an opaque string and pass it back exactly as returned.
object
The other side of the conversation. Can be a member, a company page, or — for notes-to-self — your own profile.
Show participant properties
Show participant properties
string
Display name (member full name or company name).
string
Headline (or company tagline if
is_organization).string
Public profile URL (or company page URL if
is_organization).string
Profile picture URL (or company logo if
is_organization).boolean
Present and
true when the participant is a company page (e.g. sponsored premium direct messages, brand outreach). Absent for human members.object
The most recent message in the conversation.
Show last_message properties
Show last_message properties
string
Plain-text content of the message.
integer
Unix epoch timestamp in milliseconds when the message was sent.
integer
Number of unread messages in the conversation.
0 when fully read.string
Conversation type. Common values:
"normal", "inmail", "Sponsored".integer
Number of conversations returned in this response.
string
Cursor to send as
next_cursor in the next request to resume pagination. null when the end is reached.object
Sales Nav inbox
InMail threads live in a separate store and never appear in the classic inbox. Setsales_nav: true to read them. Same envelope and paging, with:
conversation_id= the Sales Nav thread id, also returned asthreadIdby Send Message. Only usable withsales_nav: true— the two id spaces are not interchangeable.participant/last_message.senderaddrecipient_urn,sales_nav_url,connection_level,first_name,last_name; noheadline- extra:
total_message_count,archived,last_message.subject
{
"success": true,
"data": {
"conversations": [
{
"conversation_id": "urn:li:msg_conversation:(urn:li:fsd_profile:ACoAA...,2-MDZiY2ExOTgtM2NjNy00OTU4LTgyNjUtZWFlMmIwZjM1NTlmXzEwMA==)",
"participant": {
"name": "Jane Doe",
"headline": "Founder at Acme Corp",
"profile_url": "https://www.linkedin.com/in/jane-doe-42",
"profile_picture": "https://media.licdn.com/dms/image/v2/.../profile.jpg"
},
"last_message": {
"text": "Sounds good, talk soon!",
"time": 1777147641366,
"sender": {
"name": "Jane Doe",
"headline": "Founder at Acme Corp",
"profile_url": "https://www.linkedin.com/in/jane-doe-42",
"profile_picture": "https://media.licdn.com/dms/image/v2/.../profile.jpg",
"is_me": false
}
},
"unread": 0,
"type": "normal"
}
],
"total_results": 1,
"next_cursor": "REVTQ0VORElORyYxNzc0OTU4MDE2NjQzJjItWlRFMk1qazBaV1F0Wm1JMFlpMDBNR1k1TFRrMlptTXRaRGcwWVRjM05qUTJZakExWHpFd01BPT0="
},
"metadata": {
"action": "list_inbox",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-04-26T10:35:00Z"
}
}
{
"success": true,
"data": {
"conversations": [
{
"conversation_id": "2-OTQwMTJlODEtOTUxMy00NGNlLWIyNmQtMDJjYTU4MmQyMTcxXzEwMA==",
"participant": {
"name": "Jessica Jensen",
"first_name": "Jessica",
"last_name": "Jensen",
"profile_url": "https://www.linkedin.com/in/ACwAAA...",
"sales_nav_url": "https://www.linkedin.com/sales/lead/ACwAAA...",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,NAME_SEARCH,JUf-)",
"profile_picture": "https://media.licdn.com/...",
"connection_level": "2",
"is_me": false
},
"last_message": {
"text": "Thanks for reaching out. I'd like to learn more.",
"time": 1785236943298,
"subject": "Quick question",
"sender": {
"name": "Jessica Jensen",
"recipient_urn": "urn:li:fs_salesProfile:(ACwAAA...,NAME_SEARCH,JUf-)",
"is_me": false
}
},
"unread": 0,
"type": "inmail",
"total_message_count": 8,
"archived": false
}
],
"total_results": 1,
"next_cursor": "1785228162040"
},
"metadata": {
"action": "list_inbox",
"account_id": "your-account-id",
"credits_consumed": 1,
"timestamp": "2026-04-28T12:00:00Z"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "account_id is required."
},
"metadata": {
"action": "list_inbox",
"account_id": null,
"credits_consumed": 0,
"timestamp": "2026-04-26T10:35:00Z"
}
}
Email inbox
For an email mailbox,list_inbox returns the same structure (conversations / total_results / next_cursor) — each email is mapped to a conversation. Differences:
conversation_idis the thread id (Gmail) — pass it to Get Conversation to fetch the full thread.idis the provider message id — use it withmark_as_read/mark_as_unread/archive/trashand attachment download.participantandlast_message.sendercarry{ name, email }(noprofile_url/headline).last_messageaddssubject;textis the body snippet.- Extra per-item fields:
message_id,in_reply_to,is_bounce,has_attachments.
unread_only, label_ids (read a folder other than INBOX — see list_labels), and cursor pagination (cursor in, next_cursor out) — same model as LinkedIn (Gmail has no offset).
200 (email)
{
"success": true,
"data": {
"conversations": [
{
"conversation_id": "1a09b5fe5c04c6d6",
"id": "1a09b5fe5c04c6d6",
"participant": { "name": "John Doe", "email": "john@example.com" },
"last_message": {
"text": "Sure, let's chat Thursday.",
"subject": "Re: Quick question",
"time": 1789398178000,
"sender": { "name": "John Doe", "email": "john@example.com", "is_me": false }
},
"unread": 1,
"type": "email",
"message_id": "<CAF...@mail.gmail.com>",
"in_reply_to": "<178928915191...@gmail.com>",
"is_bounce": false,
"has_attachments": false
}
],
"total_results": 1,
"next_cursor": "MDA2MjQxMDE2Mzc1MTEyNDY3MzE="
},
"metadata": { "action": "list_inbox", "account_id": "your-email-account-id", "credits_consumed": 1, "timestamp": "2026-09-14T12:00:00Z" }
}
Search (email)
action: "search" searches the whole mailbox and returns the same shape (conversations / total_results / next_cursor). Pass query (Gmail accepts its native syntax, e.g. from:john subject:invoice). Works on Gmail, Outlook and IMAP. Cursor pagination applies.
Request
{ "account_id": "your-email-account-id", "action": "search", "params": { "query": "invoice from:john", "count": 20 } }
Was this page helpful?