Integration

gtm-api integration

gtm-api runs LinkedIn outreach on LinkedIn accounts you own and connected in the gtm-api app (each runs in its own hosted browser, with daily limits and pacing enforced server-side). Send connection requests, messages, InMails, Sales Navigator and Recruiter messages; accept or ignore invitations; publish posts, comments, reposts and reactions; follow members; scrape LinkedIn and Sales Navigator people, company, post and job searches, company employees and post engagement; enrich person and company profiles, including contact info visible to a 1st-degree connection; read your connections, invitations, conversations, messages and followers; run saved auto-scrapes. Sends act on LinkedIn for real; each send takes a client_reference so a repeat is never sent twice. Not exposed: the identity and billing service (users, teams, API keys, subscriptions), the orchestration service (webhooks and mass actions), antidetect browsers, proxies and cloud-browser sessions, account settings and profile edits, smart-limit changes, sync controls, voice messages and attachment downloads, Recruiter projects, and the raw LinkedIn request escape hatch. Invitation shared secrets are withheld. Authentication is a gtm-api API key (gtm_live_...), created in the app or through the ID API, sent as a Bearer token; keys are team-scoped.

Ask it in chat

Say what should happen.
The workflow builds itself.

When this happens, do that in gtm-api.Built from the 78 gtm-api tools below, on the connection you add once.

What you can do with gtm-api

Each of these is one operation on one endpoint, available both as a workflow step and as a tool an AI agent can call on its own. Nothing bundles several operations into one action, so what a run did stays readable afterwards.

Each badge shows the default agent permission of an endpoint (allowed: an agent calls it without asking; ask first: you are asked before an agent calls it, when the agent or chat asks permission for sensitive actions; never: no agent may call it), which every user can change endpoint by endpoint in their credential settings.

Most endpoints run on the free plan. A few, mainly the ones that publish on your behalf, need a paid plan.

Search, 12 operations

  • search_data_requestsSearch data requestsPOSTAgents: ask firstList/filter the request history: what was asked, where it ran, what came from cache.
  • search_linkedin_accountsSearch linkedin accountsPOSTAgents: ask firstList LinkedIn accounts (senders) on the team with operator filters, sort and cursor pagination, plus an always-present counts block (total, premium / SN / Recruiter, active_today, stale, signed_out).
  • search_linkedin_account_smart_limitsSearch linkedin account smart limitsPOSTAgents: ask firstList per-limit_type policy rows (one account owns 15 public buckets: send_connection_requests, send_messages, send_inmails, scraping, enrichment, custom_request, …) with filters, sorting.
  • search_linkedin_auto_scrape_resultsSearch linkedin auto scrape resultsPOSTAgents: ask firstRead the leads a collector has captured: one row per unique person or company, deduped across every run, each carrying flat identifiers plus the latest payload (name, headline, location, industry).
  • search_linkedin_auto_scrape_runsSearch linkedin auto scrape runsPOSTAgents: ask firstList executions of the collectors: one row per pass of one auto-scrape page loop, with its page progress and its delta (new_count, seen_count, enrolled_count).
  • search_linkedin_auto_scrapesSearch linkedin auto scrapesPOSTAgents: ask firstList the team's collectors: saved jobs that paginate one LinkedIn or Sales Navigator list surface on a cadence and file deduped leads.
  • search_linkedin_connection_invitationsSearch linkedin connection invitationsPOSTAgents: ask firstList inbound LinkedIn connection invitations we received, with filters (including an exact-match note filter; there is no free-text q on this entity), sorting and cursor pagination.
  • search_linkedin_connection_requestsSearch linkedin connection requestsPOSTAgents: ask firstList outbound LinkedIn connection requests (invitations we sent) with filters, sorting, cursor pagination and filter.q, a LIKE (substring) over the note.
  • search_linkedin_connectionsSearch linkedin connectionsPOSTAgents: ask firstList an account's 1st-degree LinkedIn connections with filters, sorting, cursor pagination and filter.q, a LIKE (substring) over the contact name.
  • search_linkedin_conversationsSearch linkedin conversationsPOSTAgents: ask firstList LinkedIn message threads for the team across both messenger surfaces (basic LinkedIn + Sales Navigator) with operator-object filters.
  • search_linkedin_followersSearch linkedin followersPOSTAgents: ask firstList stored followers of team accounts with filters, sorting, cursor pagination and filter.q, a LIKE (substring) over the follower name. Returns a counts block.
  • search_linkedin_messagesSearch linkedin messagesPOSTAgents: ask firstList LinkedIn messages (basic DM + Sales Navigator + InMail) with operator-object filters (account, conversation, channel, direction, contact ids, date ranges) and filter.q, a LIKE (substring) over body + subject (message text, not contact names).

Linkedin auto scrape, 4 operations

  • create_linkedin_auto_scrapeCreate linkedin auto scrapePOSTAgents: ask firstSaves a scraping source as a collector on one of your LinkedIn accounts and starts it: run 1 begins real LinkedIn automation through that account at once. Give the source exactly one way: a bare search url, or source_method plus source_input.
  • delete_linkedin_auto_scrapeDelete linkedin auto scrapeDELETEAgents: ask firstRetire a collector for good: soft-delete, so no further run is ever minted and a run in flight abandons at its next page boundary. Runs and collected leads are retained for audit and stay readable by sid.
  • get_linkedin_auto_scrapeGet linkedin auto scrapeGETAgents: ask firstFetch one collector by sid: status and paused_reason, next_run_at and last_run_at, runs_count and total_new_results, and mass_action_sid (null = collect-only).
  • update_linkedin_auto_scrapeUpdate linkedin auto scrapePATCHAgents: ask firstPatch a collector. Only title and replay_frequency are writable, and at least one must be sent (else 422 nothing_to_update). The source is immutable by design: a different source is a different collector, so create a new one.

Check sent, 3 operations

  • check_linkedin_connection_request_sentCheck linkedin connection request sentPOSTAgents: ask firstAsk what a LinkedIn connection request came to, without sending: by the client_reference it went out under (optionally for one person: profile_id or ln_member_id), or by the activity_log_sid a 409 named.
  • check_linkedin_message_sentCheck linkedin message sentPOSTAgents: ask firstAsk what a LinkedIn message send came to, without sending: by the client_reference it went out under (optionally at one place: linkedin_conversation_sid, ln_member_id or profile_urn), or by the activity_log_sid a 409 named.
  • check_linkedin_posting_sentCheck linkedin posting sentPOSTAgents: ask firstAsk what a LinkedIn comment, post or repost came to, without sending: by the client_reference it went out under and its verb (comment, create-post, repost), optionally at one place.

Linkedin account, 2 operations

  • get_linkedin_accountGet linkedin accountGETAgents: ask firstFetch one LinkedIn account (sender) of the team by sid: identifiers, status, premium, Sales Navigator and Recruiter flags, InMail credits and sync timestamps.
  • set_linkedin_account_labelSet linkedin account labelPATCHAgents: ask firstSet the private operator tag on one sender. `label` is team-authored free text (pod, campaign, owner) stored on the account row and visible only inside the owning workspace: LinkedIn never sees it and no recipient sees it.

React, 2 operations

  • react_linkedin_messageReact linkedin messagePOSTAgents: ask firstAdds an emoji reaction from the account to a LinkedIn message (seen by the other participants).
  • react_linkedin_postReact linkedin postPOSTAgents: ask firstLeaves a reaction from one of your accounts on a LinkedIn post or comment (visible on LinkedIn). LinkedIn keeps one reaction per account and post, so repeating it changes nothing.

Send, 2 operations

  • send_linkedin_connection_requestSend linkedin connection requestPOSTAgents: ask firstSends a real LinkedIn connection request from one of your connected accounts to a person (profile_id URN or public_identifier). Paced per account; never resend under a new client_reference after a 409.
  • send_linkedin_messageSend linkedin messagePOSTAgents: ask firstSends a real LinkedIn message from one of your connected accounts, into an existing conversation or to members. Use one client_reference per message: a repeat is answered, never sent twice.

Accept, 1 operation

  • accept_linkedin_connection_invitationAccept linkedin connection invitationPOSTAgents: ask firstAccepts a received LinkedIn connection invitation on behalf of the account, making the sender a 1st-degree connection on LinkedIn.

Build search url, 1 operation

  • scrape_linkedin_build_search_urlScrape linkedin build search urlPOSTAgents: ask firstBuild the LinkedIn URL of a people or company search, regular or Sales Navigator, from that search's filters: send exactly ONE of people / sales_nav_people / companies / sales_nav_companies.

Check degree, 1 operation

  • check_linkedin_connection_degreeCheck linkedin connection degreePOSTAgents: ask firstProbe one contact's current connection degree (1st / 2nd / 3rd / 4_plus) from a managed account, and actualize a stale stored row: a live connection whose degree is no longer 1st is soft-deleted (removal_kind=removed) in the same call.

Comment, 1 operation

  • create_linkedin_commentCreate linkedin commentPOSTAgents: ask firstPosts a real comment (or a reply to a comment) on a LinkedIn post from one of your accounts. One client_reference per comment: a repeat is answered, never posted twice.

Company decision maker, 1 operation

  • scrape_linkedin_company_decision_makersScrape linkedin company decision makersPOSTAgents: ask firstSales Navigator’s decision-makers panel for ONE company: the bounded, seniority-weighted leadership/buying-committee list SN computes, in the Sales Navigator row shape (position, company, region, degree, seniority, tenure, About text, badges).

Company employee, 1 operation

  • scrape_linkedin_company_employeesScrape linkedin company employeesPOSTAgents: ask firstList the people currently working at ONE company (the company page’s "employees" people-search, page-numbered). Heavy, page-numbered list.

Company lite profile, 1 operation

  • enrich_linkedin_company_lite_profileEnrich linkedin company lite profilePOSTAgents: ask firstThe cheap company read: id, vanity, name and logo, nothing else. Deliberately sparse, the company twin of the lite person profile.

Company post, 1 operation

  • enrich_linkedin_company_postsEnrich linkedin company postsPOSTAgents: ask firstThe company page's own feed, newest-first: the company-side twin of person-posts (author = the company page). Addressed by NUMERIC company id, nested: {company:{company_ln_id}}.

Company profile, 1 operation

  • enrich_linkedin_company_profileEnrich linkedin company profilePOSTAgents: ask firstOne company page's own data: name, industry, size, HQ, about, website, followers. URL-addressed (ledgered input_kind='url'). cached 7d. To LIST a company's people use scraping (company-employees / company-decision-makers).

Create post, 1 operation

  • create_linkedin_postCreate linkedin postPOSTAgents: ask firstPublishes a real LinkedIn post (or schedules it with a time) on the account's feed, a company page or a group. One client_reference per post: a repeat is answered, never posted twice.

Data request, 1 operation

  • get_data_requestGet data requestGETAgents: ask firstFetch a single ledger row by sid to inspect one request referenced from a data-requests.* webhook or another row's cached_from_sid pointer.

Delete comment, 1 operation

  • delete_linkedin_commentDelete linkedin commentPOSTAgents: ask firstDeletes one of the account's own LinkedIn comments on LinkedIn. Cannot be undone.

Delete post, 1 operation

  • delete_linkedin_postDelete linkedin postPOSTAgents: ask firstDeletes one of the account's own LinkedIn posts on LinkedIn. Cannot be undone.

Delete scheduled post, 1 operation

  • delete_linkedin_scheduled_postDelete linkedin scheduled postPOSTAgents: ask firstDeletes a post the account scheduled on LinkedIn before it is published. Cannot be undone.

Follow, 1 operation

  • follow_linkedin_memberFollow linkedin memberPOSTAgents: ask firstMakes one of your LinkedIn accounts follow a member (visible on LinkedIn).

Get my latest, 1 operation

  • get_my_latest_linkedin_messagesGet my latest linkedin messagesPOSTAgents: ask firstAlways-fresh head read of ONE basic-messenger thread (§5.8 refresh of that conversation from LinkedIn, then the last N messages, sent_at DESC). Never stale: it 429s with bucket_saturated / sync_in_progress.

Get post comment, 1 operation

  • scrape_linkedin_get_post_commentsScrape linkedin get post commentsPOSTAgents: ask firstDirect LinkedIn read (bypasses our DB): one page of the COMMENTS on ONE post, live.

Get post reactor, 1 operation

  • scrape_linkedin_get_post_reactorsScrape linkedin get post reactorsPOSTAgents: ask firstDirect LinkedIn read (bypasses our DB): live pull of who is reacting to ONE post - or ONE COMMENT - right now, as transient reactor objects with reaction_type in OUR write vocabulary (interested = the event-post reaction), annotated with is_own.

Get scheduled post, 1 operation

  • get_linkedin_scheduled_postsGet linkedin scheduled postsPOSTAgents: ask firstOne page of the account's SCHEDULED-posts queue: drafts waiting for their publication time, each with post_urn, scheduled_at, text and LinkedIn's own error_message (wire get-scheduled-posts).

Ignore, 1 operation

  • ignore_linkedin_connection_invitationIgnore linkedin connection invitationPOSTAgents: ask firstIgnores (declines) a received LinkedIn connection invitation on behalf of the account, on LinkedIn.

Linkedin auto scrape run, 1 operation

  • get_linkedin_auto_scrape_runGet linkedin auto scrape runGETAgents: ask firstFetch one run by sid: the poll handle after run_linkedin_auto_scrape_now.

Linkedin conversation, 1 operation

  • get_linkedin_conversationGet linkedin conversationGETAgents: ask firstFetch one conversation by sid: the stored row including the denormalized participants list. Stored-DB read: no plugin call, no limit spend.

Mark read, 1 operation

  • mark_linkedin_conversation_readMark linkedin conversation readPOSTAgents: ask firstMarks a LinkedIn conversation thread as read on LinkedIn for the account (a LinkedIn-side effect; idempotent).

Mark unread, 1 operation

  • mark_linkedin_conversation_unreadMark linkedin conversation unreadPOSTAgents: ask firstMarks a LinkedIn conversation as unread on LinkedIn for the account.

Metric, 1 operation

  • get_linkedin_connection_requests_metricsGet linkedin connection requests metricsPOSTAgents: ask firstPeriod-bound aggregates over one account's sent requests. Requires period {from,to} and filter.linkedin_account_sid (.eq or .in) - that is the ONLY filter axis the aggregation applies, unlike search.

Param id lookup, 1 operation

  • scrape_linkedin_param_id_lookupScrape linkedin param id lookupPOSTAgents: ask firstFacet-id typeahead for the REGULAR (non Sales Navigator) search: turn a human term ("United States", "SaaS", "Acme") into the id a filter member needs.

Pause, 1 operation

  • pause_linkedin_auto_scrapePause linkedin auto scrapePOSTAgents: ask firstFreeze recurrence: status becomes paused with paused_reason 'manual' and next_run_at is cleared, so no new run is minted. A run already in flight FINISHES (pausing never abandons it). Idempotent.

Person basic profile, 1 operation

  • enrich_linkedin_person_basic_profileEnrich linkedin person basic profilePOSTAgents: ask firstThe middle person read, between the lite identity stub and the full dossier: name PARTS (first / last, which no other read splits out), headline, country and display location, profile and background imagery.

Person contact info, 1 operation

  • enrich_linkedin_person_contact_infoEnrich linkedin person contact infoPOSTAgents: ask firstContact details for ONE person: email, phones (typed, so HOME/WORK is kept, unlike the lossy flat `phone` on person-full-profile), websites and twitter handles. Cached 24h.

Person education, 1 operation

  • enrich_linkedin_person_educationEnrich linkedin person educationPOSTAgents: ask firstEducation history only, a subset projection of the full-profile wire call (NOT a stub: shares get-full-profile, no dedicated verb). cached 7d under its own method key (a cached full profile does NOT satisfy it). Not paginated.

Person experience, 1 operation

  • enrich_linkedin_person_experienceEnrich linkedin person experiencePOSTAgents: ask firstComplete, paginated work history ("Show all experiences"), unlike the truncated head on full-profile. One call = one page; loop cursor until paging.next_page_cursor is absent. cached 7d.

Person full profile, 1 operation

  • enrich_linkedin_person_full_profileEnrich linkedin person full profilePOSTAgents: ask firstThe complete person dossier: identity, headline/position/company, location, about, follower/connection counts, premium/verification flags, plus truncated heads of experience/education/skills/recent posts. cached 24h.

Person lite profile, 1 operation

  • enrich_linkedin_person_lite_profileEnrich linkedin person lite profilePOSTAgents: ask firstCheapest person read: existence check + full identifier resolution.

Person post, 1 operation

  • enrich_linkedin_person_postsEnrich linkedin person postsPOSTAgents: ask firstPosts authored or reshared by the target, newest-first: the personalization goldmine before outreach. Reshares carry the original in reshared_post; created_at is ISO 8601. cached 7d.

Person skill, 1 operation

  • enrich_linkedin_person_skillsEnrich linkedin person skillsPOSTAgents: ask firstComplete, paginated skills list ("Show all skills") with endorsement counts (skill_id is the endorse handle). cached 7d.

Post detail, 1 operation

  • enrich_linkedin_post_detailsEnrich linkedin post detailsPOSTAgents: ask firstOne post's own data by its urn: full text, author, media, engagement counters, per-reaction breakdown, is_reshare with the original post embedded. LIVE since 2026-08-14 (node get-post). Accepts post_urn XOR url.

Remove, 1 operation

  • remove_linkedin_connectionRemove linkedin connectionPOSTAgents: ask firstRemoves a 1st-degree connection on LinkedIn from one of your accounts (identified by its ln_cn_ sid). Cannot be undone through this API.

Repost, 1 operation

  • repost_linkedin_postRepost linkedin postPOSTAgents: ask firstReposts a LinkedIn post to the account's feed, optionally with your own text. One client_reference per repost: a repeat is answered, never reposted twice.

Resume, 1 operation

  • resume_linkedin_auto_scrapeResume linkedin auto scrapePOSTAgents: ask firstRe-arm a paused collector: status becomes active, paused_reason clears, consecutive_failures resets to 0 and next_run_at is set to now, so the next scheduler tick mints a run.

Run now, 1 operation

  • run_linkedin_auto_scrape_nowRun linkedin auto scrape nowPOSTAgents: ask firstStarts a manual run of a collector now, off schedule: real LinkedIn scraping through the collector's account. Returns its run_sid in result; asynchronous, so poll get_linkedin_auto_scrape_run for status, new_count and enrolled_count.

Search company, 1 operation

  • scrape_linkedin_search_companiesScrape linkedin search companiesPOSTAgents: ask firstOne page of a regular LinkedIn company search, addressed EITHER by `filters` (keywords, geo ids, industry ids, headcount buckets) OR by a pasted /search/results/companies/ `url`: exactly one of the two, never both, never neither.

Search job, 1 operation

  • scrape_linkedin_search_jobsScrape linkedin search jobsPOSTAgents: ask firstOne page of a LinkedIn JOB-POSTING search, addressed EITHER by `filters` (keywords is REQUIRED here, which no other engine on this surface demands) OR by a pasted /jobs/search-results/ `url`, which is the only way to hybrid or on-site work.

Search person, 1 operation

  • scrape_linkedin_search_peopleScrape linkedin search peoplePOSTAgents: ask firstOne page of a regular LinkedIn people search, addressed EITHER by `filters` OR by a pasted search `url`: exactly one of the two, never both, never neither.

Search post, 1 operation

  • scrape_linkedin_search_postsScrape linkedin search postsPOSTAgents: ask firstLinkedIn content search: find POSTS by keywords, recency or author. The discovery front door for post-engagement plays (feed the returned post_ln_id into the commenters / reactors / resharers tools).

Search sales nav company, 1 operation

  • scrape_linkedin_search_sales_nav_companiesScrape linkedin search sales nav companiesPOSTAgents: ask firstOne page of a Sales Navigator ACCOUNT search, the one engine here that filters on annual revenue, company and per-department headcount growth, department headcount, follower buckets, Fortune tier and buying signals.

Search sales nav person, 1 operation

  • scrape_linkedin_search_sales_nav_peopleScrape linkedin search sales nav peoplePOSTAgents: ask firstOne page of a Sales Navigator people search: richer facets than the regular engine (seniority, function, tenure, headcount, company type), no commercial-use limit, SN URNs (sn_id) on the rows.

Send inmail, 1 operation

  • send_linkedin_inmailSend linkedin inmailPOSTAgents: ask firstSends a real premium LinkedIn InMail (subject and text) to a person by ln_id or sn_id, spending the account's InMail credits. One client_reference per InMail: a repeat is answered, never sent twice.

Send recruiter, 1 operation

  • send_linkedin_recruiter_messageSend linkedin recruiter messagePOSTAgents: ask firstSends a real LinkedIn Recruiter InMail (new thread or reply) from an account with a Recruiter seat, spending an InMail credit. One client_reference per message: a repeat is answered, never sent twice.

Send sales nav, 1 operation

  • send_linkedin_sales_nav_messageSend linkedin sales nav messagePOSTAgents: ask firstSends a real Sales Navigator message from an account with a Sales Navigator seat. One client_reference per message: a repeat is answered, never sent twice.

Similar company, 1 operation

  • scrape_linkedin_similar_companiesScrape linkedin similar companiesPOSTAgents: ask firstLinkedIn’s "similar companies / pages people also viewed" list for ONE target company: lookalike account expansion. One-shot list.

Similar profile, 1 operation

  • scrape_linkedin_similar_profilesScrape linkedin similar profilesPOSTAgents: ask firstLinkedIn’s "people also viewed" browsemap for ONE seed profile: lookalike expansion from a known-good persona.

Unfollow, 1 operation

  • unfollow_linkedin_memberUnfollow linkedin memberPOSTAgents: ask firstMakes one of your LinkedIn accounts stop following a member.

Withdraw, 1 operation

  • withdraw_linkedin_connection_requestWithdraw linkedin connection requestPOSTAgents: ask firstWithdraws a pending outbound connection request on LinkedIn (identified by its ln_cr_ sid); a 21-day resend cooldown for that person begins. Cannot be undone through this API.

Use gtm-api from Claude Code, Cursor or Codex

Connect gtm-api in LiveContext, create an API key in Settings, then add the LiveContext MCP server to your client. Its gtm-api operations become tools the client can call, next to every other integration you connected.

Claude Code
claude mcp add --transport http livecontext https://livecontext.ai/mcp --header "X-API-Key: YOUR_API_KEY"
Codex (~/.codex/config.toml)
[mcp_servers.livecontext]
url = "https://livecontext.ai/mcp"

[mcp_servers.livecontext.http_headers]
"X-API-Key" = "YOUR_API_KEY"
Cursor, Claude Desktop and other JSON configs
{
  "mcpServers": {
    "livecontext": {
      "type": "http",
      "url": "https://livecontext.ai/mcp",
      "headers": {
        "X-API-Key": "YOUR_API_KEY"
      }
    }
  }
}

Set up the MCP server step by step

How to connect gtm-api

  1. Create your workspace

    Sign up free. Nothing to install.

  2. Connect gtm-api once

    Add your gtm-api connection in Settings. Every tool from this integration reuses it, and secrets are encrypted at rest and visible only to you.

  3. Describe the job in chat

    The workflow builds itself in front of you and picks the endpoints it needs. Drag the steps yourself on the canvas whenever you would rather be explicit.

gtm-api integration FAQ

What can you do with the gtm-api integration?

LiveContext exposes 78 operations on gtm-api, covering search, linkedin auto scrape, check sent and linkedin account.

Popular integrations

Browse the whole catalog