curl --request POST \
--url https://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Team-SID: <api-key>' \
--data '
{
"linkedin_account_sid": "<string>",
"attendees": [
{
"ln_id": "<string>",
"sn_id": "<string>"
}
],
"text": "<string>",
"conversation_title": "<string>",
"attachments": [
{
"name": "<string>",
"path": "<string>",
"size": 1
}
]
}
'import requests
url = "https://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group"
payload = {
"linkedin_account_sid": "<string>",
"attendees": [
{
"ln_id": "<string>",
"sn_id": "<string>"
}
],
"text": "<string>",
"conversation_title": "<string>",
"attachments": [
{
"name": "<string>",
"path": "<string>",
"size": 1
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Team-SID": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'Team-SID': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
linkedin_account_sid: '<string>',
attendees: [{ln_id: '<string>', sn_id: '<string>'}],
text: '<string>',
conversation_title: '<string>',
attachments: [{name: '<string>', path: '<string>', size: 1}]
})
};
fetch('https://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group', 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://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group",
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([
'linkedin_account_sid' => '<string>',
'attendees' => [
[
'ln_id' => '<string>',
'sn_id' => '<string>'
]
],
'text' => '<string>',
'conversation_title' => '<string>',
'attachments' => [
[
'name' => '<string>',
'path' => '<string>',
'size' => 1
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Team-SID: <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://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group"
payload := strings.NewReader("{\n \"linkedin_account_sid\": \"<string>\",\n \"attendees\": [\n {\n \"ln_id\": \"<string>\",\n \"sn_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\",\n \"conversation_title\": \"<string>\",\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"path\": \"<string>\",\n \"size\": 1\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Team-SID", "<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://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group")
.header("Authorization", "Bearer <token>")
.header("Team-SID", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"linkedin_account_sid\": \"<string>\",\n \"attendees\": [\n {\n \"ln_id\": \"<string>\",\n \"sn_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\",\n \"conversation_title\": \"<string>\",\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"path\": \"<string>\",\n \"size\": 1\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Team-SID"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"linkedin_account_sid\": \"<string>\",\n \"attendees\": [\n {\n \"ln_id\": \"<string>\",\n \"sn_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\",\n \"conversation_title\": \"<string>\",\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"path\": \"<string>\",\n \"size\": 1\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"operation": "action",
"action": "<string>",
"item": {
"sid": "<string>",
"team_sid": "<string>",
"linkedin_account_sid": "<string>",
"linkedin_conversation_sid": "<string>",
"ln_member_id": "<string>",
"ln_id": "<string>",
"sn_id": "<string>",
"nickname": "<string>",
"subject": "<string>",
"text": "<string>",
"attachments": [
{
"id": "<string>",
"urn": "<string>",
"name": "<string>",
"content_type": "<string>",
"content_url": "<string>",
"file_byte_size": 123,
"path": "<string>",
"size": 123
}
],
"reactions": [
{
"emoji": "<string>",
"count": 123,
"is_viewer_reacted": true,
"first_reacted_at": "<string>"
}
],
"message_hash": "<string>",
"sent_at": "<string>",
"custom_content": {},
"created_at": "<string>",
"updated_at": "<string>",
"deleted_at": "<string>"
},
"result": {},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"debug_url": "<string>"
},
"credits": {
"charged": 1,
"balance_after": 1
}
}{
"success": false,
"error": {
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"description": "<string>",
"entity_sid": "<string>",
"resolution": "<string>",
"resolution_hint": "<string>",
"count": 123
}
],
"context": {}
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"debug_url": "<string>"
}
}{
"success": false,
"error": {
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"description": "<string>",
"entity_sid": "<string>",
"resolution": "<string>",
"resolution_hint": "<string>",
"count": 123
}
],
"context": {}
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"debug_url": "<string>"
}
}Start group conversation
Start a new multi-attendee (group) chat on the basic messenger and send an opening message (outward action). Provide the executor account, 2..20 attendee URNs and the opening body (1..8000 chars, optional attachments, optional conversation_title to name the group); mints the group thread and dispatches the first message. Spends the messaging_general bucket.
Contract:
- MCP tool
start_linkedin_group_conversation, registry packagemcp.linkedin/linkedin_messages, mountlinkedin.messaging. - Operation
action, response envelopeaction. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.
curl --request POST \
--url https://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Team-SID: <api-key>' \
--data '
{
"linkedin_account_sid": "<string>",
"attendees": [
{
"ln_id": "<string>",
"sn_id": "<string>"
}
],
"text": "<string>",
"conversation_title": "<string>",
"attachments": [
{
"name": "<string>",
"path": "<string>",
"size": 1
}
]
}
'import requests
url = "https://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group"
payload = {
"linkedin_account_sid": "<string>",
"attendees": [
{
"ln_id": "<string>",
"sn_id": "<string>"
}
],
"text": "<string>",
"conversation_title": "<string>",
"attachments": [
{
"name": "<string>",
"path": "<string>",
"size": 1
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Team-SID": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'Team-SID': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
linkedin_account_sid: '<string>',
attendees: [{ln_id: '<string>', sn_id: '<string>'}],
text: '<string>',
conversation_title: '<string>',
attachments: [{name: '<string>', path: '<string>', size: 1}]
})
};
fetch('https://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group', 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://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group",
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([
'linkedin_account_sid' => '<string>',
'attendees' => [
[
'ln_id' => '<string>',
'sn_id' => '<string>'
]
],
'text' => '<string>',
'conversation_title' => '<string>',
'attachments' => [
[
'name' => '<string>',
'path' => '<string>',
'size' => 1
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Team-SID: <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://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group"
payload := strings.NewReader("{\n \"linkedin_account_sid\": \"<string>\",\n \"attendees\": [\n {\n \"ln_id\": \"<string>\",\n \"sn_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\",\n \"conversation_title\": \"<string>\",\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"path\": \"<string>\",\n \"size\": 1\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Team-SID", "<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://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group")
.header("Authorization", "Bearer <token>")
.header("Team-SID", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"linkedin_account_sid\": \"<string>\",\n \"attendees\": [\n {\n \"ln_id\": \"<string>\",\n \"sn_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\",\n \"conversation_title\": \"<string>\",\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"path\": \"<string>\",\n \"size\": 1\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.gtm-api.com/linkedin/v4/api/linkedin-messages/start-group")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Team-SID"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"linkedin_account_sid\": \"<string>\",\n \"attendees\": [\n {\n \"ln_id\": \"<string>\",\n \"sn_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\",\n \"conversation_title\": \"<string>\",\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"path\": \"<string>\",\n \"size\": 1\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"operation": "action",
"action": "<string>",
"item": {
"sid": "<string>",
"team_sid": "<string>",
"linkedin_account_sid": "<string>",
"linkedin_conversation_sid": "<string>",
"ln_member_id": "<string>",
"ln_id": "<string>",
"sn_id": "<string>",
"nickname": "<string>",
"subject": "<string>",
"text": "<string>",
"attachments": [
{
"id": "<string>",
"urn": "<string>",
"name": "<string>",
"content_type": "<string>",
"content_url": "<string>",
"file_byte_size": 123,
"path": "<string>",
"size": 123
}
],
"reactions": [
{
"emoji": "<string>",
"count": 123,
"is_viewer_reacted": true,
"first_reacted_at": "<string>"
}
],
"message_hash": "<string>",
"sent_at": "<string>",
"custom_content": {},
"created_at": "<string>",
"updated_at": "<string>",
"deleted_at": "<string>"
},
"result": {},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"debug_url": "<string>"
},
"credits": {
"charged": 1,
"balance_after": 1
}
}{
"success": false,
"error": {
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"description": "<string>",
"entity_sid": "<string>",
"resolution": "<string>",
"resolution_hint": "<string>",
"count": 123
}
],
"context": {}
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"debug_url": "<string>"
}
}{
"success": false,
"error": {
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"description": "<string>",
"entity_sid": "<string>",
"resolution": "<string>",
"resolution_hint": "<string>",
"count": 123
}
],
"context": {}
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"debug_url": "<string>"
}
}Authorizations
Access token issued by gtm.service.id. Its access_identity claim carries team_sid, actor_sid and actor_type, and that team scope is authoritative.
Team scope for tokens that do not carry one. Ignored when the token already names a team.
Body
Request body of start_linkedin_group_conversation.
LinkedIn account sid (ln_ac_…).
18^ln_ac_2..20 other participants; each needs a URN.
2 - 20 elementsShow child attributes
Show child attributes
Opening message; 1..8000 chars.
1 - 8000Optional group name, max 100 chars; omitted leaves the thread unnamed.
100Each .path must be an https:// URL.
Show child attributes
Show child attributes
Response
action success envelope.
true action kebab-case verb; matches the route segment.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes