Launch a signal run
Start a detection run for a signal setup across your accounts.
Starts a detection run for a signal setup across the accounts of your workspace. The signal type comes from the signal setup, you do not send it. The run starts immediately and the response is 202 Accepted: follow it with Get a signal run until its status is completed or failed.
A launch starts one run per direction (inbound and outbound) for a signal setup that watches a competitor, partner or influencer list, plus one Discovery run when scopes includes discovery: up to three runs. A keyword signal setup starts one run, plus one Discovery run when scopes includes discovery. Any other signal setup starts one run. Each run is one element of data, and each has its own id to follow.
A signal setup runs one at a time. Launching it while one of its runs is still in progress returns 409: follow the run to completion first. A disabled signal setup cannot be launched and also returns 409.
A launch with nothing to check also returns 409, and nothing is started: none of the accounts the signal setup checks is monitored right now (no_monitored_account, or no_covered_account when they are turned on but unpaid). To see which accounts are monitored, open the Key accounts page or call GET /v3/lists/{kind}/{list_id}/members?monitoring_status=not_monitored (or not_covered).
There is no idempotency key: sending the same launch twice starts two runs and may charge twice. Before you retry, check the state with GET /v3/signal-runs (the runs in progress) or GET /v3/requests-status. A launch sent while a run of the same signal setup is in progress answers 409.
Route
Access modes
Use a workspace API key. The workspace is inferred from the key.
Authorization: Bearer sk_live_...Body parameters
| Field | Type | Required | Description |
|---|---|---|---|
| signal_setup_id | integer | yes | ID of the signal setup to run, from GET /api/v3/signal-setups. An ID that is not a signal setup of the workspace is refused with 422. |
| parameters | object | no | Optional run parameters. Only lookback_days is accepted: any other key is refused with 422, naming the key. |
| parameters.lookback_days | integer | no | How many days back to scan for matches, counted from now, from 1 to 180. Defaults to 90. Only the account monitoring runs of keyword, job-offer, competitor, partner and influencer signal setups use it. Sending it for any other launch (another kind of signal setup, or scopes without account_monitoring) is refused with 422. |
Example request
curl -X POST "https://api.getsillage.com/api/v3/signal-runs" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"signal_setup_id":42,"parameters":{"lookback_days":90}}'Success response
Status: 202 Accepted
{
"data": [
{
"id": 12345,
"status": "in_progress",
"label": "Detecting signals",
"created_at": "2026-01-15T09:30:00.000Z",
"updated_at": "2026-01-15T09:30:00.000Z",
"companies": [],
"signal_setup_id": 42
}
]
}A signal setup that starts two runs answers two elements:
{
"data": [
{
"id": 12345,
"status": "in_progress",
"label": "Detecting signals",
"created_at": "2026-01-15T09:30:00.000Z",
"updated_at": "2026-01-15T09:30:00.000Z",
"companies": [],
"signal_setup_id": 42
},
{
"id": 12346,
"status": "in_progress",
"label": "Detecting signals",
"created_at": "2026-01-15T09:30:00.000Z",
"updated_at": "2026-01-15T09:30:00.000Z",
"companies": [],
"signal_setup_id": 42
}
]
}Response fields
data is an array with one run per element:
| Field | Type | Description |
|---|---|---|
| id | integer | ID of the signal run. |
| status | string | Where the run stands: pending, in_progress, completed or failed. See Run statuses. |
| label | string | A short readable description of the current step. |
| created_at | string (date-time) | When the run was started. |
| updated_at | string (date-time) | When the run was last updated. |
| companies | array | The accounts being scanned. An empty array means the run covers the whole workspace. |
| companies[].id | integer | ID of the company, as returned by POST /v3/companies/query. |
| companies[].name | string | null | Company name. |
| companies[].domain | string | null | Company domain. |
| companies[].linkedin_url | string | null | LinkedIn page of the company. |
| companies[].linkedin_handle | string | null | LinkedIn handle of the company. |
| companies[].logo_url | string | null | Logo of the company. |
| signal_setup_id | integer | null | ID of the signal setup the run belongs to, the same ID as in the client's signal setups. null when the run is not tied to one of the signal setups, for example a very old run, or a setup deleted while it was running. |
Signals found in Discovery are charged per signal, at the Discovery price of the signal
template. Account monitoring runs are not charged per signal. A launch that includes
Discovery is refused with 402 when your credit balance cannot pay for one signal.
Nothing is started when a launch is refused.
Errors
| Status | Meaning |
|---|---|
| 401 | The API key is missing or invalid. |
| 402 | The launch includes Discovery and your credit balance cannot pay for one signal (insufficient_credits). detail says: "Your credit balance cannot pay for this run. Add credits, then launch again. Nothing was started." |
| 403 | The workspace is blocked, so no run can be launched. Nothing was started. |
| 409 | The current state refuses the launch, and nothing was started: a run of this signal setup is still in progress (run_in_progress), the signal setup is disabled (setup_disabled), none of the accounts it checks is monitored right now (no_monitored_account or no_covered_account). |
| 422 | The body is not valid, for example signal_setup_id is missing or is not the ID of a signal setup of the workspace, a key of parameters is unknown, or lookback_days is sent for a launch that does not use it. Also returned when a query parameter is sent: this route takes none, and errors names the parameter. Also returned when a job-change signal setup that looks for new people has no job titles, neither on the setup nor on the persona (discovery_needs_job_titles), or when the signal setup cannot be launched as configured, for example it has no list or no keywords (launch_not_possible): title is "Unprocessable Entity" and detail gives the reason. Nothing was started. |
| 429 | Rate limit exceeded. |
| 500 | An unexpected server error occurred. |
Error responses use RFC 9457 problem documents with Content-Type: application/problem+json. type is always about:blank; code tells one problem from another, detail says what went wrong this time, and errors names the field at fault.