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.

TypeDescription
keyword_detectionMonitors LinkedIn posts for specified keywords, scoped to your target accounts.
keyword_post_searchMonitors LinkedIn broadly for specified keywords — not limited to your target accounts.
job_posting_keyword_detectionMonitors the job postings your tracked companies publish for specified keywords.
job_updateDetects job changes and promotions among your contacts.
competitorWatches a list of competitor companies. (company list)
partnerWatches a list of partner companies. (company list)
customerWatches a list of customer companies. (company list)
influencerWatches a list of influencer profiles. (profile list)
championWatches a list of champion profiles. (profile list)
champion_trackingDetects 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_id to bind an existing list instead — its type must equal the chosen agent type, otherwise the request returns 422.

champion_tracking works the same way, but always binds a profile watchlist of type champion — the same list a champion agent can bind to, simultaneously. Pass watchlist_id to bind an existing champion watchlist instead of creating one automatically; it must be of type champion, otherwise the request returns 422.

Competitor agents additionally accept an optional parameters.mode that 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), or all (both). No other agent type accepts mode.

They also accept an optional parameters.target_group, independent of mode: it picks which people at the tracked competitor a lead-discovery run watches, and so whose LinkedIn interactions it reads. prospects watches their new-business side: sales, account executives, SDR/BDR, revenue and exec leadership; customers watches their account side: account management, customer success, support; all (the default when omitted) watches both.

competitor_activity and content_engagement are not among the ten types — they are labels that appear only on individual signal detections (see the Signals endpoint), never as an agent's own type, and cannot be passed here. A competitor agent running lead discovery reports results under both labels in the same run — one per direction — while its own type stays competitor.

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

POST/api/v2/agents

Request body

FieldTypeDescription
namestringDisplay name of the agent. Between 1 and 100 characters.
typeenum (keyword_detection, keyword_post_search, job_posting_keyword_detection, job_update, competitor, partner, customer, influencer, champion, champion_tracking)The agent type.
parametersobjectType-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_keywordsstring[]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_scrapeintegerkeyword_detection only. Optional. Maximum number of posts to scrape per run.
parameters.start_datestringkeyword_detection and keyword_post_search only. Optional. ISO 8601 date — scrape only posts published after this date.
parameters.modeenum (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_groupenum (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_idintegerOptional. 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.
scheduleobject | nullOptional. 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

FieldTypeDescription
data.idintegerIdentifier of the agent.
data.namestringDisplay name of the agent.
data.typestringAgent type (keyword_detection, keyword_post_search, job_posting_keyword_detection, job_update, competitor, partner, customer, influencer, champion, champion_tracking).
data.enabledbooleanWhether the agent is currently active. A newly created agent is true.
data.schedulablebooleanWhether 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.scheduleobject | nullThe 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.parametersobjectConfigured 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_kindstring | nullKind of the bound watchlist (company or profile), or null when unbound.
data.watchlist_idinteger | nullNumeric id of the bound watchlist, or null when unbound.
data.created_atstringISO 8601 creation timestamp.
data.updated_atstringISO 8601 last-update timestamp.

Errors

StatusDescription
401The API key is missing or invalid.
422Invalid 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.

On this page