Signals Tools

signals-tools detects buying-intent signals for a company by domain. Each signal is its own tool, plus an all-in-one detect_signal runner that fans out to every detector. Configurable execution order lets you front-load the cheapest, highest-confidence signals.

Endpoint

https://signals.gtm-engine.sh
TransportPath
MCP/mcp
REST/api/v0/{tool_name}

Tools

ToolTokensDescription
ping0Health check
detect_signal0Run all signal detections for a company
signal_socials_spike5Instagram/TikTok follower spikes
signal_hiring_role5Hiring for specific roles
signal_hiring_support5CX/support hiring
signal_hiring_sales_rep5SDR/BDR hiring
signal_hiring_sales_leadership5Sales leadership hiring
signal_hiring_sales_rep_repost5Reposted SDR roles (churn signal)
signal_trustpilot_negative_reviews5Negative Trustpilot reviews
signal_trustpilot_negative_support_reviews5Negative support-related reviews
signal_trustpilot_positive_reviews5Positive Trustpilot reviews
signal_technologies_identified5Detect tech stack on a website
set_signals_order0Configure signal execution order
get_signals_order0View current signal order

detect_signal itself is free — only the individual detectors that fire are charged.

Run the full battery for a domain in one call.

ParameterTypeRequiredDescription
domainstringYesCompany domain (e.g. "gymshark.com")
techsstring[]NoTech identifiers to match (e.g. ["zendesk.com", "intercom.com"]) — passed to signal_technologies_identified
$curl -X POST https://signals.gtm-engine.sh/api/v0/detect_signal \
> -H "Authorization: Bearer $GTM_ENGINE_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{"domain": "gymshark.com", "techs": ["zendesk.com", "intercom.com"]}'
1{
2 "domain": "gymshark.com",
3 "signals": [
4 {
5 "name": "signal_hiring_support",
6 "fired": true,
7 "evidence": [
8 { "title": "CX Team Lead", "url": "https://...", "source": "linkedin" }
9 ]
10 },
11 {
12 "name": "signal_trustpilot_negative_support_reviews",
13 "fired": true,
14 "score": 0.42,
15 "evidence": [
16 { "rating": 1, "snippet": "Terrible support response time...", "url": "https://..." }
17 ]
18 },
19 { "name": "signal_socials_spike", "fired": false }
20 ]
21}

The execution order is whatever set_signals_order configured (or the default). You can view it with get_signals_order.

Hiring signals

All hiring detectors scan job-board listings and LinkedIn job posts for the target domain.

ToolPattern matched
signal_hiring_roleAny role given via role parameter
signal_hiring_supportCustomer support / CX titles
signal_hiring_sales_repSDR / BDR / Account Executive
signal_hiring_sales_leadershipVP Sales, Head of Sales, Director of Sales
signal_hiring_sales_rep_repostThe same SDR/BDR role posted multiple times — strong churn indicator

Reposted SDR roles are particularly useful for a sales-aid pitch: it means the previous hire didn’t stick, and the team is feeling the pain.

$curl -X POST https://signals.gtm-engine.sh/api/v0/signal_hiring_role \
> -H "Authorization: Bearer $GTM_ENGINE_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{"domain": "siena.cx", "role": "Customer Support"}'

Trustpilot signals

ToolReturns
signal_trustpilot_negative_reviewsAll recent 1–2 star reviews
signal_trustpilot_negative_support_reviews1–2 star reviews with support keywords (response, agent, ticket, …)
signal_trustpilot_positive_reviewsRecent 4–5 star reviews

Negative support reviews are the strongest churn-prevention signal — they let your agent reach out before the customer leaves.

$curl -X POST https://signals.gtm-engine.sh/api/v0/signal_trustpilot_negative_support_reviews \
> -H "Authorization: Bearer $GTM_ENGINE_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{"domain": "mammaly.de"}'

Social spike signal

signal_socials_spike checks Instagram and TikTok follower counts against a recent baseline. A sustained jump is a marketing-momentum signal.

$curl -X POST https://signals.gtm-engine.sh/api/v0/signal_socials_spike \
> -H "Authorization: Bearer $GTM_ENGINE_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{"domain": "gymshark.com"}'

Technology signal

signal_technologies_identified checks the website’s HTML, headers, and tracking scripts for known stack identifiers (e.g. Zendesk, Intercom, Segment, Stripe).

ParameterTypeRequiredDescription
domainstringYesCompany domain
techsstring[]YesIdentifiers to match (e.g. ["zendesk.com", "intercom.com"])
$curl -X POST https://signals.gtm-engine.sh/api/v0/signal_technologies_identified \
> -H "Authorization: Bearer $GTM_ENGINE_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{"domain": "siena.cx", "techs": ["zendesk.com", "intercom.com"]}'
1{
2 "domain": "siena.cx",
3 "matched": ["zendesk.com"],
4 "evidence": [{ "tech": "zendesk.com", "source": "html", "snippet": "..." }]
5}

Configuring signal order

set_signals_order and get_signals_order let you control which detectors run first when you call detect_signal. Useful for putting the cheapest, highest-precision signals up front so you can short-circuit on the first match.

$# View current order
$curl https://signals.gtm-engine.sh/api/v0/get_signals_order \
> -H "Authorization: Bearer $GTM_ENGINE_API_KEY"
$
$# Set custom order
$curl -X POST https://signals.gtm-engine.sh/api/v0/set_signals_order \
> -H "Authorization: Bearer $GTM_ENGINE_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{
> "order": [
> "signal_hiring_sales_rep_repost",
> "signal_trustpilot_negative_support_reviews",
> "signal_hiring_support",
> "signal_socials_spike",
> "signal_technologies_identified"
> ]
> }'

Required environment variables (self-host)

Same as socials-tools:

VariableDescription
WORKOS_API_KEYAuth (production only)
STRIPE_SECRET_KEYBilling (production only)
WEB_TOOLS_API_KEYRequired
WEB_TOOLS_URLRequired
RAPIDAPI_LINKEDIN_API_KEYRequired
NEXT_PUBLIC_URLRequired

Next steps