TL;DR. Two tools, one MCP, one credit pool. list_warm_visitors tells you which humans are on your site right now. list_third_party_signals tells you which companies just hit a buying-intent event off your site: funding rounds, hiring spikes, leadership changes, 8-K filings, G2 reviews, news mentions, LinkedIn engagement. They live in the same MCP. They share the same credit pool. They compose in one chat session. Already installed Warmly's MCP from last week? Run /mcp in Claude Code, the new tool is there. Per-row credits with monthly dedupe. How Credits Work below.
The Pair Is The Point
Most B2B teams I talk to have the same setup. One vendor for website visitor identification. A different vendor for third-party intent. A third for company enrichment. And an internal data engineer stitching the three together with overnight Airflow jobs nobody fully understands.
That worked when revenue ops bought tools and reps used them. It stops working the moment your team starts asking an AI agent to do the work.
Agents don't want three platforms with three UIs and three OAuth flows. They want one tool surface they can query in one breath. That's why last week's list_warm_visitors and this week's list_third_party_signals ship as a pair.
The pair is what unlocks queries you couldn't ask anywhere else:
- "Show me everyone on my site today whose company also raised a Series A or B in the past 60 days."
- "Of the accounts we closed-lost in 2025, which ones just hired a new VP Marketing this quarter?"
- "Rank today's anonymous visitors by how many third-party signals their company has fired in the past 30 days."
Three years ago each of those was a Saturday afternoon of CSV wrangling. Now they're two MCP calls and a join. The rest of this post is the API contract, the credit model, eight specific playbooks that chain both tools.
Install in 30 Seconds
The whole point of MCP is that you don't read a doc, you paste one line. Two paths to first byte: MCP for agents, REST for everything else. Both ship today.
Option 1: MCP (Claude Code, Claude Desktop, Cursor, Zed)
One line in your terminal:
claude mcp add --transport http warmly https://opps-api.getwarmly.com/api/mcp
Authorize via OAuth in the browser. Then in Claude Code:
/mcp
// you should see: warmly (4 tools available)
// list_warm_visitors
// list_warm_accounts
// list_third_party_signals
// get_credits_remaining
First call, paste-ready, costs zero credits because preview: true:
Use list_third_party_signals to preview how many companies have
fired a jobChange signal in the past 30 days. Mode by_signal,
signalSubtype jobChange, detectedSince 30 days ago, preview true.
Claude will call the tool, return a total count, and not touch your credit pool. That's the pattern: preview first, decide, commit. If you already installed the MCP from last week's launch, you don't need to re-install. list_third_party_signals is already in your tool list.
Option 2: REST
Same tool, callable via HTTP. POST /api/agent-tools/execute with a bearer token. API keys live in the Warmly admin under Settings → API Keys, issued per organization.
curl -X POST https://opps-api.getwarmly.com/api/agent-tools/execute \
-H "Authorization: Bearer $WARMLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"toolName": "list_third_party_signals",
"organizationId": "<your-org-id>",
"input": {
"mode": "by_signal",
"signalCategory": "workforce",
"signalSubtype": "hiringSalesRoles",
"detectedSince": "2026-05-12T00:00:00Z",
"take": 25,
"preview": true
}
}'
The by_company mode swaps the body for a single domain:
curl -X POST https://opps-api.getwarmly.com/api/agent-tools/execute \
-H "Authorization: Bearer $WARMLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"toolName": "list_third_party_signals",
"organizationId": "<your-org-id>",
"input": {
"mode": "by_company",
"companyDomain": "acme.com",
"detectedSince": "2026-04-12T00:00:00Z",
"take": 50
}
}'
Full endpoint reference and additional examples in last week's REST API section.
The Other Two Tools You Get Free
Same MCP surface, no extra install:
list_warm_visitors: the identified humans on your site right now. Free reads against your existing Warmly subscription.
get_credits_remaining: how many third-party-signal credits are left in the current month, with the reset timestamp. Useful before a large pull. Free.
Now the conceptual model.
The Tool
list_third_party_signals is one tool with two modes.
Mode 1: by_signal (the default). "Which companies are showing this signal right now?" Pass a signalCategory, signalType, or signalSubtype and get a flat list of companies (with contacts where they resolve) that fired on that signal in your time window. This is the discovery mode.
Mode 2: by_company. "What signals fired on acme.com recently?" Pass a companyDomain and get every recent signal on that account, collapsed into a single row. This is the enrichment mode.
Three filter levels, broad to narrow. signalCategory (31 buckets like financial, leadership, workforce, buying-intent). signalType (25 events like eight_k_filing, hiring-trends, glassdoor-review). signalSubtype (about 395 in production: jobChange, fundingNews, hiringSalesRoles, acquisition, and so on). Pick the level that matches how specific your query is. Full catalog of types and subtypes is in The Full Signal Catalog below.
Use exact names from the catalog. Claude will hallucinate plausible-sounding signal names from higher-level intent — it will ask for executiveChange (not a real subtype) instead of ceoChange, cfoChange, cooChange; or fundingNews instead of debtRefinancing, capexIncrease. Either reference the full catalog below, or drop to the broader signalCategory level and let the MCP fan out. If a query returns zero, the most likely cause is a hallucinated subtype, not missing data.
Mode 1 · Discovery
by_signal
"Which companies fired this signal?"
signalType: "hiring-trends"
signalSubtype: "hiringSalesRoles"
detectedSince: "30 days ago"
↓
acme.combeta.iogamma.codelta.ai+ 996 more
Use when you don't have a list yet. Build a universe from one signal type, then filter.
Mode 2 · Enrichment
by_company
"What signals fired on this account?"
companyDomain: "acme.com"
detectedSince: "60 days ago"
↓
hiring-trends · 12 SDR roles, +220%workmilestone · new VP Sales, day 47eight_k_filing · acquisition announcedg2-product-review · switching intent
Use when you already have the list. Enrich each known account with every signal.
Two Flows, One Pattern
Preview first, then commit. preview: true never charges a credit. It returns the total count so you (or your agent) can decide whether the spend is worth it before running it for real.
Flow 1: "Give me the best 1,000 ICP companies with signals"
You don't have a list yet. You want every in-market account showing a signal you care about. ICP filter on top.
list_third_party_signals(
mode: "by_signal",
signalCategories: ["workforce", "leadership", "financial", "strategic"],
detectedSince: "2026-05-15",
take: 500,
preview: true
)
// returns total: 4,200 - your potential universe
Then pull 500 at a time with offset. Each row costs 1 credit per new company plus 1 per new contact, where new means "first time you've pulled them this calendar month."
Flow 2: "Here are 200 accounts, enrich them"
You already have the list (CRM export, ABM list, last quarter's closed-lost pile). You want to know which of them are warm right now.
for domain in account_list:
list_third_party_signals(
mode: "by_company",
companyDomain: domain,
detectedSince: "2026-03-15",
preview: true
)
// say 60 of 200 domains return signals
// only pull rows for those 60
// cost: 60 company credits worst case, often less
Library card, not meter. Once you've paid for Acme this month, every other row returning Acme is free. Run the same query the next morning, you pay nothing. You're paying for the accounts and contacts you've unlocked, not the API calls you make.
Filter after, not before. The MCP doesn't support server-side ICP filters on list_third_party_signals yet — you can't pass industry: SaaS, employees: 200-2000 as a filter on the query. The workflow is: pull a signal-matched company set, then filter to ICP in the agent's next step. The library-card model makes this cheap on the re-pull, but it does mean your first query for a signal type returns the broad universe. If you have a tight ICP, start with Flow 2 (enrich a known account list) instead.
Server-side filters land next. country and employee_size filters on list_third_party_signals are shipping in the next release — bringing it to parity with list_warm_visitors and list_warm_accounts, which already accept those filters. Once shipped, the recommended pattern flips: filter to ICP then commit credits, so you preview a 1,000-row result with country: ["US", "CA"] and employee_size: "200-2000" already applied, then pull only what fits your ICP. Email alan@warmly.ai if you want a heads-up the day it lands.
Each of these chains list_warm_visitors with list_third_party_signals or composes signal queries against each other. Paste any of them into Claude Code, Claude Desktop, or any agent connected to the Warmly MCP. None of them work as a single tool call in a competing product, because no other vendor ships first-party and third-party signals in the same agent surface.
1. The white-hot list: site visitors whose company just raised
Setup: The single highest-conversion outbound trigger we've measured. New funding means new budget, new hiring, and a CFO under pressure to deploy capital. A funded company already on your site is borderline inbound.
Prompt: "List every company on my warm visitors from the past 7 days whose company also has a signalCategory: financial event with signalSubtype: fundingNews in the past 60 days. For each, show me the visitor, the funding round size, and draft a 2-line opener referencing the round."
Why it works: You collapse two intent signals onto the same row. Site visit (active research) plus funding event (capacity to buy). The reps stop guessing which of today's 400 anonymous visitors to chase.
2. The 30-90 day VP play: "new exec, post-honeymoon"
Setup: Job changes are the highest-conviction third-party signal in B2B. The window that actually converts isn't day one. It's days 30 through 90. Before 30 days they're still figuring out the laptop. After 90 days they've already picked their stack.
Prompt: "Find VPs and above of Marketing or Sales who started new roles between 30 and 90 days ago at 200-2,000 employee B2B SaaS companies. Use signalType: workmilestone with signalSubtype: jobChange and detectedSince: 90 days ago and exclude anyone whose detectedAt is within the past 30 days. Show me 25."
Why it works: The off-by-one filter is the trick most signal tools skip. You're filtering by the gap between detection and today, not just detection. That's what produces meeting bookings instead of "sorry, I just started, ping me in Q4."
3. Closed-lost re-engagement, signal-gated
Setup: Every B2B team has a closed-lost pile that's three years deep and 5,000 accounts wide. Most of them are still dead. Some of them aren't, and you'd want to know which.
Prompt: "For each domain in my closed-lost list, run list_third_party_signals in by_company mode with preview: true. Return only the accounts with total > 2 signals in the past 30 days where at least one signal has sentiment: positive. That's my re-engagement list for next week."
Why it works: Preview is free. You run it across all 5,000 domains overnight, pay zero credits, and wake up to a list of 80 accounts that have moved. The library-card credit model means re-running this every Monday costs almost nothing once you've paid for the warm ones once.
4. Hiring spike plus competitor engagement
Setup: A company hiring 12 SDRs this month and whose marketers are commenting on your competitor's LinkedIn posts is a company that is buying outbound tooling, and they haven't found you yet.
Prompt: "Pull signalType: hiring-trends with signalSubtype: hiringSalesRoles from the past 30 days. Separately pull signalType: linkedin-comment from the past 14 days where the post author is one of these competitor handles: [list]. Intersect the company domains. Show me overlap."
Why it works: Two-signal intersection cuts noise. Hiring alone is a year-out signal. LinkedIn engagement with a competitor is a 60-day signal. Together they're a 30-day signal.
5. The 8-K re-stack
Setup: Public-company filings hit the wire and there's a 2-4 week window before everyone notices. Acquisitions, CEO changes, and restructurings all create budget redirections that competitive sellers miss.
Prompt: "List every signalType: eight_k_filing in the past 14 days where the signalSubtype is acquisition, restructuring, or executiveChange. For each, return the filing date, the company, the relevant details, and any contact resolved on the row."
Why it works: SEC filings are public but most sales orgs don't watch them. The signal is high-signal precisely because it's high-friction to consume manually. MCP collapses the friction.
6. The Glassdoor wedge
Setup: Bad employee sentiment about comp or leadership correlates with executive openness to "anything different." The reps who run this play book three times the meetings of the reps who don't.
Prompt: "For my target account list, find any account where signalType: glassdoor-review with signalSubtype: glassdoorCompensationDissatisfaction or brandReputation fired in the past 60 days, with sentiment: negative. Show me which heads of People or RevOps are on LinkedIn for each."
Why it works: You're not selling to the angry employees. You're selling to the executive whose CFO is asking why retention numbers tanked. Glassdoor gives you the wedge to start the conversation.
7. Site visit ranked by signal density
Setup: Site visits alone don't tell you priority. A first-time visitor from a sleepy 80-person SaaS and a return visitor from a Series C company that just hired a VP Sales are not the same lead. Signal density is the priority key.
Prompt: "Pull today's list_warm_visitors. For each unique company domain, call list_third_party_signals in by_company mode with detectedSince: 30 days ago and preview: true. Rank visitors by total descending. Show me the top 20 with their visitor count, signal count, and primary signal categories."
Why it works: Preview keeps it free. You get a ranked priority list every morning before standup. The reps stop arguing about which lead to call first.
8. The job-change boomerang
Setup: Half of your former champions are still relevant to your pipeline. They just work somewhere else now. Knowing where, and when, is a sustained source of warm openers.
Prompt: "Pull all contacts from my CRM whose primary email is now bouncing. For each, search list_third_party_signals with signalType: workmilestone and signalSubtype: jobChange in the past 6 months. Match by name plus old company. Return new company, new title, LinkedIn URL. Draft a 'congrats on the new role' opener referencing what we worked on together at the old place."
Why it works: Your old champions are pre-warmed to take your call. Their new employer doesn't have a vendor relationship with you yet. That's a clean pull through to a new logo.
How Credits Work
Read this part carefully because third-party signals is the only Warmly tool that draws credits per row. Reads of warm visitors and warm accounts stay free.
What charges:
- 1 credit per new company on a row. Dedupe key: the company's primary
domain. First time you pull acme.com this month: 1 credit. Every subsequent row that resolves to acme.com: free.
- 1 credit per new contact on a row, when a contact resolves. Dedupe key: the contact's
email. First time jane@acme.com resolves this month: 1 credit. Same email pulled again later: free.
- Both dedupe ledgers reset at midnight EST on the 1st of each month, in lockstep with the credit quota refresh.
What doesn't charge:
preview: true calls. Always free.
by_company calls that return zero matching signals. No row, no credit.
- Re-pulls of any company or contact you've already paid for in the current dedupe window.
- The other Warmly MCP tools:
list_warm_visitors, list_warm_accounts, get_credits_remaining all free.
When the dedupe window resets. The dedupe ledger and the credit pool refresh together at the start of each calendar month. Whatever you paid for in June is free to re-pull until 11:59 PM on June 30. At midnight on July 1, the credit pool refills and the dedupe ledger clears — anything you pull on July 1 charges fresh, even if you pulled the same company in June. Your in-app credit meter shows the next reset date so you can plan large pulls accordingly.
Cap your spend in the prompt. Claude honors natural-language credit limits. Add a sentence like "don't use more than 100 credits" or "keep this under 500 credits total" to any query and the agent will preview first, narrow filters, and cut off the pull when the cap is approached. Pair with preview: true for a free dry-run before committing.
Worked example. Monday you pull 10 companies with hiring-velocity signals: 10 credits. Tuesday you pull 4 LinkedIn-comment signals where the contacts work at companies you already pulled Monday: 4 credits for the new contacts, zero for the companies. Run the same queries again Wednesday: zero credits. The dedupe matters more than people expect. You can run an agent loop daily across overlapping signal types without burning credits on stable accounts.
Over-charge gate. If a call would charge more credits than you have left in your monthly pool, the whole call is rejected with a structured error rather than partially charging. Drop the take size and retry, or upgrade.
The Full Signal Catalog
This is what's actually shipping in production today, pulled from the live signal stream. The MCP returns the same shape regardless of which source the signal came from, but the data sub-object varies by signal type. Treat the lists below as the queryable surface, not as documentation aspirations.
Coverage varies by source. Sections below are ordered by fill rate — News, LinkedIn, hiring, and work milestones are the most populated and refresh fastest. SEC filings cover the 4,500-company public-co universe deeply. Glassdoor and G2 cover most companies but are thinner per-row. Web & Social is the catch-all with the noisiest coverage — start with the higher-fill sources before falling back to it.
The Outer Envelope
Every row, every source, this shape:
{
"signal_id": "00600a80-1678-459c-a213-d193c7ececf3",
"signal_name": "Recognition",
"signal_type": "news",
"signal_subtype": "recognized_as",
"association": "company", // or "contact"
"detected_at": "2026-06-09T00:00:00Z",
"company": {
"name": "Acme Corp",
"domain": "acme.com",
"industries": ["Pharmaceutical Manufacturing"],
"employee_count_low": 1001,
"employee_count_high": 5000,
"linkedin_url": "linkedin.com/company/acme",
"ticker": null,
"description": null
},
"contact": {
"name": "Jane Doe",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@acme.com",
"job_title": "VP of Marketing",
"seniority_level": "vp",
"department": "marketing",
"linkedin_url": "linkedin.com/in/janedoe",
"city": "San Francisco",
"state": "CA",
"country": "US"
}, // null for company-only signals like SEC filings, news, hiring trends
"data": { ... } // varies by signal type, schemas below
}
The Eight Signal Sources
Every signal flows from one of eight source families currently live in the MCP. The Warmly MCP normalizes them into a single tool surface, but knowing the source helps you write better filters. Status notes below reflect the live MCP as of June 16, 2026.
Source family
signal_type
Refresh
Live volume
news
Weekly
~33k events
linkedin-post-company, linkedin-post-contact, linkedin-comment
Bi-weekly
~700k posts & comments
hiring-velocity, hiring-trends
Weekly
~290k events
workmilestone
Monthly
~1.5M events
g2-product-review
Monthly
~2.5k reviews
eight_k_filing, ten_k_filing, ten_q_filing, twenty_f_filing, six_k_filing
Weekly
~4k filings (public co)
glassdoor-review
Monthly
~52k reviews
youtube-video-*, reddit-mentions, github-initiative, patent-filing, social_media, website, website-traffic, financial
Monthly
~3.7M events
Volumes are rolling 90-day totals across all tenants as of June 2026. Each row below is the detail.
1. News & Press
The widest-funnel source. Use sparingly — high noise, but the occasional recognized_as award or partners_with announcement is a relationship opener. Refresh: weekly (~2M company refresh pool).
signal_type: news
- Top
signal_subtype values: launches, partners_with, receives_award, recognized_as, expands_offices_in, invests_into, attends_event, integrates_with, is_developing, decreases_headcount_by, retires_from, leaves, hires, plus event-based variants for funding, M&A, executive moves, customer wins, and product launches.
- Distinctive
data fields: title, url, body, overview, summary, article_sentence, published_at, found_at, effective_date, event, recognition, award, amount, contact, job_title, job_title_tags, headcount, financing_type, financing_type_tags, location, location_data, image_url, is_planned, product, product_data, product_tags, related_company_name, related_company_domain, ticker, vulnerability, confidence.
2. LinkedIn (Posts & Comments, by Company or Contact)
Real-time engagement intent. The signal that beats outbound — if a buyer is engaging publicly with the category, get in front of them this week, not next quarter. Refresh: company posts monthly, contact posts and comments bi-weekly (~2M company pool, ~4M contact pool).
signal_type: linkedin-post-company, linkedin-post-contact, linkedin-comment
signal_subtype: linkedinPost, linkedinPostComment
- Distinctive
data fields: post_url, post_text, posted_date, num_likes, num_comments, comment_text, comment_url, comment_posted_at, comment_num_likes, comment_num_comments, comment_summary, comment_intent, signal_quality, parent_post, topics, tags, initiatives, pain_points, relationship_context, technologies_mentioned, competitors_mentioned.
3. Hiring Signals (Velocity, Trends, Open Roles)
Company-level. Hiring spikes are 30-60 day predictors. Watch the rate-of-change, not the absolute count. Refresh: weekly (~21M company refresh pool).
signal_type: hiring-velocity, hiring-trends
signal_subtype (hiring-trends): hiringSalesRoles, hiringMarketingRoles, hiringEngineeringRoles, hiringOperationsRoles, hiringAdministrationRoles, hiringLogisticsRoles, hiringStrategyRoles, hiringProcurementRoles, hiringQualityAssuranceRoles, hiringInformationTechnologyRoles, hiringCorporateCommunicationsRoles
signal_subtype (hiring-velocity): hiringVelocity
- Distinctive
data fields: hiringVelocityPct, velocityChange, netFlowRate, historicalComparison, numberOfEmployees, numberOfOpenRoles, departments, locations, seniority, contracts, sample_urls, sample_titles, top_locations, signal_strength, open_roles_count, pct_of_headcount.
4. Work Milestones (Job Changes, Promotions, Anniversaries)
Person-level. The highest-conviction third-party signal in B2B. jobChange is the one that converts. Refresh: monthly (~4M contact refresh pool).
signal_type: workmilestone
signal_subtype: jobChange, promotion, workAnniversary
- Distinctive
data fields: new_job_title, new_job_description, new_job_location, previous_company_name, previous_company_domain, previous_job_title, previous_job_description, previous_job_location, months_since_event, work_anniversary_year, founded_new_company, event_date.
5. G2 Product Reviews
The most underused signal in outbound. Reviews of your competitors are warm leads. Filter to negative sentiment subtypes and you've got reps with a 6-month motivation window. Refresh: monthly (~2M company refresh pool).
signal_type: g2-product-review
signal_subtype: UsabilityIssues, MissingFeatures, ReliabilityIssues, PricingConcerns, IntegrationProblems, CustomerSupportComplaints, RecurringProductIssues, CompetitorMentions, ActiveChurn
- Distinctive
data fields: product_name, headline, summary, evidence (array of quote, review_url, review_date, star_rating, reviewer_name, reviewer_title), switching_intent, decision_maker_complaint, quantified_impact, source_page_url, competitors_mentioned, relevance.
6. SEC Filings (8-K, 10-K, 10-Q, 20-F, 6-K)
Public-company event filings. Highest credibility, longest tail. The 2-4 week window between filing and competitor awareness is where the alpha lives. Refresh: weekly (~4,500 public-co refresh pool for 8-K/10-K/10-Q, ~1,000 for 20-F/6-K).
signal_type: eight_k_filing, ten_k_filing, ten_q_filing, twenty_f_filing, six_k_filing
- Full
signal_subtype vocabulary: acquisitionAnnounced, acquisitionCompleted, ceoChange, cfoChange, cooChange, ctoChange, cisoChange, cioChange, boardChange, governanceChange, materialContract, majorContractWin, majorContractLoss, debtRefinancing, capexIncrease, restructuring, restructuringCharge, layoffs, bankruptcyProceeding, aiInvestment, cloudInvestment, dataInvestment, cybersecurityIncident, cybersecurityInvestment, automationInvestment, digitalTransformation, legacyModernization, platformStrategy, productLaunch, marketExpansion, internationalGrowth, marginPressure, cashFlowConcern, customerChurn, customerConcentration, supplyChainDisruption, litigationMaterial, regulatoryInvestigation, internalControlWeakness, carbonCommitment.
- Distinctive
data fields: filing_date, filing_year, fiscal_year_end, source_url, summary, excerpts, detail, metrics, pain_points, initiatives, competitors_mentioned, vendors_mentioned, technologies_mentioned, regions_mentioned, relevance, sentiment, confidence, sales_relevance, signal_category.
7. Glassdoor Reviews
Employee-side sentiment. The signal nobody on the buying side wants to admit they read, but they all do. Refresh: monthly (~2M company refresh pool).
signal_type: glassdoor-review
signal_subtype: glassdoorCompensationDissatisfaction, glassdoorPoorWorkLifeBalance, glassdoorHighCulturePraise, glassdoorGrowthOpportunities, glassdoorCrossFunctionalCollaborationIssues, glassdoorLackOfTransparency, glassdoorConsistentLeadershipComplaints, glassdoorRemoteWorkPraise, glassdoorOnboardingIssues
- Distinctive
data fields: job_titles, glassdoor_id, glassdoor_url, total_reviews, review_date_newest, review_date_oldest, recent_reviews_count, overallCompanyRatings (ceo_approval, culture_rating, overall_rating, business_outlook, management_rating, compensation_rating, recommend_to_friend, work_life_balance_rating, career_opportunities_rating), sentiment, summary, detail.
8. Web & Social
Catch-all for owned-media intent. Highest noise, but useful for niche segments (devtools watching open-source initiatives, founder-led companies watching Reddit, public companies watching patent filings). Refresh: monthly for most sources (YouTube, Reddit, GitHub, Twitter via social_media, website intelligence, traffic, patents, financials). github-initiative covers ~15M companies; SEO/traffic covers ~15M; tech-used (when exposed) ~218M.
signal_type: youtube-video-company, youtube-video-contact, reddit-mentions, github-initiative, patent-filing, social_media, website, website-traffic, financial
- Twitter content ships under
signal_type: social_media with signal_subtype: twitter_post.
- Top
signal_subtype values: youtubeVideo, twitter_post, linkedinPost, websiteUpdate, marketingChannel, brandingChange, technicalUpdate, featureUpdate, productUpdate, fundingNews, partnershipAnnouncement, eventAnnouncement, communityEngagement, noSignificantTrafficChange, trafficSurge, trafficDecline, newCorePatent, productization, intentionalExpansion, useCase, buyingIntent, brandReputation, negativeReview, industryTrend, painPoint, productFeedback, revenueDecline, earningsAcceleration.
- Distinctive
data fields: source_url, post_text, post_date, videoLink, viewCount, video_title, channelTitle, commentCount, video_description, tech_areas, uspto_assignee, newest_patent_date, patent_count_recent, traffic, engagement, traffic_band, top_countries, traffic_sources, change_3mo_pct, change_mom_pct, consecutive_months, topics, upvote_ratio, total_upvotes, total_comments, subreddits, post_author, buying_stage, ceo, sector, ticker, earnings_date, buyer_persona, talk_track, recommended_actions.
What's not in the MCP yet
A handful of source families are wired into our pipeline but not yet exposed as their own signal_type. If you need them, email me — we'll prioritize based on demand:
- Bombora B2B intent topics — surge data + topic taxonomy. Native refresh: daily.
- Hacker News mentions — submission and comment surfacing. Native refresh: daily.
- SEC Form D filings — private fundraising disclosures. Native refresh: 2× daily.
- Podcast appearances — guest-spot detection across major shows. Native refresh: daily.
- Product Hunt launches — native refresh: daily.
- Federal contract awards — USAspending.gov firehose. Native refresh: daily.
- New business formation — state-of-formation filings (~10,000+ new entities/day, 50-state coverage). Native refresh: daily.
- Conference & CFP events — tech and industry conferences via confs.tech. Native refresh: daily.
- Technographic data (tech-used) — first technographic family is on the roadmap above. Native refresh: monthly, ~218M companies in pool.
- Phone numbers — phone enrichment is billed separately in the Warmly credit meter but is not exposed through the MCP yet.
- Warmly write-MCP (orchestrator) — today, the MCP is read-only. To act on signals you bridge to
hubspot, outreach, customer.io, or instantly MCPs in the same chat (Claude picks the right tool). Next quarter we'll ship a Warmly write-MCP that sequences contacts back through Warmly orchestration in a single call — signals to outbound, one tool surface.
The Sort Keys That Matter
Every row carries three numbers the agent should sort on. They're inside data:
confidence (0.0 to 1.0): how sure the extractor is that the event happened.
relevance (0.0 to 1.0): how relevant the event is to B2B buying behavior. jobChange events score high here, generic news events score lower.
sales_relevance (LinkedIn signals): how likely the post or comment indicates active buying intent. Higher than relevance for engagement-driven signals.
sentiment: positive, neutral, negative. Crucial for review and Glassdoor filters.
signal_quality: a derived bucket used by the hiring-velocity stream.
The agent default sorts by relevance DESC, detected_at DESC, confidence DESC. Override in your prompt if you want recency over relevance or vice versa.
Pricing
Same credit pool as the rest of the API. Third-party signals draw from the credit pool you're already on. New customers get 250 free credits per month to try it.
Tier
Price
Credits/mo
$/credit
Annual
Free
$0
250
—
$0
Starter
$99/mo
500
$0.198
$1,188
Growth Popular
$199/mo
1,000
$0.199
$2,388
Pro
$499/mo
2,500
$0.200
$5,988
Enterprise
2,500+
—
Custom
Heavy users (multi-thousand-row daily pulls) want Enterprise. Annual commits get a better unit rate and we'll size the package off your signal mix. Talk to sales.
Troubleshooting
401 missing_org_context. You're multi-org and the call didn't carry one. Pass ?organization_id=<uuid> on the MCP URL or X-Warmly-Organization-Id as a header. REST: organizationId in the body.
403 on REST. The organizationId doesn't match the API key's org. Issue a new key for the right org.
429 / rate_limit. Per-minute call ceiling hit. Back off 60 seconds. Reduce parallelism.
- Empty result with
narrowQueryHint. Query is too broad and got capped at take. Add detectedSince, signalSubtype, or signalType.
- Empty result, no hint. Your filters genuinely matched zero. Loosen
signalSubtype to signalCategory, or widen detectedSince.
creditsConsumed: 0 but rows came back. Either preview: true is set, or every row was already paid for earlier this month. Both expected.
- Over-charge gate fired. Drop
take, narrow filters, or upgrade.
What's Coming
Roadmap:
- Write tools. Your agent pushes enriched contacts straight into HubSpot or Salesforce in the same call.
- Webhooks. Subscribe to "tell me when a
hiringSalesRoles signal fires at my ICP." No polling.
- Built-in signal-density ranking. A composite
relevanceScore so the agent doesn't have to sort by hand.
- More signal sources. Technographic data is the next family on the roadmap. Talking to providers now.
Want early access as features land? Email alan@warmly.ai.
This is the surface I want Warmly to be in 2026. Not a dashboard you log into. A data layer your agents talk to, with the first-party visitors and the third-party intent collapsed into one tool surface. Tell me what's missing. alan@warmly.ai.