- 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.
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
Thetrack 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 withchanged, 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 withor to fire on any of several signals, or and to require them together. These track blocks are all live-verified:
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.
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
Theconfig block controls timing and result caps:
Delivery channels
Add one or more channels tonotifications 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:
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:
List your watches — GET /watch/company
List your watches — GET /watch/company
status, page with limit and offset.Get one watch — GET /watch/company/{id}
Get one watch — GET /watch/company/{id}
last_run_at is null until the baseline run completes, then carries the timestamp of the most recent run.Pause or resume — PATCH status
Pause or resume — PATCH status
{ "status": "active" } to resume.Delete a watch — DELETE /watch/company/{id}
Delete a watch — DELETE /watch/company/{id}
Request
204 No Content. Deletion is terminal — the watch cannot be resumed.What a notification looks like
Every fired company carries two things: thechanges 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, wePOST this body to each channel. The example below is from
a watch created with fields: ["basic_info", "headcount", "news"]:
Webhook POST body
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.
