Create Agent
Create an agent for your workspace.
Creates an agent for your workspace. A workspace can have multiple agents. The agent is created enabled (enabled: true) and starts monitoring immediately.
Credit usage
champion_tracking agents consume credits from your workspace balance each time a tracked champion is re-enriched — a recurring cost for as long as the agent stays enabled. Keyword agents (keyword_detection, keyword_post_search, job_posting_keyword_detection) consume credits for the keyword signals they detect.
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 specified keywords, scoped to your target accounts. |
keyword_post_search | Monitors LinkedIn broadly for specified keywords — not limited to your target accounts. |
job_posting_keyword_detection | Monitors the job postings your tracked companies publish for specified keywords. |
job_update | Detects job changes and promotions among your contacts. |
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. (profile list) |
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.Competitor agents additionally accept an optional
parameters.modethat decides what the agent does:lead_discovery(watches the competitor's team on LinkedIn and surfaces both directions — the people they comment on or react to, and the people who comment on or react to their own posts — always together, wherever those people work),account_monitoring(the default — only detects interactions between the competitor and your target accounts, in both directions, no scraping), orall(both). No other agent type acceptsmode.They also accept an optional
parameters.target_group, independent ofmode: it picks which people at the tracked competitor a lead-discovery run watches, and so whose LinkedIn interactions it reads.prospectswatches their new-business side: sales, account executives, SDR/BDR, revenue and exec leadership;customerswatches their account side: account management, customer success, support;all(the default when omitted) watches both.
competitor_activityandcontent_engagementare not among the ten types — they are labels that appear only on individual signal detections (see the Signals endpoint), never as an agent's owntype, and cannot be passed here. Acompetitoragent running lead discovery reports results under both labels in the same run — one per direction — while its owntypestayscompetitor.
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, your 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), and
- at least one target account.
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 your workspace does not meet these requirements yet, the request is refused with 422 and a message naming the missing prerequisite and the tool to call first, for example:
"Create a persona with sillage_v2_upsert_persona (job_title and location required) before creating an agent.""Persona is missing job_title. Update it with sillage_v2_upsert_persona before creating an agent.""Add at least one top account with sillage_v2_add_top_accounts first."
The response also includes a type field that identifies the missing prerequisite, so your code can check it instead of parsing the message: https://docs.getsillage.com/errors/persona-incomplete when the persona is missing or incomplete (also returned when both prerequisites are missing — the message then names both), or https://docs.getsillage.com/errors/insufficient-top-accounts when only the target account is missing.
{
"type": "https://docs.getsillage.com/errors/persona-incomplete",
"title": "Persona incomplete",
"status": 422,
"detail": "Create a persona with sillage_v2_upsert_persona (job_title and location required) before creating an agent.",
"instance": "/api/v2/agents"
}Create agent
Request body
| Field | Type | Description |
|---|---|---|
| name | string | Display name of the agent. Between 1 and 100 characters. |
| type | enum (keyword_detection, keyword_post_search, job_posting_keyword_detection, job_update, competitor, partner, customer, influencer, champion, champion_tracking) | The agent type. |
| parameters | object | Type-specific configuration (see below). Required for keyword_detection, keyword_post_search, and job_posting_keyword_detection, optional for competitor. Omit for the other watchlist types and champion_tracking. |
| parameters.tracking_keywords | string[] | Keywords Sillage monitors — in LinkedIn posts for keyword_detection (scoped to your target accounts) or keyword_post_search (broad search across LinkedIn), or in your tracked companies' job postings (title and description) for job_posting_keyword_detection. Minimum 1 required. |
| parameters.max_posts_to_scrape | integer | keyword_detection only. Optional. Maximum number of posts to scrape per run. |
| parameters.start_date | string | keyword_detection and keyword_post_search only. Optional. ISO 8601 date — scrape only posts published after this date. |
| parameters.mode | enum (lead_discovery, account_monitoring, all) | competitor only. Optional. What the agent does — surface both the people the competitor's team engages with and the people who engage with their posts, only report interactions with your target accounts, or both. Defaults to account_monitoring when omitted. |
| parameters.target_group | enum (prospects, customers, all) | competitor only. Optional. Which people at the tracked competitor a lead-discovery run watches — prospects (their new-business side: sales, account executives, SDR/BDR, revenue and exec leadership), customers (their account side: account management, customer success, support), or all (both). Defaults to all when omitted. |
| watchlist_id | integer | Optional. Watchlist types and champion_tracking only. Bind an existing list of the expected type instead of creating one automatically — for champion_tracking the list must be of type champion, otherwise returns 422. |
| schedule | object | null | Optional. Turn the agent's weekly run on at creation: send { "cadence": "weekly" } to turn it on, or omit / send null to leave it off. weekly is the only supported cadence. Accepted only when the agent is schedulable — see Errors. |
Example request — keyword detection
curl -X POST "https://api.getsillage.com/api/v2/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "LinkedIn keyword monitor",
"type": "keyword_detection",
"parameters": {
"tracking_keywords": ["fundraising", "series a", "\"series a\"", "hiring sales"]
}
}'Example request — competitor watchlist (bound at creation)
curl -X POST "https://api.getsillage.com/api/v2/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Competitor tracker",
"type": "competitor",
"watchlist_id": 7,
"parameters": {
"mode": "all",
"target_group": "prospects"
}
}'Example request — job update
curl -X POST "https://api.getsillage.com/api/v2/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Job change tracker",
"type": "job_update"
}'Example request — job posting keyword detection
curl -X POST "https://api.getsillage.com/api/v2/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Hiring intent monitor",
"type": "job_posting_keyword_detection",
"parameters": {
"tracking_keywords": ["salesforce", "revenue operations", "outbound"]
}
}'Example request — champion tracking (implicit watchlist)
curl -X POST "https://api.getsillage.com/api/v2/agents" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Champion job change tracker",
"type": "champion_tracking"
}'Example response
201 Created
{
"data": {
"id": 42,
"name": "LinkedIn keyword monitor",
"type": "keyword_detection",
"enabled": true,
"schedulable": false,
"schedule": null,
"parameters": {
"tracking_keywords": ["fundraising", "series a", "hiring sales"]
},
"watchlist_kind": null,
"watchlist_id": null,
"created_at": "2026-06-18T10:00:00.000Z",
"updated_at": "2026-06-18T10:00:00.000Z"
}
}Response fields
| Field | Type | Description |
|---|---|---|
| data.id | integer | Identifier of the agent. |
| data.name | string | Display name of the agent. |
| data.type | string | Agent type (keyword_detection, keyword_post_search, job_posting_keyword_detection, job_update, competitor, partner, customer, influencer, champion, champion_tracking). |
| data.enabled | boolean | Whether the agent is currently active. A newly created agent is true. |
| data.schedulable | boolean | Whether this agent can run on a weekly schedule. true for keyword_post_search agents, and for competitor agents whose mode is lead_discovery or all; false for every other agent type. Read-only — setting schedule on an agent where this is false returns 422. |
| data.schedule | object | null | The agent's weekly run schedule. { "cadence": "weekly" } when weekly runs are on, null when they are off. weekly is the only cadence supported today. |
| data.parameters | object | Configured parameters (keyword detection, keyword post search, job posting keyword detection, and a competitor agent's mode/target_group, plus its resolved resolved_target_persona job-title list); empty object for the other watchlist types and champion_tracking. |
| data.watchlist_kind | string | null | Kind of the bound watchlist (company or profile), or null when unbound. |
| data.watchlist_id | integer | null | Numeric id of the bound watchlist, or null when unbound. |
| data.created_at | string | ISO 8601 creation timestamp. |
| data.updated_at | string | ISO 8601 last-update timestamp. |
Errors
| Status | Description |
|---|---|
| 401 | The API key is missing or invalid. |
| 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 schedule.cadence is anything other than weekly, or schedule is sent for an agent that is not schedulable. Also returned when the workspace does not yet meet the minimum setup required for this agent type — see Minimum setup required. |