Create Agent
Create an agent for a partner workspace.
Creates an agent. The agent is created enabled, but it has no recurring schedule and will not run on its own. Trigger a run yourself with Launch Signal Run, or set a recurring schedule from the Sillage app.
Credit usage
champion_tracking agents are not charged per tracked champion; they are metered only for the Discovery moves they find, the same way as other Discovery agents. Keyword agents (keyword_detection, keyword_post_search, job_posting_keyword_detection) are metered under keyword_signal for the keyword signals they detect. Track consumption with GET /v2/partner/usage.
Ten agent types are supported: keyword_detection, keyword_post_search, job_posting_keyword_detection, job_update, champion_tracking, plus five semantic watchlist types.
| Type | Description |
|---|---|
keyword_detection | Monitors LinkedIn posts for keywords you choose, scoped to your target accounts. |
keyword_post_search | Monitors LinkedIn broadly for keywords you choose — not limited to your target accounts. |
job_posting_keyword_detection | Monitors the job postings the workspace's tracked companies publish for keywords you choose. |
job_update | Detects job changes and promotions among the workspace's contacts. Takes no parameters. |
competitor | Watches a list of competitor companies. (company list) |
partner | Watches a list of partner companies. (company list) |
customer | Watches a list of customer companies. (company list) |
influencer | Watches a list of influencer profiles. (profile list) |
champion | Watches a list of champion profiles. (profile list) |
champion_tracking | Detects when a tracked champion leaves their company, changes company, or is promoted. |
Note: For the five semantic watchlist types, a watchlist of the matching type is created automatically and bound to the new agent. Pass
watchlist_idto bind an existing list instead — its type must equal the chosen agent type, otherwise the request returns422.
champion_trackingworks the same way, but always binds a profile watchlist of typechampion— the same list achampionagent can bind to, simultaneously. Passwatchlist_idto bind an existing champion watchlist instead of creating one automatically; it must be of typechampion, otherwise the request returns422.
Minimum setup required
Most agent types need a usable persona and at least one target account before they can start monitoring — otherwise there is nothing to target. Before creating an agent of one of these types, the workspace must have:
- a persona with both a job title and a location set (having a persona on file is not enough on its own) — see Upsert persona, and
- at least one target account — see Add accounts.
job_update, job_posting_keyword_detection, and champion_tracking are exempt and can be created right away, since none of them is tied to a specific persona or account list.
If the workspace does not meet these requirements yet, the request is refused with 422 and a message naming the missing prerequisite.
Create an agent
Path parameters
| Parameter | Type | Description |
|---|---|---|
| partner_workspace_id | string | Opaque workspace identifier from the partner system. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Display name of the agent. 1 to 100 characters. |
| type | string | Yes | The agent type — one of keyword_detection, keyword_post_search, job_posting_keyword_detection, job_update, customer, competitor, partner, influencer, champion, champion_tracking. |
| parameters | object | Conditional | Required for keyword_detection, keyword_post_search, and job_posting_keyword_detection. The other types take no parameters. |
| parameters.tracking_keywords | string[] | Conditional | Required for keyword_detection, keyword_post_search, and job_posting_keyword_detection. At least one is required. keyword_detection matches them against LinkedIn posts from your target accounts; keyword_post_search matches them against LinkedIn posts broadly, not limited to your target accounts; job_posting_keyword_detection matches them against the job title and description of the postings your target accounts publish. |
| parameters.start_date | string | No | keyword_detection and keyword_post_search only — ISO 8601 date. Only posts published after this date are scanned. |
| watchlist_id | integer | No | Watchlist-bound types only (customer, competitor, partner, influencer, champion, champion_tracking) — attach the agent to an existing watchlist (for champion_tracking, a champion watchlist). Omit it and a new empty watchlist of that type is created and bound instead. |
Example request — keyword detection
curl -X POST "https://api.getsillage.com/api/v2/partner/workspaces/ws_123/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Hiring signals",
"type": "keyword_detection",
"parameters": { "tracking_keywords": ["hiring", "expansion"] }
}'Example request — job posting keyword detection
curl -X POST "https://api.getsillage.com/api/v2/partner/workspaces/ws_123/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Target accounts hiring platform roles",
"type": "job_posting_keyword_detection",
"parameters": {
"tracking_keywords": ["Platform Engineer", "DevOps Engineer", "Site Reliability Engineer"]
}
}'Example request — competitor watchlist (bound at creation)
curl -X POST "https://api.getsillage.com/api/v2/partner/workspaces/ws_123/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Competitor tracker",
"type": "competitor",
"watchlist_id": 7
}'Example request — champion tracking (implicit watchlist)
curl -X POST "https://api.getsillage.com/api/v2/partner/workspaces/ws_123/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Champion job change tracker",
"type": "champion_tracking"
}'Example response
{
"data": {
"id": 42,
"name": "Hiring signals",
"type": "keyword_detection",
"enabled": true,
"parameters": {
"tracking_keywords": ["hiring", "expansion"]
},
"watchlist_kind": null,
"watchlist_id": null,
"created_at": "2026-06-12T09:00:00.000Z",
"updated_at": "2026-06-12T09:00:00.000Z"
}
}Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Numeric id of the agent. This ID is specific to your environment. |
| name | string | Display name of the agent. |
| type | string | Agent type. See the list below. |
| enabled | boolean | Whether the agent is currently active. |
| parameters | object | Agent configuration. Its shape depends on type. |
| created_at | string | When the agent was created (ISO 8601). |
| updated_at | string | When the agent was last updated (ISO 8601). |
The type returned in the response is one of keyword_detection, keyword_post_search, job_posting_keyword_detection, job_update, job_posting, competitor_activity, content_engagement, influencer_engagement or champion_tracking, plus the semantic watchlist types customer, competitor, partner, influencer and champion — watchlist-bound agents always return their semantic type, never an internal label.
Create and update accept ten types, each with its own body shape:
type | parameters | Binding |
|---|---|---|
keyword_detection | tracking_keywords required, start_date optional | — |
keyword_post_search | tracking_keywords required, start_date optional | — |
job_posting_keyword_detection | tracking_keywords required | — |
job_update | none | persona-driven |
customer, competitor, partner | none | company watchlist |
influencer, champion | none | profile watchlist |
champion_tracking | none | profile watchlist (champion) |
job_posting_keyword_detection tells you when one of your target accounts starts hiring for a role you care about: pass the role names as tracking_keywords (for example "Platform Engineer") and Sillage matches them against the title and description of the job postings those accounts publish.
For the watchlist-bound types, pass watchlist_id to attach an existing watchlist. If you omit it, a new empty watchlist of that type is created and bound to the agent — so an already-populated list you created separately would be left unattached. You can rebind afterwards with PUT /agents/{agent_id}.
Errors
| Status | Meaning |
|---|---|
| 401 | The master key is missing or invalid. |
| 402 | This workspace is not on a plan that allows agents. |
| 403 | The master key is not authorized to access this resource. |
| 422 | Invalid request body — unsupported type, missing tracking_keywords for keyword_detection, keyword_post_search, or job_posting_keyword_detection, or watchlist_id references a list whose type does not match the expected watchlist type for the chosen agent type (for champion_tracking, it must be a champion watchlist). Also returned when the workspace does not yet meet the minimum setup required for this agent type. |
| 429 | Rate limit exceeded. |
| 500 | An unexpected server error occurred. |
Error responses use RFC 9457 problem documents with Content-Type: application/problem+json.