curl --request POST \
--url https://app.gtm-api.com/linkedin/v4/api/antidetect-browsers/generate-cloud-browser-access-key \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Team-SID: <api-key>' \
--data '
{
"sid": "<string>",
"ttl_hours": 360,
"max_connects": 500,
"allowed_ips": [
"<string>"
],
"allowed_countries": [
"<string>"
],
"send_to_email": "jsmith@example.com"
}
'import requests
url = "https://app.gtm-api.com/linkedin/v4/api/antidetect-browsers/generate-cloud-browser-access-key"
payload = {
"sid": "<string>",
"ttl_hours": 360,
"max_connects": 500,
"allowed_ips": ["<string>"],
"allowed_countries": ["<string>"],
"send_to_email": "jsmith@example.com"
}
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({
sid: '<string>',
ttl_hours: 360,
max_connects: 500,
allowed_ips: ['<string>'],
allowed_countries: ['<string>'],
send_to_email: 'jsmith@example.com'
})
};
fetch('https://app.gtm-api.com/linkedin/v4/api/antidetect-browsers/generate-cloud-browser-access-key', 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/antidetect-browsers/generate-cloud-browser-access-key",
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([
'sid' => '<string>',
'ttl_hours' => 360,
'max_connects' => 500,
'allowed_ips' => [
'<string>'
],
'allowed_countries' => [
'<string>'
],
'send_to_email' => 'jsmith@example.com'
]),
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/antidetect-browsers/generate-cloud-browser-access-key"
payload := strings.NewReader("{\n \"sid\": \"<string>\",\n \"ttl_hours\": 360,\n \"max_connects\": 500,\n \"allowed_ips\": [\n \"<string>\"\n ],\n \"allowed_countries\": [\n \"<string>\"\n ],\n \"send_to_email\": \"jsmith@example.com\"\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/antidetect-browsers/generate-cloud-browser-access-key")
.header("Authorization", "Bearer <token>")
.header("Team-SID", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"sid\": \"<string>\",\n \"ttl_hours\": 360,\n \"max_connects\": 500,\n \"allowed_ips\": [\n \"<string>\"\n ],\n \"allowed_countries\": [\n \"<string>\"\n ],\n \"send_to_email\": \"jsmith@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.gtm-api.com/linkedin/v4/api/antidetect-browsers/generate-cloud-browser-access-key")
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 \"sid\": \"<string>\",\n \"ttl_hours\": 360,\n \"max_connects\": 500,\n \"allowed_ips\": [\n \"<string>\"\n ],\n \"allowed_countries\": [\n \"<string>\"\n ],\n \"send_to_email\": \"jsmith@example.com\"\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>",
"automation_server_sid": "<string>",
"account_share_sid": "<string>",
"share_role": "owner",
"vendor_provider": "gologin",
"vendor_name": "<string>",
"vendor_profile_id": "<string>",
"browser_owner": "platform",
"status": "stopped",
"error_reason": "<string>",
"fail_count": 123,
"last_fail_at": "<string>",
"logout_count": 123,
"last_logout_at": "<string>",
"last_start_at": "<string>",
"last_health_check_at": "<string>",
"last_activity_at": "<string>",
"antidetect_browser_proxy_sid": "<string>",
"proxy_country_code": "<string>",
"custom_proxy": {
"ip": "<string>",
"port": 123,
"mode": "<string>",
"username": "<string>",
"exit_ip": "<string>",
"latency_ms": 123
},
"proxy_5g": true,
"cloud_browser_access": [
{
"key": "<string>",
"expires_at": "<string>",
"max_connects": 123,
"allowed_ips": [
"<string>"
],
"allowed_countries": [
"<string>"
],
"purpose": "relogin"
}
],
"vendor_profile_shares": [
{
"email": "<string>",
"role": "<string>",
"shared_at": "<string>",
"shared_by": "<string>",
"vendor_share_id": "<string>"
}
],
"created_by": {
"actor_type": "user",
"actor_sid": "<string>",
"team_sid": "<string>",
"permissions": {},
"actor_name": "<string>",
"oauth_client_sid": "<string>",
"reason": "<string>",
"cluster_id": 123,
"trace_id": "<string>"
},
"deleted_by": {
"actor_type": "user",
"actor_sid": "<string>",
"team_sid": "<string>",
"permissions": {},
"actor_name": "<string>",
"oauth_client_sid": "<string>",
"reason": "<string>",
"cluster_id": 123,
"trace_id": "<string>"
},
"created_at": "<string>",
"updated_at": "<string>",
"deleted_at": "<string>"
},
"result": {
"access_key": {
"key": "<string>",
"expires_at": "<string>",
"max_connects": 123,
"allowed_ips": [
"<string>"
],
"allowed_countries": [
"<string>"
],
"purpose": "relogin"
},
"public_connect_url": "<string>",
"sent_to_email": "<string>"
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"team_sid": "<string>",
"actor_type": "<string>"
}
}{
"success": false,
"error": {
"code": "validation_failed",
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"severity": "hard",
"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,
"team_sid": "<string>",
"actor_type": "<string>"
}
}{
"success": false,
"error": {
"code": "validation_failed",
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"severity": "hard",
"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,
"team_sid": "<string>",
"actor_type": "<string>"
}
}Generate cloud-browser access key
Mint a cloud-browser access key (smart-link) on a browser. Returns the whole minted entry in result.access_key, whose key field is the raw cb_ak_ token (shown once), AND result.public_connect_url, the ready-to-share link to hand to whoever opens it (no platform account needed on their side). Pass result.access_key.key, never result.access_key, to revoke_cloud_browser_access_key. purpose decides what the page behind the link does: relogin walks them through signing the LinkedIn session back in and re-binds the browser once they confirm, share just hands them the browser to drive. Optional ttl_hours / max_connects / allowed_ips / allowed_countries scope the key; send_to_email also mails the link to whoever holds the LinkedIn password (a fixed mail, no text to supply). DANGEROUS: both the key and the link are bearer secrets granting remote browser access.
Contract:
- MCP tool
generate_cloud_browser_access_key, registry packagemcp.linkedin/antidetect_browsers, mountlinkedin.browsers. - 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/antidetect-browsers/generate-cloud-browser-access-key \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Team-SID: <api-key>' \
--data '
{
"sid": "<string>",
"ttl_hours": 360,
"max_connects": 500,
"allowed_ips": [
"<string>"
],
"allowed_countries": [
"<string>"
],
"send_to_email": "jsmith@example.com"
}
'import requests
url = "https://app.gtm-api.com/linkedin/v4/api/antidetect-browsers/generate-cloud-browser-access-key"
payload = {
"sid": "<string>",
"ttl_hours": 360,
"max_connects": 500,
"allowed_ips": ["<string>"],
"allowed_countries": ["<string>"],
"send_to_email": "jsmith@example.com"
}
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({
sid: '<string>',
ttl_hours: 360,
max_connects: 500,
allowed_ips: ['<string>'],
allowed_countries: ['<string>'],
send_to_email: 'jsmith@example.com'
})
};
fetch('https://app.gtm-api.com/linkedin/v4/api/antidetect-browsers/generate-cloud-browser-access-key', 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/antidetect-browsers/generate-cloud-browser-access-key",
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([
'sid' => '<string>',
'ttl_hours' => 360,
'max_connects' => 500,
'allowed_ips' => [
'<string>'
],
'allowed_countries' => [
'<string>'
],
'send_to_email' => 'jsmith@example.com'
]),
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/antidetect-browsers/generate-cloud-browser-access-key"
payload := strings.NewReader("{\n \"sid\": \"<string>\",\n \"ttl_hours\": 360,\n \"max_connects\": 500,\n \"allowed_ips\": [\n \"<string>\"\n ],\n \"allowed_countries\": [\n \"<string>\"\n ],\n \"send_to_email\": \"jsmith@example.com\"\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/antidetect-browsers/generate-cloud-browser-access-key")
.header("Authorization", "Bearer <token>")
.header("Team-SID", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"sid\": \"<string>\",\n \"ttl_hours\": 360,\n \"max_connects\": 500,\n \"allowed_ips\": [\n \"<string>\"\n ],\n \"allowed_countries\": [\n \"<string>\"\n ],\n \"send_to_email\": \"jsmith@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.gtm-api.com/linkedin/v4/api/antidetect-browsers/generate-cloud-browser-access-key")
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 \"sid\": \"<string>\",\n \"ttl_hours\": 360,\n \"max_connects\": 500,\n \"allowed_ips\": [\n \"<string>\"\n ],\n \"allowed_countries\": [\n \"<string>\"\n ],\n \"send_to_email\": \"jsmith@example.com\"\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>",
"automation_server_sid": "<string>",
"account_share_sid": "<string>",
"share_role": "owner",
"vendor_provider": "gologin",
"vendor_name": "<string>",
"vendor_profile_id": "<string>",
"browser_owner": "platform",
"status": "stopped",
"error_reason": "<string>",
"fail_count": 123,
"last_fail_at": "<string>",
"logout_count": 123,
"last_logout_at": "<string>",
"last_start_at": "<string>",
"last_health_check_at": "<string>",
"last_activity_at": "<string>",
"antidetect_browser_proxy_sid": "<string>",
"proxy_country_code": "<string>",
"custom_proxy": {
"ip": "<string>",
"port": 123,
"mode": "<string>",
"username": "<string>",
"exit_ip": "<string>",
"latency_ms": 123
},
"proxy_5g": true,
"cloud_browser_access": [
{
"key": "<string>",
"expires_at": "<string>",
"max_connects": 123,
"allowed_ips": [
"<string>"
],
"allowed_countries": [
"<string>"
],
"purpose": "relogin"
}
],
"vendor_profile_shares": [
{
"email": "<string>",
"role": "<string>",
"shared_at": "<string>",
"shared_by": "<string>",
"vendor_share_id": "<string>"
}
],
"created_by": {
"actor_type": "user",
"actor_sid": "<string>",
"team_sid": "<string>",
"permissions": {},
"actor_name": "<string>",
"oauth_client_sid": "<string>",
"reason": "<string>",
"cluster_id": 123,
"trace_id": "<string>"
},
"deleted_by": {
"actor_type": "user",
"actor_sid": "<string>",
"team_sid": "<string>",
"permissions": {},
"actor_name": "<string>",
"oauth_client_sid": "<string>",
"reason": "<string>",
"cluster_id": 123,
"trace_id": "<string>"
},
"created_at": "<string>",
"updated_at": "<string>",
"deleted_at": "<string>"
},
"result": {
"access_key": {
"key": "<string>",
"expires_at": "<string>",
"max_connects": 123,
"allowed_ips": [
"<string>"
],
"allowed_countries": [
"<string>"
],
"purpose": "relogin"
},
"public_connect_url": "<string>",
"sent_to_email": "<string>"
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"team_sid": "<string>",
"actor_type": "<string>"
}
}{
"success": false,
"error": {
"code": "validation_failed",
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"severity": "hard",
"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,
"team_sid": "<string>",
"actor_type": "<string>"
}
}{
"success": false,
"error": {
"code": "validation_failed",
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"severity": "hard",
"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,
"team_sid": "<string>",
"actor_type": "<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 generate_cloud_browser_access_key.
Antidetect browser sid (ab_br_…).
18^ab_br_Key lifetime in hours (default 8; the link is a bearer secret, keep it short). Sets expires_at on the entry.
1 <= x <= 720Cap on CONCURRENT sessions held on this key, counted live at connect. Not a lifetime quota: a key does not spend itself and never becomes exhausted. Omit for unlimited.
1 <= x <= 1000IP allow-list checked at connect time.
45ISO country allow-list checked at connect time.
2What the page behind the link does: relogin = sign the LinkedIn session back in and re-bind the browser on confirm (default); share = drive the browser, no sign-in step; recruiter_relogin = the relogin flow aimed at LinkedIn Recruiter (2026-09-15): the cloud browser opens on linkedin.com/talent so the seat holder signs the Recruiter session back in, and the confirmed restart re-checks the account's recruiter_status.
relogin, recruiter_relogin, share Also email the link to this address, typically the person who holds the LinkedIn password and has no account on the platform. The mail is queued after the key is committed; result.sent_to_email echoes the address. A malformed address is 422 and mints nothing.
255Response
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