Signals Tools

Buying-intent signals: hiring, Trustpilot, follower spikes, tech stack

The Signals category 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.

Tools

ToolCreditsDescription
detect_signal0Detect all signals for a company
signal_socials_spike5Detect Instagram/TikTok follower spikes
signal_hiring_role5Detect hiring for specific roles
signal_hiring_support5Detect CX/support hiring
signal_hiring_sales_rep5Detect SDR/BDR hiring
signal_hiring_sales_leadership5Detect sales leadership hiring
signal_hiring_sales_rep_repost5Detect reposted SDR roles (churn signal)
signal_trustpilot_negative_reviews5Detect negative Trustpilot reviews
signal_trustpilot_negative_support_reviews5Detect negative support-related Trustpilot reviews
signal_trustpilot_positive_reviews5Detect positive Trustpilot reviews
signal_technologies_identified5Detect a tech stack on a website
set_signals_order0Set signal execution order
get_signals_order0Get current signal execution 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")

By default the battery runs signal_hiring_role, signal_trustpilot_negative_support_reviews, and signal_socials_spike (order configurable via set_signals_order).

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

Returns an array of only the detectors that fired, each with signal_name and a data object (domain, is_detected, and a signal-specific metadata object). An empty array [] means nothing fired.

1[
2 {
3 "signal_name": "signal_hiring_role",
4 "data": {
5 "domain": "gymshark.com",
6 "is_detected": true,
7 "metadata": {
8 "matching_jobs_count": 2,
9 "matching_jobs": [
10 { "title": "CX Team Lead", "url": "https://job-boards.greenhouse.io/gymshark/jobs/123" }
11 ]
12 }
13 }
14 },
15 {
16 "signal_name": "signal_trustpilot_negative_support_reviews",
17 "data": {
18 "domain": "gymshark.com",
19 "is_detected": true,
20 "metadata": {
21 "trustpilot_url": "https://www.trustpilot.com/review/gymshark.com",
22 "negative_reviews_count": 3,
23 "negative_reviews": [
24 { "rating": 1, "title": "Awful support", "message": "Terrible support response time", "date": "2026-07-30" }
25 ]
26 }
27 }
28 }
29]

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, matched via the job_title_filters 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, a 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://api.gtm-tools.sh/api/v0/signal_hiring_role \
> -H "Authorization: Bearer $GTM_TOOLS_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{"domain": "siena.cx", "job_title_filters": "(customer support OR cx) NOT junior"}'

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://api.gtm-tools.sh/api/v0/signal_trustpilot_negative_support_reviews \
> -H "Authorization: Bearer $GTM_TOOLS_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://api.gtm-tools.sh/api/v0/signal_socials_spike \
> -H "Authorization: Bearer $GTM_TOOLS_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://api.gtm-tools.sh/api/v0/signal_technologies_identified \
> -H "Authorization: Bearer $GTM_TOOLS_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.

$# Get current order
$curl https://api.gtm-tools.sh/api/v0/get_signals_order \
> -H "Authorization: Bearer $GTM_TOOLS_API_KEY"
$
$# Set custom order
$curl -X POST https://api.gtm-tools.sh/api/v0/set_signals_order \
> -H "Authorization: Bearer $GTM_TOOLS_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"
> ]
> }'

Next steps