Get a signal detection
Retrieve one signal detection of your workspace by ID.
Returns one signal detection of your workspace by its ID. A detection that belongs to another workspace returns 404.
Route
Access modes
Use a workspace API key. The workspace is inferred from the key.
Authorization: Bearer sk_live_...Path parameters
| Parameter | Type | Description |
|---|---|---|
| signal_id | integer | ID of the signal detection, the id of an item returned by the query endpoint. |
Example request
curl "https://api.getsillage.com/api/v3/signals/101" \
-H "Authorization: Bearer $SILLAGE_API_KEY"Success response
Status: 200 OK
{
"data": {
"id": 101,
"signal_type": "keyword_detection",
"details": {
"post": {
"content_id": 5100,
"linkedin_url": "https://www.linkedin.com/feed/update/urn:li:activity:7100000000000000000/",
"text": "Excited to share how AI is transforming our product roadmap this quarter.",
"author": {
"type": "person",
"full_name": "Jane Doe",
"first_name": null,
"last_name": null,
"linkedin_url": "https://linkedin.com/in/janedoe",
"linkedin_headline": "VP Product at Acme",
"position": null,
"avatar_url": "https://example.com/janedoe.png"
}
},
"keywords_found": ["AI"]
},
"detected_at": "2026-06-01T10:00:00.000Z",
"signal_date": "2026-05-31T14:20:00.000Z",
"lead": {
"id": 456,
"full_name": "Jane Doe",
"first_name": "Jane",
"last_name": "Doe",
"linkedin_url": "https://linkedin.com/in/janedoe",
"linkedin_headline": "VP Product at Acme",
"position": "VP Product",
"avatar_url": "https://example.com/janedoe.png"
},
"company": {
"id": 789,
"name": "Acme",
"domain": "acme.com",
"linkedin_url": "https://www.linkedin.com/company/acme",
"linkedin_handle": "acme",
"logo_url": "https://example.com/acme-logo.png"
},
"signal_setup_id": 12,
"source_url": "https://www.linkedin.com/feed/update/urn:li:activity:7100000000000000000/",
"author": {
"full_name": "Jane Doe",
"first_name": null,
"last_name": null,
"linkedin_url": "https://linkedin.com/in/janedoe",
"linkedin_headline": "VP Product at Acme",
"position": null,
"avatar_url": "https://example.com/janedoe.png"
},
"excerpt": "Excited to share how AI is transforming our product roadmap this quarter."
}
}Response fields
data has the fields below.
| Field | Type | Description |
|---|---|---|
| id | integer | ID of the signal detection. |
| signal_type | string | null | What the detection is about, for example keyword_detection or champion_job_change. See Signal types. |
| details | object | null | The payload of the detection. Its shape depends on signal_type, see Details by signal type. |
| detected_at | string (date-time) | null | When the detection was first seen. |
| signal_date | string (date-time) | null | Date of the underlying event. |
| lead | object | null | The lead the detection is about, as a summary: id (the ID of the lead, as in Get a lead), full_name, first_name, last_name, linkedin_url, linkedin_headline, position and avatar_url. For a detection without a lead of its own, such as a keyword match, it is the lead of the author of the content when known. null when the author is unknown. |
| company | object | null | The company the detection is about, as a summary: id (the ID returned by POST /v3/companies/query), name, domain, linkedin_url, linkedin_handle and logo_url. null when the detection is not about a company. |
| signal_setup_id | integer | null | ID of the signal setup that produced the detection. null when the detection does not belong to a current signal setup, for example when it comes from an older signal or from a setup that was deleted. This is the same rule as for signal runs. |
| source_url | string | null | Link to the content behind the detection (the post, the interaction or the job posting). null when the detection has no public link. |
| author | object | null | The person behind the content, when known: full_name, first_name, last_name, linkedin_url, linkedin_headline, position and avatar_url, each nullable. null for a detection about a company only or without an author. |
| excerpt | string | null | A short text extract of the content (post text, comment or job description). null when no text is available. |
Details by signal type
details is the payload of the detection and its shape depends on signal_type. source_url, author and excerpt give you the most relevant link, person and text without reading details. A key the source does not hold is null. New values may be added to the lists below; ignore the ones you don't know.
A post is always described the same way, under post: content_id is the ID of the matching content in the workspace, usable with the contents endpoints (null when no matching content exists), linkedin_url is the post's LinkedIn URL, text is its text and author is who published it. post.author has a type of "person" (the keys of a person: full_name, first_name, last_name, linkedin_url, linkedin_headline, position, avatar_url) or "company" (a company page: id, name, domain, linkedin_url, linkedin_handle, logo_url). Every key is always present, null when unknown.
Keyword detections
For keyword_detection, details.post is the post the keyword matched in, and details.keywords_found lists the keywords that matched. details.post.author is null when the publisher is unknown. A keyword post has one combined author name, so first_name and last_name are null on its author.
Comment detections
Signal types ending in _inbound_comment or _outbound_comment, for example competitor_inbound_comment, carry the comment on one side (interaction) and the post it was left on the other (post). interaction has a type, a content_id (the ID of the matching content in the workspace, null when no matching content exists) and an author, who has the keys of a person. A comment's author has one combined name, so first_name and last_name are null.
…_inbound_comment: someone from the watched list commented on a post by a person at one of your accounts. …_outbound_comment: the reverse, a person at one of your accounts commented on a post by someone from the watched list. Either way, lead is the person at your account.
{
"interaction": {
"type": "comment",
"content_id": 5001,
"author": {
"full_name": "Jane Doe",
"first_name": null,
"last_name": null,
"linkedin_url": "https://linkedin.com/in/janedoe",
"linkedin_headline": "VP Product at Acme",
"position": null,
"avatar_url": "https://example.com/janedoe.png"
}
},
"post": {
"content_id": 5002,
"linkedin_url": "https://www.linkedin.com/feed/update/urn:li:activity:7100000000000000002/",
"text": "We just opened our new office in Lyon.",
"author": {
"type": "person",
"full_name": "John Smith",
"first_name": null,
"last_name": null,
"linkedin_url": "https://linkedin.com/in/johnsmith",
"linkedin_headline": "Head of Sales at Widgets",
"position": null,
"avatar_url": "https://example.com/johnsmith.png"
}
}
}Competitor activity
linkedin_comment and linkedin_reaction carry the comment or reaction (interaction) and the post it was left on (post). interaction.author is the external person who left it: the keys of a person, plus their company_name and, on a comment, their comment_text, both free text. post.author is the person whose post they engaged with, who becomes your lead. interaction.content_id is the ID of the matching content in the workspace, null when none exists, and interaction.linkedin_url is the LinkedIn URL of the comment or reaction. post.content_id is null.
{
"interaction": {
"type": "comment",
"linkedin_url": "https://linkedin.com/feed/update/urn:li:activity:7100000000000000001/",
"content_id": 5101,
"author": {
"full_name": "Jane Doe",
"first_name": "Jane",
"last_name": "Doe",
"linkedin_url": "https://linkedin.com/in/janedoe",
"linkedin_headline": "VP Product",
"position": null,
"avatar_url": null,
"company_name": "Acme",
"comment_text": "Great point, we're seeing the same shift on our side."
}
},
"post": {
"content_id": null,
"linkedin_url": "https://linkedin.com/feed/update/urn:li:activity:7100000000000000000/",
"text": "Excited to share how AI is transforming our product roadmap this quarter.",
"author": {
"type": "person",
"full_name": "John Smith",
"first_name": "John",
"last_name": "Smith",
"linkedin_url": "https://linkedin.com/in/johnsmith",
"linkedin_headline": "Head of Sales",
"position": null,
"avatar_url": null
}
}
}Content engagement
lead_liked_competitor_content and lead_commented_competitor_content use the same interaction and post shape, mirrored: post is the post published by the person you are tracking and interaction is the reaction or comment an external person left on it, the person who now surfaces as the lead. interaction has no content_id, and post.content_id is null.
lead_liked_own_content and lead_commented_own_content (a person who liked or commented on a post by your company or one of your employees) and lead_liked_influencer_content and lead_commented_influencer_content (a person who liked or commented on a post by an influencer of the list) follow the same interaction and post shape.
{
"interaction": {
"type": "comment",
"linkedin_url": "https://linkedin.com/feed/update/urn:li:activity:7100000000000000003/",
"author": {
"full_name": "Priya Shah",
"first_name": "Priya",
"last_name": "Shah",
"linkedin_url": "https://linkedin.com/in/priyashah",
"linkedin_headline": "Director of Sales",
"position": null,
"avatar_url": null,
"company_name": "Globex",
"comment_text": "This matches what we're seeing too."
}
},
"post": {
"content_id": null,
"linkedin_url": "https://linkedin.com/feed/update/urn:li:activity:7100000000000000000/",
"text": "Excited to share how AI is transforming our product roadmap this quarter.",
"author": {
"type": "person",
"full_name": "John Smith",
"first_name": "John",
"last_name": "Smith",
"linkedin_url": "https://linkedin.com/in/johnsmith",
"linkedin_headline": "Head of Sales",
"position": null,
"avatar_url": null
}
}
}Partner detections
partner_staff_comment and partner_staff_reaction (a comment or reaction left by a person on the partner's side) use the same interaction and post shape as the competitor activity above. lead_liked_partner_content and lead_commented_partner_content (a person who liked or commented on the partner's own posts) use the content engagement shape above.
Job posting keyword detections
job_posting_keyword_detection carries the keywords that matched (keywords_found) and the job posting they matched in (posting), with its title and a job_url you can open directly.
{
"keywords_found": ["Senior Engineer", "Remote"],
"posting": {
"title": "Senior Backend Engineer",
"job_url": "https://www.linkedin.com/jobs/view/1234567890"
}
}Job changes
new_job and recently_promoted describe the move of a person: previous_position is the role they leave and new_position is the role they take. Each is a job block: position, company_name, company_linkedin_url and start_date, a date without a time (YYYY-MM-DD), null when unknown.
{
"previous_position": {
"position": "Sales Manager",
"company_name": "Initech",
"company_linkedin_url": "https://linkedin.com/company/initech",
"start_date": null
},
"new_position": {
"position": "VP Sales",
"company_name": "Acme",
"company_linkedin_url": "https://linkedin.com/company/acme",
"start_date": "2026-05-01"
}
}Champion career moves
champion_job_change describes the career move of a tracked champion: change_type is the kind of move: company_change (a new company), title_change (a new role in the same company), both (a new company and a new role) or left_company (a departure, the new company is not known yet). previous_position is the role they leave and new_position is the role they move into, both job blocks as in the job changes above. It covers every champion career move, including departures where the new company is not known yet: the new_position fields are then null, as below.
{
"change_type": "left_company",
"previous_position": {
"position": "VP Product",
"company_name": "Acme",
"company_linkedin_url": "https://linkedin.com/company/acme",
"start_date": null
},
"new_position": {
"position": null,
"company_name": null,
"company_linkedin_url": null,
"start_date": null
}
}Errors
| Status | Meaning |
|---|---|
| 401 | The API key is missing or invalid. |
| 404 | No signal detection matches this ID. |
| 422 | signal_id is not a valid ID, or a query parameter is sent: this route takes none, and errors names the parameter. |
| 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.