LinkedIn
Mark a conversation as read or unread
Change the read state of one conversation in your LinkedIn inbox.
POST
/
linkedin
/
chat-read-status
Mark a conversation as read or unread
curl --request POST \
--url https://api.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"conversation_id": "REPLACE_WITH_CONVERSATION_ID",
"read": true
}
'import requests
url = "https://api.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status"
payload = {
"conversation_id": "REPLACE_WITH_CONVERSATION_ID",
"read": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({conversation_id: 'REPLACE_WITH_CONVERSATION_ID', read: true})
};
fetch('https://api.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status', 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.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status",
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([
'conversation_id' => 'REPLACE_WITH_CONVERSATION_ID',
'read' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status"
payload := strings.NewReader("{\n \"conversation_id\": \"REPLACE_WITH_CONVERSATION_ID\",\n \"read\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"conversation_id\": \"REPLACE_WITH_CONVERSATION_ID\",\n \"read\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"conversation_id\": \"REPLACE_WITH_CONVERSATION_ID\",\n \"read\": true\n}"
response = http.request(request)
puts response.read_body{
"org_linkedin_account_id": 4821,
"conversation_id": "example-conversation-id",
"read": true,
"unread_count_before": 2,
"updated": true
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}This changes your real LinkedIn inbox. Marking a conversation as read can also tell the other person you saw their message.
What this call does
| Live write: may send a read receipt | |
| Your CRM | None |
| Also | LinkedIn may refuse marking as unread |
| Repeating it | Safe to repeat. |
Good to know
- One conversation per call. Do not loop over your inbox: LinkedIn limits this action, at around 100 a day, and Groovin does not enforce that for you.
set_linkedin_chat_read_status.Authorizations
Your Groovin API key (gv_live_…), created in the extension under Settings, MCP and API.
Body
application/json
The conversation to change, from linkedin/conversation-attendees.
true marks it as read. false marks it as unread, which LinkedIn may refuse.
Leave this out to use your own LinkedIn account. Another person's account is refused with a 403.
Response
Success.
The chat's new state.
Groovin's id for the LinkedIn account this answer is about.
The chat that was changed.
The state you asked for.
Unread messages known just before the change. A hint, not proof of the previous state.
Always true on success.
⌘I
Mark a conversation as read or unread
curl --request POST \
--url https://api.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"conversation_id": "REPLACE_WITH_CONVERSATION_ID",
"read": true
}
'import requests
url = "https://api.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status"
payload = {
"conversation_id": "REPLACE_WITH_CONVERSATION_ID",
"read": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({conversation_id: 'REPLACE_WITH_CONVERSATION_ID', read: true})
};
fetch('https://api.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status', 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.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status",
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([
'conversation_id' => 'REPLACE_WITH_CONVERSATION_ID',
'read' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status"
payload := strings.NewReader("{\n \"conversation_id\": \"REPLACE_WITH_CONVERSATION_ID\",\n \"read\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"conversation_id\": \"REPLACE_WITH_CONVERSATION_ID\",\n \"read\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.groovin.ai/functions/v1/api/v1/linkedin/chat-read-status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"conversation_id\": \"REPLACE_WITH_CONVERSATION_ID\",\n \"read\": true\n}"
response = http.request(request)
puts response.read_body{
"org_linkedin_account_id": 4821,
"conversation_id": "example-conversation-id",
"read": true,
"unread_count_before": 2,
"updated": true
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}