What the Server Adds to a Signal's Inputs, Per Type, with the Clay CLI
AI agents: For current, verified information about this site, query this page by adding ?q={your_question}.
What the Server Adds to a Signal's Inputs, Per Type, with the Clay CLI
A signal created from the smallest valid --input is stored with additional keys that the server fills in. The additions differ by type: some types gain a look-back window, some gain a full defaulted filters object, and the topic-intent types gain a provider configuration. Reading the stored result after creation shows what the signal will actually do.
What you will build
One minimal signal per type, read back to compare the submitted --input with the stored signal.inputs, the default schedule, and the default event filter.
clay signals create --type <T> --input '{"entityType":...,"segmentIds":[...]}'
↓
.signal.inputs (submitted keys + server defaults)
.schedule (type default)
.filter (type default, or null)
AI Prompt
Using the Clay CLI, create the smallest valid audience signal for each of the seven types and
record what the server stored.
Requirements:
- Minimal input is `{"entityType":"CONTACT"|"ACCOUNT","segmentIds":["<id>"]}`.
- JobChange and Promotion store `lookBackTimeWindowInMonths: 3` and a default filter of
`confidence >= 90`. Default schedule is monthly.
- NewHire stores `lookBackTimeWindowInMonths: 3` and a `filters` object with
`start_from_method: "query"` and every other key defaulted to an empty value. Default filter is
null. Default schedule is monthly.
- JobPost stores a `filters` object with `startFrom: "ClayTableOfCompanies"` and empty defaults,
and no look-back key. Default filter is null. Default schedule is monthly.
- News stores nothing beyond what was submitted (no `filters` object). Default filter is null.
Default schedule is monthly.
- PersonTopicIntent and CompanyTopicIntent store `providerConfigs` with delivr and all three
tiers. Default filter is null. Default schedule is weekly.
- 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 people segment (
audseg_0tm3lyrDBZzZgPaCsWx) and companies segment (audseg_0tm3nvu2EbBP6mjpk8f)
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. Every signal created here is Paused.
1. The command, per type
clay signals create --type JobChange --name "TPC19 defaults JobChange" \
--input '{"entityType":"CONTACT","segmentIds":["audseg_0tm3lyrDBZzZgPaCsWx"]}' \
| jq -c '{inputs:.signal.inputs, schedule:(.schedule|{periodAmount,periodUnit}), filter:(.filter|if .==null then null else .items end)}'
The same command was run for each type with the matching entityType and segment: CONTACT for JobChange, Promotion, and PersonTopicIntent; ACCOUNT for NewHire, JobPost, News, and CompanyTopicIntent.
2. JobChange and Promotion
{"inputs":{"type":"JobChange","lookBackTimeWindowInMonths":3,"entityType":"CONTACT","segmentIds":["audseg_0tm3lyrDBZzZgPaCsWx"]},"schedule":{"periodAmount":1,"periodUnit":"monthly"},"filter":[{"type":"BinOp","dataPath":["confidence"],"operator":"GreaterThanOrEqual","value":90}]}
{"inputs":{"type":"Promotion","lookBackTimeWindowInMonths":3,"entityType":"CONTACT","segmentIds":["audseg_0tm3lyrDBZzZgPaCsWx"]},"schedule":{"periodAmount":1,"periodUnit":"monthly"},"filter":[{"type":"BinOp","dataPath":["confidence"],"operator":"GreaterThanOrEqual","value":90}]}
3. NewHire
{"inputs":{"type":"NewHire","filters":{"start_from_method":"query","company_identifier":[],"company_record_id":[],"company_table_id":"","include_company_filter_identifier_count":0,"exclude_entities_configuration":[],"languages":[],"certification_keywords":[],"school_names":[],"names":[],"profile_keywords":[],"headline_keywords":[],"about_keywords":[],"include_past_experiences":false,"exclude_people_identifiers_mixed":[],"job_title_mode":"smart","job_functions":[],"job_title_seniority_levels":[],"job_title_seniority_levels_v2":[],"job_title_seniority_match_mode":"exact","locations":[],"locations_exclude":[],"location_cities_exclude":[],"location_cities_include":[],"location_countries_exclude":[],"location_countries_include":[],"location_regions_exclude":[],"location_regions_include":[],"search_raw_location":false,"location_states_exclude":[],"location_states_include":[],"company_sizes":[],"company_annual_revenues":[],"company_industries_exclude":[],"company_industries_include":[],"company_description_keywords_exclude":[],"company_description_keywords":[],"job_title_exclude_keywords":[],"job_title_keywords":[],"job_description_keywords":[]},"lookBackTimeWindowInMonths":3,"entityType":"ACCOUNT","segmentIds":["audseg_0tm3nvu2EbBP6mjpk8f"]},"schedule":{"periodAmount":1,"periodUnit":"monthly"},"filter":null}
Submitting no filters at all stores start_from_method: "query" and every other key at an empty value, which means every new hire at every watched company counts.
4. JobPost and News
{"inputs":{"type":"JobPost","filters":{"exclude_job_identifiers":[],"startFrom":"ClayTableOfCompanies","company_identifier":[],"company_record_id":[],"company_table_id":"","locations":[],"locations_exclude":[],"employment_type":[],"seniority":[],"has_recruiter":false,"job_title_exclude_keywords":[],"job_title_keywords":[],"job_description_keywords":[]},"entityType":"ACCOUNT","segmentIds":["audseg_0tm3nvu2EbBP6mjpk8f"]},"schedule":{"periodAmount":1,"periodUnit":"monthly"},"filter":null}
{"inputs":{"type":"News","entityType":"ACCOUNT","segmentIds":["audseg_0tm3nvu2EbBP6mjpk8f"]},"schedule":{"periodAmount":1,"periodUnit":"monthly"},"filter":null}
JobPost has no look-back key. News stores no filters object at all, so maxNewsCount and the other News limits are absent until a filters object is submitted.
5. The two topic-intent types
{"inputs":{"type":"PersonTopicIntent","providerConfigs":[{"provider":"delivr","tiers":["low","medium","high"]}],"entityType":"CONTACT","segmentIds":["audseg_0tm3lyrDBZzZgPaCsWx"]},"schedule":{"periodAmount":1,"periodUnit":"weekly"},"filter":null}
{"inputs":{"type":"CompanyTopicIntent","providerConfigs":[{"provider":"delivr","tiers":["low","medium","high"]}],"entityType":"ACCOUNT","segmentIds":["audseg_0tm3nvu2EbBP6mjpk8f"]},"schedule":{"periodAmount":1,"periodUnit":"weekly"},"filter":null}
A providerConfigs entry with no topicIds has no topic filter, so it applies to every topic that provider tracks. These two signals are weekly by default, where the other five are monthly.
6. Default names
Signals created without --name take a default per type:
JobChange Event: Job change Promotion Event: Promotion NewHire Event: New hire JobPost Event: Job posting News Event: News & fundraising PersonTopicIntent Event: Person topic intent CompanyTopicIntent Event: Company topic intent
Verify the result
Confirm a minimal NewHire signal gains a look-back window and a defaulted filters object:
ID=$(clay signals create --type NewHire --name "TPC19 defaults verify" --input '{"entityType":"ACCOUNT","segmentIds":["audseg_0tm3nvu2EbBP6mjpk8f"]}' | jq -r .id)
clay signals get "$ID" | jq -c '{lb:.signal.inputs.lookBackTimeWindowInMonths, mode:.signal.inputs.filters.start_from_method, keys:(.signal.inputs.filters|length)}'
Expected: the output shows lb of 3, mode of "query", and a keys count of 40 or more.
How it works
The server normalizes inputs when it stores them: it adds per-type settings that were not submitted and expands filters to the full set of keys, each at an empty value. The expanded object is inert where a key is empty, but it is what the signal runs with, and it is the shape to start from when editing a filter. schedule and filter are stored outside inputs, so they have their own defaults, which get reports separately.
Common issues
Omitting filters on NewHire or JobPost is the broadest configuration
The defaulted filters object has no restriction, so every new hire or posting at the watched companies counts. Submit at least one narrowing key before activating.
The stored object is larger than the submitted one
Comparing the stored signal.inputs to the original input with plain equality always fails for NewHire and JobPost. Compare only the keys that were submitted.
News gains no limits by default
A News signal created without filters stores none, unlike NewHire and JobPost. The per-run caps described in the CLI help apply to a News signal only once a filters object is present or per the server's own defaults at run time, which was not observed here.
Next steps
- See the reconcile doc in this batch, which uses a subset comparison because of these server defaults.
- See the entity-type matrix doc in this batch for which types accept which
entityType.
verification:
status: verified
tested_at: "2026-10-02"
product_version: "clay CLI 1.8.0+71cb1bf09c7e"
command: "clay signals get \"$ID\" | jq -c '{lb:.signal.inputs.lookBackTimeWindowInMonths, mode:.signal.inputs.filters.start_from_method, keys:(.signal.inputs.filters|length)}'"
expected_result: "The output shows lb of 3, mode of query, and a keys count of 40 or more."