Create Signal
Create a signal from a catalog preset.
The signal checks its provider daily and imports the qualified leads or
companies into a destination list it creates under the same name. Read
GET /v1/signals/presets first to pick the preset and learn which
detection filters it takes. The signal starts active and runs a first
check immediately.
Requires the signals:write scope on the API key.
curl --request POST \
--url https://api.topo.io/v1/signals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"search_filters": {},
"max_per_run": 2,
"max_companies_per_run": 2,
"max_contacts_per_company": 2,
"enrich_email": true,
"enrich_phones": true,
"sequence_template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"import_search_filters": {},
"backfill": {
"target": 2,
"windowDays": 123
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
search_filters: {},
max_per_run: 2,
max_companies_per_run: 2,
max_contacts_per_company: 2,
enrich_email: true,
enrich_phones: true,
sequence_template_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
import_search_filters: {},
backfill: {target: 2, windowDays: 123}
})
};
fetch('https://api.topo.io/v1/signals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.topo.io/v1/signals"
payload = {
"name": "<string>",
"search_filters": {},
"max_per_run": 2,
"max_companies_per_run": 2,
"max_contacts_per_company": 2,
"enrich_email": True,
"enrich_phones": True,
"sequence_template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"import_search_filters": {},
"backfill": {
"target": 2,
"windowDays": 123
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"signal_type": "LINKEDIN_OWN_POST_ENGAGEMENT",
"status": "ACTIVE",
"cadence": "DAILY",
"max_per_run": 123,
"max_companies_per_run": 123,
"max_contacts_per_company": 123,
"max_per_day": 123,
"enrich_email": true,
"enrich_phones": true,
"imported_count": 123,
"contact_list_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_list_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"archived_at": "2023-11-07T05:31:56Z",
"url": "<string>",
"list_url": "<string>"
}Authorizations
Bearer API key issued from Settings → Developers.
Body
Create Signal payload
Which preset to build. Read GET /v1/signals/presets first — a preset not listed there cannot be created.
LINKEDIN_OWN_POST_ENGAGEMENT, LINKEDIN_COMPETITOR_POST_ENGAGEMENT, LINKEDIN_PERSON_POST_ENGAGEMENT, LINKEDIN_KEYWORD_MENTION, LINKEDIN_OWN_COMPANY_FOLLOWERS, LINKEDIN_COMPETITOR_FOLLOWERS, LINKEDIN_COMPANY_PAGE_FOLLOWERS, HIRING_SIGNALS, JOB_DESCRIPTION_KEYWORD, FUNDING_EVENTS, TECH_ADOPTION, NEWS_EVENTS, NEW_JOB, CUSTOM_EVENT, LINKEDIN_PARTNER_FOLLOWERS, LINKEDIN_CUSTOMER_FOLLOWERS, LINKEDIN_PARTNER_POST_ENGAGEMENT, LINKEDIN_CUSTOMER_POST_ENGAGEMENT, LINKEDIN_COMPANY_PAGE_POST_ENGAGEMENT, LINKEDIN_OWN_PROFILE_POST_ENGAGEMENT, LINKEDIN_OWN_EMPLOYEES_POST_ENGAGEMENT, LINKEDIN_COMPETITOR_EMPLOYEES_POST_ENGAGEMENT, LINKEDIN_PARTNER_EMPLOYEES_POST_ENGAGEMENT, LINKEDIN_CUSTOMER_EMPLOYEES_POST_ENGAGEMENT, LINKEDIN_OWN_BRAND_MENTION, LINKEDIN_COMPETITOR_MENTION, LINKEDIN_PARTNER_MENTION, LINKEDIN_CUSTOMER_MENTION, LINKEDIN_EVENT_MENTION, COMPETITOR_TECH_ADOPTION, INTEGRATION_TECH_ADOPTION, LINKEDIN_EVENT_PAGE_FOLLOWERS, CHAMPION_CHANGED_JOB, CRM_LIST_ENTRY Name of the signal and of the destination list it creates.
1Leave empty to follow the preset's own scope. A company preset may set PEOPLE to import the people behind its detected companies instead of the companies themselves.
PEOPLE, COMPANIES What your own events identify, for a custom-event preset only: PEOPLE for email or LinkedIn subjects, COMPANIES for domains.
PEOPLE, COMPANIES Daily ceiling on imported entries. Cannot be combined with max_companies_per_run.
x >= 1Daily ceiling on detected companies consumed. Only for a company preset importing people.
x >= 1How many people to import per detected company. Requires max_companies_per_run.
x >= 1Whether imported leads get their email enriched.
Whether imported leads get their phone enriched.
Sequence template imported leads are enrolled into. People destinations only.
One-time import of matches the provider already saw before the signal existed, on top of the daily watch. Only for a preset whose backfill_windows_days is not null. Billed once, at creation.
Response
Successful Response
Unique identifier of the signal.
Name of the signal and of its destination list.
Catalog preset the signal watches.
LINKEDIN_OWN_POST_ENGAGEMENT, LINKEDIN_COMPETITOR_POST_ENGAGEMENT, LINKEDIN_PERSON_POST_ENGAGEMENT, LINKEDIN_KEYWORD_MENTION, LINKEDIN_OWN_COMPANY_FOLLOWERS, LINKEDIN_COMPETITOR_FOLLOWERS, LINKEDIN_COMPANY_PAGE_FOLLOWERS, HIRING_SIGNALS, JOB_DESCRIPTION_KEYWORD, FUNDING_EVENTS, TECH_ADOPTION, NEWS_EVENTS, NEW_JOB, CUSTOM_EVENT, LINKEDIN_PARTNER_FOLLOWERS, LINKEDIN_CUSTOMER_FOLLOWERS, LINKEDIN_PARTNER_POST_ENGAGEMENT, LINKEDIN_CUSTOMER_POST_ENGAGEMENT, LINKEDIN_COMPANY_PAGE_POST_ENGAGEMENT, LINKEDIN_OWN_PROFILE_POST_ENGAGEMENT, LINKEDIN_OWN_EMPLOYEES_POST_ENGAGEMENT, LINKEDIN_COMPETITOR_EMPLOYEES_POST_ENGAGEMENT, LINKEDIN_PARTNER_EMPLOYEES_POST_ENGAGEMENT, LINKEDIN_CUSTOMER_EMPLOYEES_POST_ENGAGEMENT, LINKEDIN_OWN_BRAND_MENTION, LINKEDIN_COMPETITOR_MENTION, LINKEDIN_PARTNER_MENTION, LINKEDIN_CUSTOMER_MENTION, LINKEDIN_EVENT_MENTION, COMPETITOR_TECH_ADOPTION, INTEGRATION_TECH_ADOPTION, LINKEDIN_EVENT_PAGE_FOLLOWERS, CHAMPION_CHANGED_JOB, CRM_LIST_ENTRY ACTIVE checks daily, PAUSED is held until resumed, ARCHIVED is retired and cannot be resumed.
ACTIVE, PAUSED, ARCHIVED How often the signal checks its provider.
DAILY, WEEKLY Daily ceiling on imported entries, when one was set.
Daily ceiling on detected companies consumed, when one was set.
People imported per detected company, when one was set.
Ceiling on the entries the signal imports in one day, resolved from the caps above.
Whether imported leads get their email enriched.
Whether imported leads get their phone enriched.
Entries the signal has imported since it was created.
Destination list, when the signal imports people.
Destination list, when the signal imports companies.
When the signal was created.
When the signal was retired, if it was.
Deep link to the signal in Topo.
Deep link to the destination list in Topo.
Was this page helpful?
curl --request POST \
--url https://api.topo.io/v1/signals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"search_filters": {},
"max_per_run": 2,
"max_companies_per_run": 2,
"max_contacts_per_company": 2,
"enrich_email": true,
"enrich_phones": true,
"sequence_template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"import_search_filters": {},
"backfill": {
"target": 2,
"windowDays": 123
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
search_filters: {},
max_per_run: 2,
max_companies_per_run: 2,
max_contacts_per_company: 2,
enrich_email: true,
enrich_phones: true,
sequence_template_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
import_search_filters: {},
backfill: {target: 2, windowDays: 123}
})
};
fetch('https://api.topo.io/v1/signals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.topo.io/v1/signals"
payload = {
"name": "<string>",
"search_filters": {},
"max_per_run": 2,
"max_companies_per_run": 2,
"max_contacts_per_company": 2,
"enrich_email": True,
"enrich_phones": True,
"sequence_template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"import_search_filters": {},
"backfill": {
"target": 2,
"windowDays": 123
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"signal_type": "LINKEDIN_OWN_POST_ENGAGEMENT",
"status": "ACTIVE",
"cadence": "DAILY",
"max_per_run": 123,
"max_companies_per_run": 123,
"max_contacts_per_company": 123,
"max_per_day": 123,
"enrich_email": true,
"enrich_phones": true,
"imported_count": 123,
"contact_list_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_list_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"archived_at": "2023-11-07T05:31:56Z",
"url": "<string>",
"list_url": "<string>"
}