List signal templates
Browse every signal your workspace can set up.
Lists the signals your workspace can set up: what each one watches for, who it watches (a person, a company, or both), and what it costs. A retired signal is left out of this list — fetch it directly by ID if a setup still points at it.
Each signal carries a setup field describing what a setup for it can carry. Render a form from setup.fields, or validate a setup's parameters against it, instead of hard-coding what each signal accepts.
Route
Access modes
Use a workspace API key. The workspace is inferred from the key.
Authorization: Bearer sk_live_...Query parameters
| Parameter | Type | Description |
|---|---|---|
| include_coming_soon | boolean | When true, also returns signals that are not available to set up yet. Defaults to false. |
See Pagination for the shared page / page_size parameters.
Example request
curl "https://api.getsillage.com/api/v3/signal-templates?page=1&page_size=25" \
-H "Authorization: Bearer $SILLAGE_API_KEY"Success response
Status: 200 OK
{
"data": [
{
"id": 3,
"key": "mentioned-keywords-on-linkedin",
"name": "Mentions your keywords",
"description": "Finds posts mentioning the keywords you're tracking.",
"row_summary": "Posts mentioning your keywords",
"category": "engagement",
"status": "live",
"subjects": ["person"],
"scopes": ["discovery", "account_monitoring"],
"tags": ["popular"],
"pricing": {
"account_monitoring": {
"signal_bucket": "standard",
"credits": 100,
"unit": "key_account_per_month"
},
"discovery": null
},
"setup": {
"fields": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keywords": {
"type": "array",
"items": { "type": "string" },
"default": ["acme"],
"x-label": "Keywords",
"x-hint": "Which words to watch for.",
"x-control": "keywords"
},
"scopes": {
"type": "array",
"items": { "type": "string", "enum": ["discovery", "account_monitoring"] },
"default": ["discovery"],
"x-label": "Where it looks"
}
},
"required": ["scopes"],
"unevaluatedProperties": false,
"allOf": [
{
"if": {
"properties": { "scopes": { "contains": { "const": "discovery" } } }
},
"then": {
"properties": {
"max_signals_per_week": {
"type": "integer",
"minimum": 1,
"default": 50,
"x-label": "Maximum signals per week",
"x-hint": "Caps how many signals this can produce in a week.",
"x-control": "number"
}
}
}
}
]
},
"shape": "keyword"
},
"display_order": 3,
"archived_at": null
}
],
"meta": {
"pagination": {
"page": 1,
"page_size": 25,
"page_count": 2,
"total": 28
}
}
}Response fields
| Field | Type | Description |
|---|---|---|
| data[].id | integer | ID of the signal. Specific to your environment. |
| data[].key | string | Stable identifier of the signal, such as mentioned-my-brand. Unlike id, it is the same in every environment, and it is the key of this signal in Credit usage. |
| data[].name | string | The signal name shown to a user. |
| data[].description | string or null | A short explanation of what this signal watches for. |
| data[].row_summary | string or null | A one-line summary, for a compact list display. |
| data[].category | string | The family of signals this one belongs to. |
| data[].status | string | live if this signal can be set up today, coming_soon otherwise. |
| data[].subjects | array of string | Who this signal watches — person, company, or both. |
| data[].scopes | array of string | Which setups this signal supports — discovery, account_monitoring, or both. |
| data[].tags | array of string | Labels you can filter on, e.g. popular. An open list — a new label can appear here without notice. |
| data[].pricing | object | What this signal costs your workspace, by mode. See below. |
| data[].pricing.account_monitoring | object or null | This signal's account-monitoring price, carried by its bucket. null when it has no bucket yet, or the bucket has no price. See Signal Buckets. |
| data[].pricing.account_monitoring.signal_bucket | string | Key of the bucket carrying this price (essential, standard or advanced). |
| data[].pricing.account_monitoring.credits | number | The exact price, in credits — never rounded. |
| data[].pricing.account_monitoring.unit | string | Always key_account_per_month. |
| data[].pricing.discovery | object or null | This signal's discovery price, per signal found. null when this signal has no discovery price. |
| data[].pricing.discovery.credits | number | The exact price, in credits — never rounded. |
| data[].pricing.discovery.unit | string | Always signal_found. |
| data[].setup | object | What a setup for this signal can carry. See below. |
| data[].setup.fields | object | A JSON Schema document describing a setup's parameters object. Render a form from it, or validate against it. |
| data[].setup.shape | string | The family of parameters this signal asks for: keyword, engagement, job_change, job_posting (read from job postings), firmographic, internal_signal (read from your own systems rather than public activity), or custom. |
| data[].display_order | integer | The position this signal should be shown at, ascending. |
| data[].archived_at | string or null | When this signal was retired, null while still active. A retired signal is left out of this list but still resolves by ID. |
| meta.pagination | object | Pagination metadata — see Pagination. |
Each property inside setup.fields may carry x-label, x-hint, x-control and
x-watchlist-type extensions. The first three describe how to render the property;
x-watchlist-type, on a list_id property, says which kind of list that signal
accepts. These are extensions, not part of the JSON Schema standard — ignore any x-
property your client does not recognize.
pricing.account_monitoring: null or pricing.discovery: null means that mode has no
price yet, not that it is free. See Signal Buckets for
the account-monitoring rate.
Errors
| Status | Meaning |
|---|---|
| 400 | Invalid page or page_size. |
| 401 | The API key is missing or invalid. |
| 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 on v3 — title is what tells one problem from another, and stays stable across occurrences (other v3 endpoints may answer, for example, "Persona incomplete" or "Insufficient top accounts"):
{
"type": "about:blank",
"title": "Invalid query parameters",
"status": 400,
"detail": "page_size must be a positive integer",
"instance": "/api/v3/signal-templates"
}