Skip to main content
A Company Entity Watcher monitors a list of companies you supply and notifies you when their profiles change. Provide the companies (by domain, name, profile URL, or Crustdata company ID) and describe what to watch for. On each scheduled run, the watcher diffs every company against its last snapshot and delivers only what changed. The list is yours to edit any time — add or remove companies without recreating the watch. Where a Company Discovery Watcher finds new companies that match a filter, an Entity Watcher tracks a known set — a book of accounts, a competitor list, a portfolio — and surfaces movement within it:
  • A tracked company changes headcount or crosses a headcount threshold.
  • A tracked company appears in the news, raises funding, or adds an investor.
  • A tracked company rebrands, relocates its HQ, or shifts industry.
Companies have their own create endpoint:
Every request needs the x-api-version: 2025-11-01 header and a Bearer token. Replace YOUR_API_KEY with your key. This endpoint is open to all API customers — no per-endpoint grant needed.
Pricing — you pay only for notifications. Every watch’s first run is a free baseline: it records each company’s starting values internally for diffing (never delivered) and never fires. After that you pay 5 credits per notification — 5 credits for each watched company that changed on a run. A run that surfaces nothing costs nothing, and the price is the same whether you check hourly or monthly. If your balance is too low, the run is suspended rather than partially delivered. See Pricing for the full breakdown.

How a company entity watcher runs

1

Create the watch

POST your entities (companies to watch), a track (what to watch for), a config (schedule + caps), and one or more notifications channels. The response returns the full watch object, including its id.
2

Baseline run (free)

On the first run, the watcher records an internal snapshot of the fields you’re tracking — just enough to diff next time. With no prior snapshot to compare, the baseline never fires and is never charged, and isn’t delivered; it only establishes “before”. To read a company’s current profile on demand, use the Enrich APIs.
3

Recurring runs

On your schedule (every_hours), the watcher re-checks each company, diffs it against its last snapshot, and delivers a notification for every company whose track condition just became true. You’re charged 5 credits per notification.
An Entity Watcher fires only on a transition — the moment a value crosses from its previous state to a new one. It never fires on the baseline and won’t re-notify you about a change it already reported. To read a list’s current state on demand instead of watching for change, use the Company Enrich API.

What you can track

The track describes the change that triggers a notification. It’s a tree of condition leaves, optionally combined with and / or groups. A leaf has the shape:
Crustdata writes “greater-than-or-equal” as => and “less-than-or-equal” as =< — not >= / <=. Those reversed forms return unknown operator.
value is required for the comparison operators, and omitted for changed and added. Combine leaves with a group node — { "op": "and" | "or", "conditions": [ … ] } — to watch for several signals at once. An or group fires if any child fires; an and group fires only when all its conditions hold and at least one just became true.

Common company signals

These are examples — a company profile has 500+ addressable fields, and you can track any of them (any scalar with changed, any array with added).
field paths address the same profile structure the Enrich API returns, so you can browse every trackable field in the Company Enrich reference. changed requires a scalar path, added requires an array path — mixing them returns a 400 (e.g. "changed" on the array news is rejected; use "added").

Recipes: combine signals

Group leaves with or to fire on any of several signals, or and to require them together. These track blocks are all live-verified:
Drop any of these into the track field of a create request. Groups can nest, so you can mix and/or — e.g. “a headcount change and the company crossed 1,000 employees.”

track and fields are different

These are two independent knobs, and the distinction matters: Set them independently. You can track one field but deliver many (watch for a headcount change, yet receive full funding history and news in the payload), or track many and deliver few. track decides whether you get a notification; fields decides what’s inside it.
fields defaults to a minimal projection. Omit fields and the delivered record contains only basic_info.The field you’re tracking is not automatically added to the payload. The fired changes array always tells you exactly what moved, but to get the surrounding profile data in record, request it in fields.

Requesting all fields

fields does not affect pricing — an entity watch is a flat 5 credits per notification no matter how many field groups you deliver (see Pricing). There’s no cost reason to keep the payload thin; request whatever your workflow needs. There’s no wildcard — to receive the complete record, list every field group your API key is entitled to. fields is a top-level key (sibling of track), fixed at create time.
Company — all fields
Some groups require a field-level entitlement on your key (e.g. technographics). Requesting one you aren’t entitled to returns a field-permission error, so list only the groups your key can access. Group names match the Enrich API — see the Company Enrich fields reference.

Choosing the companies

entities is an object mapping an identifier type to a list of values. You can mix identifier types in one watch. A single watch holds up to 10,000 companies.

Schedule and limits

The config block controls timing and result caps:

Delivery channels

Add one or more channels to notifications and every change fans out to all of them.
At least one notification channel is required. Every delivery is also recorded, so beyond the live push you can re-read a watch’s past runs from the run-history endpoint.

Quick start

Watch two companies and get a Slack message whenever either changes headcount or appears in the news. This request and response are real:

Edit the watched list any time

Unlike a saved search, an Entity Watcher’s list is mutable — add or remove companies as your account book or portfolio changes, without recreating the watch. PATCH the watch with a new entities object:
Newly added companies are baselined silently on the next run — they establish their “before” snapshot first, so adding one never fires a spurious notification. You can also PATCH status (active / paused), config, and notifications. A watch’s track and fields are fixed once created; to change what you watch for, create a new watch.

Manage your watches

Full request/response for each, verified live:
Returns an array of your company watches. Filter with status, page with limit and offset.
last_run_at is null until the baseline run completes, then carries the timestamp of the most recent run.
A paused watch stops running until you resume it. Send { "status": "active" } to resume.
Request
Returns 204 No Content. Deletion is terminal — the watch cannot be resumed.

What a notification looks like

Every fired company carries two things: the changes array (exactly what moved, independent of fields) and a record (the company’s current data projected to the fields you requested — the same shape the Enrich API returns, so with the default fields it’s just basic_info). The company’s identity travels inside the record as crustdata_company_id. There are two ways to receive these, and they use different envelopes:

Pushed to your webhook

When a watch fires, we POST this body to each channel. The example below is from a watch created with fields: ["basic_info", "headcount", "news"]:
Webhook POST body
For an entity watch, results is a flat list — one object per fired company, each with its own changes and record. A changed scalar reports as { "field": …, "type": "changed", "from": …, "to": … }; an added array reports as { "field": …, "type": "added", "new_elements": [ … ] }.

Pulled from run history

To re-read a past run — or audit exactly what was delivered — the run-history endpoint returns the same content under a different envelope:
GET /watcher/watches/{id}/runs/{run_id}/summary

Rate limits

Watch-management requests are rate-limited to 10 requests per minute per API key. This bounds bursty create/update loops; steady use is unaffected.

Company Discovery Watcher

Need to find new matching companies instead of watching a known list? Use the Company Discovery Watcher.

Company field reference

Browse the full set of trackable field paths for companies.