Find buyers, run LinkedIn, email and X outreach, and answer replies from your AI.
One address for any MCP client. You sign in at app.pumpgtm.com once, after adding it.

At most: moves money, runs code or commands, deletes data, or sends messages for you.
Odel charges nothing per call. The publisher may charge for its own service.
Odel could not list its tools without signing in.
Run LinkedIn, email and X outreach from any AI agent.
PumpGTM finds the buyers showing intent this week, drafts and sends the outreach from your own accounts inside each platform's limits, and hands every reply back to a human. This is the public reference for the hosted MCP server at https://mcp.pumpgtm.com/mcp.
Quickstart · Docs · tools.json · REST API · Platforms and agencies · YouTube
The same workspace the dashboard shows. Plays find people, sequences reach them across LinkedIn, email and X, and every reply waits for a human.


flowchart LR
A[Your AI agent<br/>Claude, Cursor, Codex, your own] -- MCP over Streamable HTTP --> M[mcp.pumpgtm.com]
M --> W[Your PumpGTM workspace]
W -- find_people --> P[Buyers showing intent]
W -- sequences --> L[LinkedIn]
W -- sequences --> E[Email]
W -- sequences --> X[X]
L & E & X -- replies --> R[Human decides]
R -- webhook reply.received --> A
![]() What is PumpGTM, and how does it actually work? 4 minute walkthrough | ![]() Using AI to run founder-led outbound for 10 YC companies Namanyay's article on X: one lead universe, shared prospects, copy measured by meetings. Read on pumpgtm.com |
More on the PumpGTM YouTube channel and in PumpGTM in the wild, videos founders and creators made on their own channels.
Endpoint (Streamable HTTP): https://mcp.pumpgtm.com/mcp
Two ways to authenticate, both scoped to one workspace:
https://pumpgtm.com/.well-known/oauth-authorization-server. Access tokens last 30 days, refresh tokens 90.Authorization: Bearer eve_mcp_.. on every request. The key does not expire. Rotation is not self-serve yet: write to hello@pumpgtm.com and we rotate it for you.The key's database row fixes the workspace. It cannot read or act on any other workspace.
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const client = new Client({ name: "your-agent", version: "1.0.0" });
await client.connect(
new StreamableHTTPClientTransport(new URL("https://mcp.pumpgtm.com/mcp"), {
requestInit: { headers: { Authorization: "Bearer YOUR_WORKSPACE_KEY" } },
}),
);
const { tools } = await client.listTools(); // up to 26 tools, listed below
ChatGPT (until the PumpGTM listing is approved in the ChatGPT directory; Developer mode is no longer needed): open Plugins (chatgpt.com/plugins), click + and choose Add custom MCP server. Name it PumpGTM, paste https://mcp.pumpgtm.com/mcp as the Server URL, keep OAuth, click I understand and want to continue, then Create as a plugin. Open your personal plugins (chatgpt.com/plugins?view=personal), open PumpGTM and click + to install it, then sign in to PumpGTM and allow the connection. In a chat, type @PumpGTM and ask it to find buyers.
Claude Code: claude mcp add --transport http pumpgtm https://mcp.pumpgtm.com/mcp, then run /mcp (or claude mcp login pumpgtm) and sign in. Codex: codex mcp add pumpgtm --url https://mcp.pumpgtm.com/mcp then codex mcp login pumpgtm. Cursor: add a server with only the URL and sign in when it asks. Cline: add "pumpgtm": { "type": "streamableHttp", "url": "https://mcp.pumpgtm.com/mcp" } under mcpServers in cline_mcp_settings.json and sign in when it asks. Grok: at grok.com/connectors choose New Connector, then Custom, paste https://mcp.pumpgtm.com/mcp, and sign in (works on the free plan).
The PumpGTM plugin bundles this server with four skills: write a cold message, find buyers, handle replies, and look up a person. In Claude Code:
/plugin marketplace add pumpgtm/pumpgtm-mcp
/plugin install pumpgtm@pumpgtm
Then run /mcp and sign in to PumpGTM. The plugin's manifest, skills and server config live in github.com/pumpgtm/pumpgtm-mcp.
In Codex:
codex plugin marketplace add pumpgtm/pumpgtm-mcp
codex plugin add pumpgtm@pumpgtm
codex mcp login pumpgtm
In Gemini CLI:
gemini extensions install https://github.com/pumpgtm/pumpgtm-mcp
Then run /mcp auth pumpgtm and sign in.
content block of type text whose text is a JSON string, and the same object in structuredContent. Parse the JSON.next: { tool, arguments, reason, requiresConfirmation, requiresNewRequestId? }. It is the suggested following call, not an instruction to skip the customer.isError: true and { status, retryable, changed, message, details }. changed: false means nothing was written. A missing object returns code resource_not_found.requestId: 8 to 120 characters of letters, digits, . _ : -, starting with a letter or digit. It is an idempotency key. Use a fresh one per call; reuse one only to retry the same call.get_workspace returns energy with the monthly allowance, used and remaining, and find_people refuses with energy_exhausted when a run would exceed it. Workspaces without Energy see no such field. See Energy.find_people, review_people, save_sequence_draft and add_leads never send. Sending starts with set_sequence_status active on an approved sequence, and each reply is answered only through decide_reply.Every tool is classified for AI clients that ask before acting. Read tools never change anything. Write tools change workspace records but contact no one. Sensitive writes contact a third party, act in public, or spend money, so an AI client should show the details and get the user's yes each time. Hints in tools/list match this table (readOnlyHint, destructiveHint, openWorldHint).
| Tool | Class | Side effect |
|---|---|---|
get_cold_message_examples | Read | none |
get_company | Read | none |
get_lead_profile | Read | none |
get_pipeline | Read | none |
get_workspace | Read | none |
get_x_play_review | Read | none |
list_leads | Read | none |
list_pending_replies | Read | none |
list_sequences | Read | none |
search_known_people | Read | none |
add_company_contact | Write | changes workspace records only; contacts no one |
record_customer_signal | Write | changes workspace records only; contacts no one |
remove_leads | Write | stops future automation for those people; never deletes history |
save_company | Write | changes workspace records only; contacts no one |
save_opportunity | Write | changes workspace records only; contacts no one |
add_leads | Sensitive write | people enter a sequence and a live sequence will contact them |
add_to_sequence | Sensitive write | people enter a sequence and a live sequence will contact them |
decide_reply | Sensitive write | send, invite and booking_link message the prospect at once; opt_out is permanent |
enrich_person | Sensitive write | spends workspace Energy (paid) |
find_people | Sensitive write | with confirmed=true runs a paid search (can use Energy); never contacts anyone |
manage_x_play | Sensitive write | resuming or enabling enrollment can start future X outreach |
reach_post_engagers | Sensitive write | LinkedIn: enrolls the post's engagers into a live sequence; X: collects them for review |
reach_universe | Sensitive write | people enter a sequence or email campaign that can contact them |
research_competitor | Sensitive write | starts paid background research; never contacts anyone |
review_people | Sensitive write | good fits enter the chosen sequence; a live sequence will contact them |
review_x_play_candidates | Sensitive write | good fits enter the Play's X sequence; an active sequence will DM them |
save_sequence_draft | Sensitive write | the saved sequence is live and its steps contact the people enrolled in it |
set_lead_input | Sensitive write | releases a held message step for that person |
set_sequence_status | Sensitive write | active or approved lets the paced engine contact enrolled people |
x_account | Sensitive write | follows, likes or reposts publicly from the connected X account |
get_workspace to read setup state, sequences, unfinished reviews and pending replies.find_people with targeting and confirmed: false to save a Play and show the targeting summary. Then find_people with playId and confirmed: true to run it.review_people with decisions and finish: true to queue the good fits into a sequence.save_sequence_draft with steps, then set_sequence_status approved with expectedRevision, then active.list_pending_replies, show the draft to the customer, decide_reply.Reporting: get_workspace (view: "summary" for the funnel and account pacing, view: "activity" for the ledger) and list_leads with stage or sinceDays. The same numbers are available over REST at /docs/api.
resources/list returns six lead-search guides: gigacatalyst://lead-search/catalog, quickstart, fields, query-builder, patterns and results. Read fields before writing targeting by hand. One prompt, gigacatalyst_find_people, takes requestedCount ("10" to "100").
Tools scheduled for removal say so in their description for at least 90 days before leaving tools/list. There is no fixed rate limit on the MCP server today; discovery is paced by each workspace's daily provider budget.
tools/list)Generated from the live tools/list on 2026-10-05. "Read only" tools never write. Feature-gated groups return a structured error on workspaces without that feature.
Start here. Summary: setup state (LinkedIn, billing, finish-setup link), LinkedIn progress, Plays, eligible sequences, unfinished review, pending replies count, and (when the workspace has the email channel) its mailboxes and email campaigns. view=activity reads the append-only LinkedIn activity ledger with filters. view=x_posts lists the connected X account's recent posts with like counts and which sequence, if any, already DMs each post's likers (workspaces with the X channel).
| Argument | Type | Notes |
|---|---|---|
view | summary, activity, x_posts | default "summary". |
sinceDays | integer | default 7, range 0 to 365. |
account | string | |
actions | array of resolve, invite, accepted, like, message, followup, reply_detected, view_profile, endorse, comment, tool_prepare, enrich, meeting_invited, reply_drafted, reply_sent, reply_dismissed, reply_snoozed, sequence_started, meeting_booked, meeting_no_show, meeting_synced, manual_override, x_dm, x_follow, x_like, x_follow_back, x_follow_back_scan, x_credit_balance, x_reply_subscription, instagram_dm, instagram_comment, track_unavailable, track_done, ad_campaign_architected, ad_campaign_saved, ad_creative_generated, ad_budget_revised, ad_approval_requested, ad_campaign_approved, ad_campaign_published_paused, linkedin_search, web_pages_read, email_found, email_campaign_created, email_campaign_added, email_sent, email_replied, email_skipped, email_bounced, email_unsubscribed, email_click, sequence_people_added, lead_replenishment_enabled, lead_replenishment_disabled, recovery_eligible, recovery_matched, recovery_enrolled, recovery_review, recovery_invite_sent, recovery_invite_accepted, recovery_message_sent, recovery_reply_detected, recovery_suppressed, engine_run, linkedin_connect, error | |
outcome | ok, failed, skipped | |
limit | integer | default 100, range 1 to 500. |
Create or revise a Play from targeting and run it. Targeting may include a hiring signal (currentCompanyHiringRolesAny): the person's current company must have an open job posting for one of those roles, posted within currentCompanyHiringPostedWithinDays. Without confirmed=true it only saves the Play and returns the targeting summary for the customer to confirm. An unresolved required company is preserved in the saved draft and returned under companyResolution; the Play cannot run until the customer corrects or explicitly removes it in a revision. With confirmed=true, a ready Play runs discovery and returns candidates in retrieval order. Pass playId alone to rerun an existing ready Play. Optional sequenceId sets the Play's default sequence. Creates no leads and contacts no one.
| Argument | Type | Notes |
|---|---|---|
requestId | string | required. Stable idempotency key; reuse it only to retry this exact request. |
targeting | object | |
playId | uuid | |
expectedRevision | integer | range to 9007199254740991. Required with targeting when revising an existing playId. |
confirmed | boolean | default false. |
sequenceId | uuid |
Without decisions: read one review batch with its candidates and saved choices. With decisions: record the customer's explicit good_fit and not_a_fit choices; a top-level sequenceId applies to every good fit, finish=true completes the review and queues good fits into the sequence. For add all, mark every candidate good_fit with finish=true. Sends nothing in this call.
| Argument | Type | Notes |
|---|---|---|
batchId | uuid | required. |
requestId | string | Required with decisions. |
sequenceId | uuid | |
decisions | array of objects | |
finish | boolean | default false. |
Search a company, professional role, or explicitly stated accelerator cohort in permitted shared professional evidence. Returns at most 20 matching identities; coverage is incomplete and includes labelled historical roles and interpretations. This is not a live provider search, does not expose other customers' lists or messages, and does not authorize outreach. Check source dates before recommending someone.
| Argument | Type | Notes |
|---|---|---|
query | string | required. |
Read source-dated public identities, available employment history, public activity and relationship observations for a lead owned by this workspace. Public profile links and AI interpretations require review. This does not fetch providers, change identities, enroll or contact anyone.
| Argument | Type | Notes |
|---|---|---|
leadId | uuid | required. |
Sequences with steps, approval state, status, and exact enrolled-lead counts. Pass sequenceId to read one sequence with its exact revision before editing.
| Argument | Type | Notes |
|---|---|---|
sequenceId | uuid |
Without sequenceId: create a complete new sequence (name plus ordered steps). With sequenceId and expectedRevision: replace a draft's complete step list; move active or paused sequences to draft first. Steps are connect, message, engage (LinkedIn), email (subject plus body; only when the workspace has email enabled), or x_dm (an X direct message to a post liker; an X sequence is x_dm steps only, for workspaces with the X channel). When any LinkedIn step is present step 0 must be connect; an email-only sequence needs no connect. delayDays counts from the previous step (the step after connect waits for the invite to be accepted) and later steps are skipped once the person replies on any channel. {{firstName}} {{fullName}} {{company}} {{title}} render on both channels. Example mixed flow: connect, message +1d, email +2d, email +2d, email +3d. The result stays a stopped draft that needs approval, then activation, through set_sequence_status.
| Argument | Type | Notes |
|---|---|---|
requestId | string | required. Stable idempotency key; reuse it only to retry this exact request. |
sequenceId | uuid | |
expectedRevision | integer | range to 9007199254740991. |
name | string | |
steps | array of objects | required. |
executionModel | linear, tracks | tracks: LinkedIn, email and X steps run as parallel lanes per person (each lane's delayDays count from its own previous step; a person without one channel's handle still gets the others). Needs the workspace's multichannel_tracks feature. D |
For a LinkedIn sequence (sequenceId): status=approved records the customer's approval of one exact draft revision (expectedRevision required) and keeps it stopped; active starts outreach for an approved sequence, paused stops it for every enrolled lead, draft reopens it for editing. For an email campaign (emailCampaignId): active launches sending inside its schedule and limits, paused stops it, draft reopens it; approved does not apply. Each is a separate explicit customer decision.
| Argument | Type | Notes |
|---|---|---|
sequenceId | uuid | |
emailCampaignId | uuid | |
status | approved, active, paused, draft | required. |
expectedRevision | integer | range to 9007199254740991. |
This workspace's leads with LinkedIn and sequence progress. stage is cumulative (reached this milestone or beyond); stageExact is the current position only. Count is exact even when the page is limited. Pass leadId to read one lead in full.
| Argument | Type | Notes |
|---|---|---|
leadId | uuid | |
stage | queued, resolving, invited, accepted, messaged, followed_up, replied, failed, skipped | |
stageExact | queued, resolving, invited, accepted, messaged, followed_up, replied, failed, skipped | |
sequenceId | uuid | |
strategyId | uuid | |
query | string | |
engagedOnly | boolean | |
bookedOnly | boolean | |
sinceDays | integer | range 0 to 365. |
limit | integer | range 1 to 500. |
Queue leads into one approved active sequence: 1 to 500 manual LinkedIn profiles, CSV content, or a saved Sales Navigator list URL. Manual and CSV finish immediately and return added, duplicate, and invalid counts plus stable addedLeadIds. Sales Navigator runs in the background and auto-enrolls; use method=import_status with its batchId to check. Nothing is sent in this call.
The input is one of these shapes:
method: "manual" with requestId (required), sequenceId (required), leads (required)method: "csv" with requestId (required), sequenceId (required), csvContent (required)method: "sales_navigator" with requestId (required), sequenceId (required), accountId, listUrl (required)method: "import_status" with batchId (required)Only when the customer explicitly asks to undo an add or stop leads. Target lead IDs or one batchId from add_leads. Uncontacted leads leave the queue; contacted leads keep history and get no further automated steps. Sent invitations and messages cannot be reversed.
The input is one of these shapes:
target: "leads" with leadIds (required)target: "import" with batchId (required)Inbound LinkedIn replies frozen for human review, each with PumpGTM's draft answer. Read-only.
| Argument | Type | Notes |
|---|---|---|
limit | integer | default 50, range 1 to 200. |
Apply one explicit human decision to a pending reply. send, invite, and booking_link contact the prospect; opt_out is permanent. Show the draft and ask the customer first.
| Argument | Type | Notes |
|---|---|---|
draftId | uuid | required. |
decision | send, invite, booking_link, snooze, start_sequence, meeting_booked, dismiss, opt_out | required. |
text | string | |
days | integer | range 1 to 365. |
decidedBy | string | default "mcp". |
A random sample from PumpGTM's library of the most-liked public posts on X about writing cold emails and DMs, each with its link and why it was kept. Use them as references when drafting or critiquing a cold message; credit the author and do not copy them word for word.
| Argument | Type | Notes |
|---|---|---|
count | integer | default 5, range 1 to 10. |
Look up one public LinkedIn person URL. Returns professional name, headline, location, current company and title when available. Set includeWorkEmail=true to also find a work email through the data waterfall. Uses workspace Energy; 1 Energy is $0.05. Requires Energy enabled. Returns per-call energyCharged and energyHeld. Missing fields stay null. Check emailCompanyDomainMatch before using the email. Does not create leads or send outreach. Repeated calls can cost Energy; never automatically retry a timeout or error. Use find_people for audience discovery, not this tool.
| Argument | Type | Notes |
|---|---|---|
linkedinUrl | string | required. |
includeWorkEmail | boolean |
LinkedIn post URL plus message: PumpGTM creates a Play with its own approved sequence (note-less connection request, then your message), fetches every reactor and commenter in the background (up to 500), and enrolls all of them; call again with only playId for progress. X post URL (x.com/…/status/…) plus message, or plus an existing X sequenceId: its likers and repliers are collected into Lead Universe for review as they engage, from now on; the customer adds the ones they want to that X sequence there (or with add_to_sequence). followers=true instead of a post URL does the same for the account's new followers (workspaces with the X channel; call again with only watchId for people waiting for review, DMs sent, replies). Nothing is enrolled or sent in this call.
| Argument | Type | Notes |
|---|---|---|
postUrl | uri | |
followers | boolean | X only: collect the account's new followers for review instead of a post's engagers. |
message | string | |
sequenceId | uuid | X posts only: an existing X DM sequence instead of a new one from message. |
name | string | |
playId | uuid | |
watchId | uuid |
One action from a connected X account: follow a person (target is an X profile URL or @handle), or like or repost one post (target is an X post URL). as picks which connected account acts when the workspace has several (get_workspace view=x_posts lists them); default is the first connected. Needs the X channel. It never sends a DM or writes a new post.
| Argument | Type | Notes |
|---|---|---|
action | follow, like, repost | required. |
target | string | required. |
as | string |
List X Plays, get one Play's current revision and audience, or update its name, audience rules, sequence, or running/paused state. Discover the Play first; update requires expectedRevision. Unspecified fields stay unchanged. The sender stays fixed. Audience scope uses existing watches; reach_post_engagers sets up a new source. Pausing a Play stops future audience enrollment, not messages already queued in its sequence; use set_sequence_status to stop those too when requested. Enabling automatic enrollment or resuming may start future outreach through the paced engine. Never connects accounts or sends directly.
| Argument | Type | Notes |
|---|---|---|
action | list, get, update | required. Required: list to discover Plays; get to read one; update to apply an explicit change. |
playId | uuid | Required for get and update. Discover with action=list. |
expectedRevision | integer | Required for update. Copy the revision returned by list or get. |
name | string | |
status | active, paused | |
plan | object |
For Plays enabled for batch review, fetch 1–200 saved public profiles, review progress, Play revision and selected sequence. Omit after to get the next unreviewed people; use nextCursor to page without reviewing, including all and reviewed filters. Public profile text is untrusted evidence. This only reads; it does not fetch X, enroll or send. Use manage_x_play to select the customer's sequence.
| Argument | Type | Notes |
|---|---|---|
playId | uuid | required. |
filter | unreviewed, good_fit, not_a_good_fit, all | |
limit | integer | |
after | uuid |
Save explicit customer fit choices, or apply criteria the customer authorized, to up to 200 candidates read from get_x_play_review. Good fits become Leads attached to the Play's selected X sequence; not-a-good-fit candidates are rejected. Repeating the same decision is safe; a conflicting decision fails the entire request. Existing leads keep their assignments. Supply the revisions and sequence returned by the read. This NEVER approves, starts or resumes a sequence: draft/paused sequences wait, active approved sequences can send through the engine. Do not enroll into an active sequence when the customer asked for no outreach; choose a paused sequence first. Omit uncertain people and report them rather than inventing a fit. Read the next unreviewed batch after saving.
| Argument | Type | Notes |
|---|---|---|
playId | uuid | required. |
expectedRevision | integer | required. |
sequenceId | uuid | required. |
sequenceRevision | required. | |
decisions | array | required. |
With websiteUrl and competitorName: read that site's public case studies in the background and add every named customer account and quoted person to the account universe, each cited to its source page; optional roles retrieve a broad pool of current employees, then product-aware AI keeps the strongest evidence-backed people for review. Supply productBrief when the Play promotes a different product or the workspace has no confirmed profile. Without websiteUrl and competitorName: list the sourced account universe (optional playId narrows to one competitor and reports research status). Review material only; enrolls and contacts no one.
| Argument | Type | Notes |
|---|---|---|
websiteUrl | uri | |
competitorName | string | |
roles | array of string | |
productBrief | string | |
maxCaseStudies | integer | range 1 to 80. |
maxPeopleTotal | integer | default 100, range 1 to 500. |
playId | uuid | |
limit | integer | default 200, range 1 to 500. |
Pick people from the account universe (by competitor name, playId, or exact candidateIds; notYetEnrolled skips anyone already in LinkedIn outreach) and reach them on one channel. channel=email puts everyone with a known email into one of the workspace's own email campaigns, either campaignId or a new draft named campaignName, and may set the campaign's steps (plain text, {{firstName}} {{company}} {{title}} placeholders, delayDays between steps), schedule, sending mailboxIds (or allMailboxes), and dailyLimit in the same call; people without an email are skipped, and findEmails=true first looks up missing addresses, up to maxEmailLookups and a daily limit. channel=linkedin enrolls them into an active approved sequence by sequenceId through the ordinary paced engine. Nothing is launched or sent in this call.
| Argument | Type | Notes |
|---|---|---|
channel | email, linkedin | required. |
competitor | string | |
playId | uuid | |
candidateIds | array of uuid | |
notYetEnrolled | boolean | default true. |
campaignId | string | |
campaignName | string | |
findEmails | boolean | default false. |
maxEmailLookups | integer | default 50, range 1 to 200. |
steps | array of objects | |
schedule | object | |
mailboxIds | array of uuid | |
allMailboxes | boolean | default false. |
dailyLimit | integer | range 1 to 5000. |
sequenceId | uuid |
Pick people from the account universe (by competitor name, playId, or exact candidateIds; notYetEnrolled skips anyone already in a sequence) and add them to one sequence: an existing non-archived sequenceId from list_sequences, or a new draft named name built from template linkedin / email / linkedin_email (then edit its steps with save_sequence_draft). Email-only sequences skip people without a known email; mixed sequences keep them and their email steps wait until an address is known; findEmails=true first looks up missing addresses, metered. Adding never approves, launches, or sends: the customer approves and starts the sequence with set_sequence_status.
| Argument | Type | Notes |
|---|---|---|
competitor | string | |
playId | uuid | |
candidateIds | array of uuid | |
notYetEnrolled | boolean | default true. |
sequenceId | uuid | |
name | string | |
template | linkedin, email, linkedin_email, linkedin_email_parallel | |
findEmails | boolean | default false. |
maxEmailLookups | integer | default 50, range 1 to 200. |
Read your workspace's CRM opportunities and company lifecycle. Money is in minor units and totals are separated by currency. Probabilities are explicit stage/team estimates, not calibrated predictions or verified revenue. Requires the CRM feature.
| Argument | Type | Notes |
|---|---|---|
q | string | |
currency | string | |
attention | boolean | |
scope | active, archived, all | default "active". Active excludes archived companies; archived and all preserve historical access. |
offset | integer | default 0, range 0 to 10000. |
limit | integer | default 50, range 1 to 100. |
Company, linked lead contacts, opportunities, success plan, and latest 100 source-attributed events. Recorded/imported signals do not imply a live provider connection.
| Argument | Type | Notes |
|---|---|---|
company_id | uuid | required. |
Create or revise a CRM company and its customer success plan. Use a new UUID and expected_revision=0 to create; use the current revision to edit. Lifecycle is your team's assessment; active never means Stripe-verified. Do not invent customer status. Does not send, enroll, or bill anyone.
| Argument | Type | Notes |
|---|---|---|
id | uuid | required. |
expected_revision | integer | required, range 0 to 9007199254740991. |
name | string | required. |
domain | string | required. |
lifecycle | prospect, onboarding, active, at_risk, churned | required. |
owner | string | required. |
success_plan | string | required. |
next_review_on | date | required. |
Create or revise a deal for an existing CRM company. Ask for missing value/currency; null value means unknown. Use a new UUID/revision=0 to create, otherwise current revision. Stage does not change outreach or company lifecycle. Won means recorded won, not paid. Only set probability_override when the user supplies an estimate.
| Argument | Type | Notes |
|---|---|---|
id | uuid | required. |
expected_revision | integer | required, range 0 to 9007199254740991. |
company_id | uuid | required. |
title | string | required. |
stage | new, qualified, meeting, proposal, negotiation, won, lost | required. |
amount_minor | integer | required. |
currency | USD, EUR, GBP, CAD, AUD, INR | required. |
probability_override | integer | required. |
expected_close_on | date | required. |
next_step | string | required. |
next_step_due_on | date | required. |
Add a company contact, optionally linked to an existing PumpGTM lead in this workspace. Never guess a lead match from a company name. Does not create or enroll outreach leads.
| Argument | Type | Notes |
|---|---|---|
id | uuid | required. |
company_id | uuid | required. |
name | string | required. |
email | required. | |
role | string | required. |
lead_id | uuid | required. |
Append a dated note, meeting, reply, product engagement, risk, or milestone, with its source link. Use evidence, not assumptions. Source names are attribution, not provider verification. Does not read a provider or send to Slack. A note never refreshes contact recency.
| Argument | Type | Notes |
|---|---|---|
id | uuid | required. |
company_id | uuid | required. |
kind | note, meeting, reply, product_engagement, risk, milestone | required. |
source | manual, eve, notion, fathom, granola, calendar, slack, stripe | required. |
title | string | required. |
body | string | required. |
occurred_at | date-time | required. |
source_url | uri | required. |
POST /api/v1/webhooks with the same key, see /docs/api.Questions: hello@pumpgtm.com.
| If you want to | Read |
|---|---|
| Understand what this server automates | What is an AI SDR? A plain explanation for founders |
| Decide your first sales hire | Your first sales hire: a human SDR, or an AI SDR? |
| Understand the closed loop behind the tools | AI GTM engine: the system we run for YC startups |
| Book meetings from LinkedIn at scale | LinkedIn outbound playbook: 30+ enterprise meetings a week |
| Write the first message | A cold message that gets replies: 3 rules from 10+ YC startups |
| Compare MCP-capable outreach tools | LinkedIn outreach tools with an MCP server (2026) |
| Score leads before you reach out | LinkedIn lead scoring: filter leads before outreach |
| See a customer result | How PumpGTM helped Supermemory find customers |
| Give many users or clients their own workspace | PumpGTM for platforms and agencies |
| Hand an agent everything at once | pumpgtm.com/llms.txt |
pumpgtm.com · Docs · Start a workspace · X · YouTube · Privacy policy · Support: hello@pumpgtm.com
Built by Giga Next Inc., San Francisco. Documentation and schemas in this repository are MIT licensed; the hosted service is a commercial product.