SteveSignalsDocs

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. 1

    You add a competitor

    Paste a website. Signals finds its LinkedIn, X, Instagram, review and ad accounts.

  2. 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. 3

    Every change becomes an event

    New ad, new review, page change: one event with the same base shape.

  4. 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
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
See the event shape