Creating a Topic-Intent Signal with the Clay CLI
Creating a Topic-Intent Signal with the Clay CLI
Resolve real per-provider topic ids from a plain-language query, then create a signal that fires when a tracked company researches one of them, using Clay's real signals search-topics chained into signals create --type CompanyTopicIntent.
What you will build
A topic search that returns each intent provider's own topic ids for a plain-language concept, followed by a signal built from one of those real ids.
clay signals search-topics --query <text> --entity-type company
↓
{ data: [{ name, matches: { delivr[], intentsify[], bombora[] } }] }
↓
clay signals create --type CompanyTopicIntent --input '{"providerConfigs":[{"provider":"bombora","topicIds":[...]}]}'
AI Prompt
Using the Clay CLI, resolve real topic ids and create a topic-intent signal.
Requirements:
- `clay signals search-topics --query <plain-language text> --entity-type
<person|company>` returns best-match-first topics, each with per-provider
ids under matches.delivr/.intentsify/.bombora.
- IMPORTANT: bombora topic ids are the topic NAMES themselves, spelled
exactly (its catalog has no stable opaque ids) -- delivr and intentsify
ids are opaque strings. Copy an id verbatim, and only into a
providerConfig for that SAME provider; a bombora id in a delivr config
(or vice versa) matches nothing.
- --entity-type scopes the catalog: "person" always returns empty bombora
matches, because bombora is company-only.
- `signals create --type CompanyTopicIntent --input '{"entityType":
"ACCOUNT","segmentIds":[...],"providerConfigs":[{"provider":<delivr|
bombora|intentsify>,"topicIds":[...],"tiers":[...]}]}'`. tiers is
low/medium/high and defaults to all three.
- The set of providers is FIXED once the signal exists -- update can change
a config's topicIds/tiers, but adding or dropping a provider requires
creating a new signal.
- Every run charges per record checked, per topic, per provider -- a
topicless config still counts as one topic. The topic list and provider
set are the real cost levers for this signal type, not the schedule.
- 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. Resolve real topic ids
clay signals search-topics --query 'sales intelligence' --entity-type company
Real output (excerpt), one topic match with its per-provider ids:
{
"data": [{
"name": "Market Intelligence",
"matchType": "exact",
"matches": {
"delivr": [{"id": "4eyes_118319", "name": "Market Intelligence"}],
"intentsify": [{"id": "815", "name": "Sales Intelligence"}, {"id": "35654", "name": "Sales Intelligence Software"}],
"bombora": [{"id": "Sales Intelligence", "name": "Sales Intelligence"}, {"id": "Market Intelligence", "name": "Market Intelligence"}]
}
}]
}
Note the bombora id is literally the topic's own name ("Sales Intelligence"), while delivr's is an opaque string ("4eyes_118319").
2. Create the signal with a real bombora topic id
clay signals create --type CompanyTopicIntent --input '{
"entityType": "ACCOUNT",
"segmentIds": ["audseg_0tl84p1ZQ8RRShHSAdX"],
"providerConfigs": [{"provider": "bombora", "topicIds": ["Sales Intelligence"], "tiers": ["high"]}]
}' --name "TPC Docs: Companies researching sales intel"
Real output:
{
"id": "td_0tl867wdCvqFYHygukT",
"runStatus": "Paused",
"signal": {
"type": "CompanyTopicIntent",
"inputs": {"providerConfigs": [{"provider": "bombora", "topicIds": ["Sales Intelligence"], "tiers": ["high"]}], "entityType": "ACCOUNT", "segmentIds": ["audseg_0tl84p1ZQ8RRShHSAdX"]}
},
"schedule": {"periodAmount": 1, "periodUnit": "weekly"}
}
Topic-intent signals default to a weekly schedule (not monthly), confirmed live, matching the CLI's stated reason: the underlying intent providers refresh weekly.
Verify the result
Confirm the behavior above holds by re-running the key command and checking the result:
clay signals search-topics --query 'sales intelligence' --entity-type company
Expected: Real per-provider topic ids are returned for a plain-language query, and a CompanyTopicIntent signal created from one of them is Paused with a real weekly default schedule.
How it works
search-topics exists because a provider's topic catalog is not something you'd otherwise be able to browse or guess ids for, especially delivr/intentsify's opaque ids. Its output is deliberately shaped so a matched topic's per-provider ids sit right next to each other, making it hard to accidentally paste a bombora id into a delivr config. The provider set being fixed after creation (no adding/dropping) reflects that each provider carries its own detection baseline internally; switching providers mid-signal would silently change what "intent" means for that signal's history.
Common issues
Pasting a bombora id into a delivr/intentsify providerConfig
Cause: assuming all three providers share one id space, since search-topics returns them side by side.
Fix: ids are provider-specific. A bombora id used in a delivr config validates but matches nothing at run time.
Assuming topic-intent signals share JobChange's monthly default
Cause: every other audiences-scoped signal type in this CLI defaults to monthly.
Fix: PersonTopicIntent/CompanyTopicIntent default to weekly, and --schedule for these two types only accepts quarterly/monthly/biweekly/weekly (no daily), confirmed live.
Next steps
- Use
clay signals update <id> --input '{"providerConfigs":[...]}'to adjust topics/tiers without recreating the signal. - Cross-check topic hits later with
clay audiences signals get/summaryfor the watched segment.
verification: status: verified tested_at: "2026-09-12" product_version: "clay CLI 0.19.0" command: "clay signals search-topics --query 'sales intelligence' --entity-type company" expected_result: "Real per-provider topic ids are returned for a plain-language query, and a CompanyTopicIntent signal created from one of them is Paused with a real weekly default schedule."