Signals documentation
Competitor changes, as events your tools can use.
Signals watches your competitors' ads, reviews, posts, news, website and job postings, and turns every change into one clean event. Read it in the app, get it in Slack, or push it to Clay, Zapier, n8n or your own code.
POST https://your-app.com/signals-hook200
{
"version": 1,
"eventId": "df38433d-cc67-4467-ba3a-8892f7a50702",
"eventType": "website",
"subEventType": "website_change",
"action": "updated",
"signalType": "website.changed",
"competitor": { "name": "HubSpot", "domain": "hubspot.com" },
"detectedAt": "2026-10-27T15:08:27.064Z",
"relevance": {
"status": "relevant",
"shortSummary": "Breeze AI Credits Added"
},
"websiteResponse": {
"pageUrl": "https://www.hubspot.com/pricing",
"changes": [{ "type": "major", "title": "…" }]
}
}How it works
- 1
You add a competitor
Paste a website. Signals finds its LinkedIn, X, Instagram, review and ad accounts.
- 2
Trackers check on a schedule
Each source checks hourly, daily or weekly. The first check saves a starting point, so you get what is new, not old history.
- 3
Every change becomes an event
New ad, new review, page change: one event with the same base shape.
- 4
You get it where you work
Feed, Slack, daily email, webhook or the pull API.
The Signals feed: real ads from HubSpot, one row per signal

Every tracker, one page each
One shape for every event
Every webhook has the same common fields. Only the platform part changes: adsResponse, reviewResponse, socialPostResponse and so on.
version1
eventIdstring
eventType'ads' | 'reviews' | …
subEventType'google_ad' | 'g2_review' | …
action'new' | 'updated' | 'removed'
competitor{ name, domain, subjectKey }
occurredAtstring | null
detectedAtstring
relevance{ status, … }
<platform>Responseobject | null
metadataobject | null