A Person Discovery Watcher re-runs a Person Search on a schedule and delivers new matches to your channel.
POST https://api.crustdata.com/watch/person/search
Pricing: first run is a free baseline (up to 5 matches), then
0.5 credits per new person delivered.
Request body
Field Required Description filtersYes A filter tree, identical to Person Search . { "op": "and"|"or", "conditions": [ { "field", "type", "value" } ] }. config.triggerYes { "type": "interval", "every_hours": N } — how often the watch runs (e.g. 1, 6, 24, 168).config.max_results_per_runNo Max records delivered per run. Default 25. The first (baseline) run is always capped at 5. config.expires_atNo ISO date ("2027-01-01"). The watch auto-stops after this date. notificationsYes One or more delivery channels (see below ).
The response returns the watch id:
All examples require the headers authorization: Bearer YOUR_API_KEY,
content-type: application/json, and x-api-version: 2025-11-01. For the
full list of field values and operators, see the
Person Search reference .
Recipes
Persona: title + location
Alert daily when new ML engineers in Paris appear:
curl --request POST \
--url https://api.crustdata.com/watch/person/search \
--header ' authorization: Bearer YOUR_API_KEY ' \
--header ' content-type: application/json ' \
--header ' x-api-version: 2025-11-01 ' \
--data ' {
"filters": {
"op": "and",
"conditions": [
{ "field": "experience.employment_details.current.title", "type": "(.)", "value": "Machine Learning Engineer" },
{ "field": "professional_network.location.raw", "type": "(.)", "value": "Paris" }
]
},
"config": { "trigger": { "type": "interval", "every_hours": 24 }, "max_results_per_run": 25 },
"notifications": [ { "type": "webhook", "url": "https://your-app.com/webhooks/crustdata" } ]
} '
Persona at a company-size band
New VPs of Finance at 51–500-employee companies :
curl --request POST \
--url https://api.crustdata.com/watch/person/search \
--header ' authorization: Bearer YOUR_API_KEY ' \
--header ' content-type: application/json ' \
--header ' x-api-version: 2025-11-01 ' \
--data ' {
"filters": {
"op": "and",
"conditions": [
{ "field": "experience.employment_details.current.title", "type": "in", "value": ["Chief Financial Officer", "VP Finance", "Vice President Finance"] },
{ "field": "experience.employment_details.current.company_headcount_latest", "type": "=>", "value": 51 },
{ "field": "experience.employment_details.current.company_headcount_latest", "type": "=<", "value": 500 }
]
},
"config": { "trigger": { "type": "interval", "every_hours": 24 } },
"notifications": [ { "type": "webhook", "url": "https://your-app.com/webhooks/crustdata" } ]
} '
Seniority + skills
New CXO-level people with machine-learning skills :
curl --request POST \
--url https://api.crustdata.com/watch/person/search \
--header ' authorization: Bearer YOUR_API_KEY ' \
--header ' content-type: application/json ' \
--header ' x-api-version: 2025-11-01 ' \
--data ' {
"filters": {
"op": "and",
"conditions": [
{ "field": "experience.employment_details.current.seniority_level", "type": "=", "value": "CXO" },
{ "field": "skills.professional_network_skills", "type": "(.)", "value": "machine learning" }
]
},
"config": { "trigger": { "type": "interval", "every_hours": 24 } },
"notifications": [ { "type": "slack", "webhook_url": "https://hooks.slack.com/services/T000/B000/XXXX" } ]
} '
Movement signal: recently changed jobs
People who recently changed jobs (a new decision-maker signal — best for sales/GTM):
curl --request POST \
--url https://api.crustdata.com/watch/person/search \
--header ' authorization: Bearer YOUR_API_KEY ' \
--header ' content-type: application/json ' \
--header ' x-api-version: 2025-11-01 ' \
--data ' {
"filters": {
"op": "and",
"conditions": [
{ "field": "experience.employment_details.current.title", "type": "(.)", "value": "VP of Sales" },
{ "field": "recently_changed_jobs", "type": "=", "value": true }
]
},
"config": { "trigger": { "type": "interval", "every_hours": 24 } },
"notifications": [ { "type": "webhook", "url": "https://your-app.com/webhooks/crustdata" } ]
} '
Education filter, excluding companies
Stanford alumni who are not currently at the big three:
curl --request POST \
--url https://api.crustdata.com/watch/person/search \
--header ' authorization: Bearer YOUR_API_KEY ' \
--header ' content-type: application/json ' \
--header ' x-api-version: 2025-11-01 ' \
--data ' {
"filters": {
"op": "and",
"conditions": [
{ "field": "education.schools.school", "type": "(.)", "value": "Stanford" },
{ "field": "experience.employment_details.current.company_name", "type": "not_in", "value": ["Google", "Meta", "Amazon"] }
]
},
"config": { "trigger": { "type": "interval", "every_hours": 168 } },
"notifications": [ { "type": "email", "to": ["sourcing@yourcompany.com"] } ]
} '
Delivery channels
Add one or more channels; matches fan out to all of them.
Webhook
Slack
Email
Multiple
{ " type " : " webhook " , " url " : " https://your-app.com/webhooks/crustdata " , " headers " : { " X-Watch-Name " : " ml-engineers-paris " } }
{ " type " : " slack " , " webhook_url " : " https://hooks.slack.com/services/T000/B000/XXXX " }
{ " type " : " email " , " to " : [ " sourcing@yourcompany.com " , " recruiter@yourcompany.com " ] }
[
{ " type " : " webhook " , " url " : " https://your-app.com/webhooks/crustdata " },
{ " type " : " slack " , " webhook_url " : " https://hooks.slack.com/services/T000/B000/XXXX " }
]
A Slack channel must be a genuine Slack incoming webhook
(https://hooks.slack.com/services/…). Any other URL will fail delivery.
Manage a watch
List runs
Run detail (delivered records)
Cancel a watch
curl --request GET \
--url ' https://api.crustdata.com/watcher/watches/46849/runs?limit=20 ' \
--header ' authorization: Bearer YOUR_API_KEY '
curl --request GET \
--url https://api.crustdata.com/watcher/watches/46849/runs/54811/summary \
--header ' authorization: Bearer YOUR_API_KEY '
curl --request DELETE \
--url https://api.crustdata.com/watcher/watches/46849 \
--header ' authorization: Bearer YOUR_API_KEY '
Pricing
Credits First run (baseline, up to 5 matches) Free Each new person delivered on later runs 0.5
You’re charged only for records actually delivered — never for a run that finds nothing new.