Watching Companies for News and Funding with the Clay CLI
?q={your_question}.Watching Companies for News and Funding with the Clay CLI
Create a signal that fires when a tracked company appears in the news, using signals create --type News, whose topics filter looks like free text but is actually a closed vocabulary that matches nothing when the value doesn't match it.
What you will build
A Paused News signal watching a companies audience, narrowed by real topic categories and cost controls, plus a demonstration of what happens with an invalid topic string.
clay signals create --type News --input '{"entityType":"ACCOUNT","segmentIds":[...],"filters":{"topics":[...],"maxNewsCount":N,"maxNewsPerDomain":N}}'
↓
{ id (td_...), runStatus: "Paused" } ← creates successfully even with an invalid topic string
AI Prompt
Using the Clay CLI, create a signal watching a companies audience for news
and funding events, with real cost controls.
Requirements:
- `clay signals create --type News --input '{"entityType":"ACCOUNT",
"segmentIds":[...],"filters":{"topics":[...],"maxNewsCount":<1-50000>,
"maxNewsPerDomain":<1-50000>,"earliestPublishDate":"<YYYY-MM-DD>",
"autoAdvanceEarliestPublishDate":<bool>}}'`. "filters" is entirely
optional; omitting it means every article found counts.
- "topics" is typed as free text in the schema, but is actually a fixed
vocabulary (Fundraising, Executive Appointment, Merger & Acquisition,
Product Launch, Layoff, Legislation & Regulation, and dozens more).
Passing a topic string that isn't in the vocabulary creates the signal
successfully with no validation error; it just matches zero articles at
run time, which looks identical to "no news happened" rather than "you
misspelled a topic."
- News charges per event found, not per record checked, so maxNewsCount/
maxNewsPerDomain (defaults: 500/unset on an audiences signal) are the
real cost levers here, not the schedule.
- autoAdvanceEarliestPublishDate moves the earliest-date cutoff forward
as the signal runs, so each run only reads what's new since the last one.
- Run the verification step below before finishing.
Prerequisites
- The
clayCLI on PATH, authenticated viaclay login(an OAuth session, not a Public API key) - An existing companies audience segment
Note: JSON samples below are trimmed to the fields relevant to each step. Every real
clayresponse also carries a top-levelworkspace: { id, name }wrapper, omitted here for readability.
1. Create the signal with real topics and cost controls
clay signals create --type News --input '{
"entityType": "ACCOUNT",
"segmentIds": ["audseg_0tl84p1ZQ8RRShHSAdX"],
"filters": {
"topics": ["Fundraising", "Executive Appointment"],
"maxNewsCount": 25,
"maxNewsPerDomain": 2,
"autoAdvanceEarliestPublishDate": true
}
}' --name "TPC Batch3: Funding and exec news"
Real output:
{
"id": "td_0tlqaurmmoisKqc5i65",
"runStatus": "Paused",
"signal": {
"type": "News",
"inputs": {
"filters": {"topics": ["Fundraising", "Executive Appointment"], "maxNewsCount": 25, "maxNewsPerDomain": 2, "autoAdvanceEarliestPublishDate": true},
"entityType": "ACCOUNT",
"segmentIds": ["audseg_0tl84p1ZQ8RRShHSAdX"]
}
},
"schedule": {"periodAmount": 1, "periodUnit": "monthly"}
}
2. Create one with a made-up topic, and confirm it does not error
clay signals create --type News --input '{"entityType":"ACCOUNT","segmentIds":["audseg_0tl84p1ZQ8RRShHSAdX"],"filters":{"topics":["Totally Made Up Topic"]}}' --name "Invalid topic test"
This succeeds: runStatus: "Paused", no error of any kind, even though "Totally Made Up Topic" isn't one of the real vocabulary values. At run time this signal would find zero matches, indistinguishable from a correctly-configured signal watching quiet companies.
Verify the result
Confirm the behavior above holds by re-running the key command and checking the result:
clay signals create --type News --input '{"entityType":"ACCOUNT","segmentIds":["audseg_0tl84p1ZQ8RRShHSAdX"],"filters":{"topics":["Fundraising","Executive Appointment"],"maxNewsCount":25,"maxNewsPerDomain":2}}'
Expected: a real Paused News signal is created with the filter object echoed back exactly as submitted; a topic string outside the real vocabulary is also accepted without error, silently matching nothing.
How it works
topics is schema-typed as a plain string array because the CLI doesn't enforce the vocabulary client-side. Validation of topic values happens only at match time, against real article classifications, not at signal-creation time against a fixed enum. This is an asymmetry worth noting: most other bad inputs to signal creation fail fast (bad startFrom, bad entityType, a nonexistent segment id), but a misspelled topic passes creation and only becomes apparent when the signal never fires.
Common issues
A misspelled or invalid topic creating a signal that "just never fires"
It's easy to assume any rejected value would surface as a creation-time error, the way most other bad inputs do. In practice, invalid topics validate successfully and simply match nothing. Copy topic names exactly from the real vocabulary (spelled out in signals create --help) rather than guessing a plausible-sounding category.
Assuming the schedule is the main cost lever for News signals
For JobChange/Promotion, a tighter filter (confidence) is the main lever, and schedule matters less. News instead charges per event found, so maxNewsCount/maxNewsPerDomain are the real cost controls here: a loosely-scoped News signal on a large audience with no caps can produce far more events per run than a JobChange signal typically would.
Next steps
- Cross-check what actually fired later with
clay audiences signals get --segment-id ... --signal-types News. - Pair with
clay signals update --input '{"filters":{"maxNewsCount":...}}'to tighten cost controls after seeing real run volume.
verification:
status: verified
tested_at: "2026-09-21"
product_version: "clay CLI 1.2.0"
command: "clay signals create --type News --input '{\"entityType\":\"ACCOUNT\",\"segmentIds\":[\"audseg_0tl84p1ZQ8RRShHSAdX\"],\"filters\":{\"topics\":[\"Totally Made Up Topic\"]}}'"
expected_result: "The signal is created successfully (Paused, no error) even with a topic string outside the real vocabulary, confirming topics validates as free text and fails silently at match time rather than at creation time."