Skip to main content
POST
Create alert API

Frequently asked questions

Anything you can query. There are five practical shapes: adoption on a technology or category, churn on a technology or category, switch on a technology with a direction or across a category, an account watchlist (["churn","adoption"] on a domains scope, for any stack change on domains you name), and a whitespace entrant (an adoption alert plus missing_category_id, which fires when a domain adopts your anchor while still running nothing in the gap category).
It is in the create response as webhook_secret, prefixed whsec_. Store it immediately — it signs every delivery. You can also read it back later from the alert detail endpoint, which is the only other place it appears.
A guard against alerts that can never work. Each delivery carries at most 100 events, so a scope generating more events per hour than that can never drain its backlog and would deliver permanently stale data. At creation we estimate the scope’s rate over the last 7 days and reject the ones that are too hot, with guidance. The fix is always to narrow: add firmographic filters, raise min_confidence, or use a technology scope instead of a whole category.
It sets the initial watermark to that many days ago, so your very first sweep delivers real events instead of waiting for something new to happen. The default is 7 and the maximum is 30. Set it to 0 if you only want events from now on.
The watermark tracks how far through a specific scope we have delivered, so its meaning is bound to that scope. Changing the scope would make the watermark meaningless and either replay or skip events. Delete the alert and create a new one instead. Everything else — name, status, webhook URL, filters, cadence, delivery frequency — is editable.
Two independent knobs. filters.churn_reliability gates on the detection method and already defaults to ["high","medium"], which excludes technologies whose detection flaps. filters.min_confidence_label gates on the combined per-event score and applies to adoption too. Setting it to medium or higher drops single-scan churns, which are the bulk of the noise — around half of them turn out to be false positives on live re-detection.

Authorizations

Authorization
string
header
required

API key in format tapi_live_[32-char] (live) or tapi_test_[32-char] (test)

Body

application/json
name
string
required
Example:

"Who leaves Shopify (US, 51-200)"

signal_types
enum<string>[]
required

["churn","adoption"] means any stack change, which is the natural account watch. switch cannot be combined with the others because its event shape differs.

Available options:
churn,
adoption,
switch
Example:
webhook_url
string<uri>
required

HTTPS only. Private, internal and metadata hosts are rejected, and redirects are never followed.

Example:

"https://example.com/hooks/tc"

technology_id
integer

Technology scope. Must be a detectable technology.

Example:

2184

technology
string

Technology scope by exact name.

category_id
integer

Category scope. Re-resolved fresh at every sweep, so technologies added to the category are covered automatically.

domains
string[]

Domains scope — the account watchlist. 1 to 1,000 domains (100 on Free). Normalized to lowercase and deduped; invalid entries are rejected with the offending values.

Example:
segment_id
string

Audience scope. List audiences only; membership resolves live at each sweep.

direction
enum<string>
default:from

Switch alerts on a technology scope only. from is who left the anchor; to is who came to it.

Available options:
from,
to
missing_category_id
integer

Turns an adoption alert into a whitespace-entrant alert. Requires signal_types of exactly ["adoption"], a technology or category scope, and a category different from the anchor.

min_scans
integer

Whitespace precision gate. Defaults to 2 when missing_category_id is set.

Required range: 1 <= x <= 10
filters
object

Row-level filters applied to every sweep. Firmographic keys use the same vocabulary as the Signals API.

delivery_frequency
enum<string>
default:daily

daily batches a day's events into one digest delivery. hourly is a per-sweep drip. Independent of crawl_cadence.

Available options:
hourly,
daily
crawl_cadence
enum<string>
default:monthly

Domains scope on a paid plan only. Buys re-scans of the watched domains so the underlying data refreshes as fast as the subscription. Forced to monthly on other scopes.

Available options:
daily,
weekly,
monthly
backfill_days
integer
default:7

How far back the first sweep reaches. 0 means future events only.

Required range: 0 <= x <= 30

Response

Alert created. webhook_secret is returned here — store it.

success
boolean
Example:

true

data
object