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.

Eight agent types are supported: keyword_detection, job_posting_keyword_detection, job_update, plus five semantic watchlist types.

TypeDescription
keyword_detectionMonitors LinkedIn posts for specified keywords.
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)

Note: For the five 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.

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 is exempt and can be created right away, since it is not 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."

Create agent

POST/api/v2/agents

Request body

FieldTypeDescription
namestringDisplay name of the agent. Between 1 and 100 characters.
typeenum (keyword_detection, job_posting_keyword_detection, job_update, competitor, partner, customer, influencer, champion)The agent type.
parametersobjectkeyword_detection and job_posting_keyword_detection only. Type-specific configuration (see below). Omit for watchlist types.
parameters.tracking_keywordsstring[]Keywords Sillage monitors — in LinkedIn posts for keyword_detection, 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 only. Optional. ISO 8601 date — scrape only posts published after this date.
watchlist_idintegerOptional. Watchlist types only. Bind an existing list of the matching type instead of creating one automatically — its type must equal type or returns 422.

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"]
    }
  }'
const response = await fetch('https://api.getsillage.com/api/v2/agents', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SILLAGE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'LinkedIn keyword monitor',
    type: 'keyword_detection',
    parameters: {
      tracking_keywords: ['fundraising', 'series a', '"series a"', 'hiring sales'],
    },
  }),
})

const result = await response.json()
import { request } from 'node:https'

const body = JSON.stringify({
  name: 'LinkedIn keyword monitor',
  type: 'keyword_detection',
  parameters: {
    tracking_keywords: ['fundraising', 'series a', '"series a"', 'hiring sales'],
  },
})

const req = request(
  new URL('https://api.getsillage.com/api/v2/agents'),
  {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.SILLAGE_API_KEY}`,
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(body),
    },
  },
  (res) => {
    let data = ''
    res.on('data', (chunk) => {
      data += chunk
    })
    res.on('end', () => {
      console.log(JSON.parse(data))
    })
  },
)

req.write(body)
req.end()
import os
import requests

response = requests.post(
    "https://api.getsillage.com/api/v2/agents",
    json={
        "name": "LinkedIn keyword monitor",
        "type": "keyword_detection",
        "parameters": {
            "tracking_keywords": ["fundraising", "series a", '"series a"', "hiring sales"],
        },
    },
    headers={"Authorization": f"Bearer {os.environ['SILLAGE_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
result = response.json()

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
  }'
const response = await fetch('https://api.getsillage.com/api/v2/agents', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SILLAGE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Competitor tracker',
    type: 'competitor',
    watchlist_id: 7,
  }),
})

const result = await response.json()
import { request } from 'node:https'

const body = JSON.stringify({
  name: 'Competitor tracker',
  type: 'competitor',
  watchlist_id: 7,
})

const req = request(
  new URL('https://api.getsillage.com/api/v2/agents'),
  {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.SILLAGE_API_KEY}`,
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(body),
    },
  },
  (res) => {
    let data = ''
    res.on('data', (chunk) => {
      data += chunk
    })
    res.on('end', () => {
      console.log(JSON.parse(data))
    })
  },
)

req.write(body)
req.end()
import os
import requests

response = requests.post(
    "https://api.getsillage.com/api/v2/agents",
    json={
        "name": "Competitor tracker",
        "type": "competitor",
        "watchlist_id": 7,
    },
    headers={"Authorization": f"Bearer {os.environ['SILLAGE_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
result = response.json()

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"
  }'
const response = await fetch('https://api.getsillage.com/api/v2/agents', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SILLAGE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Job change tracker',
    type: 'job_update',
  }),
})

const result = await response.json()
import { request } from 'node:https'

const body = JSON.stringify({
  name: 'Job change tracker',
  type: 'job_update',
})

const req = request(
  new URL('https://api.getsillage.com/api/v2/agents'),
  {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.SILLAGE_API_KEY}`,
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(body),
    },
  },
  (res) => {
    let data = ''
    res.on('data', (chunk) => {
      data += chunk
    })
    res.on('end', () => {
      console.log(JSON.parse(data))
    })
  },
)

req.write(body)
req.end()
import os
import requests

response = requests.post(
    "https://api.getsillage.com/api/v2/agents",
    json={
        "name": "Job change tracker",
        "type": "job_update",
    },
    headers={"Authorization": f"Bearer {os.environ['SILLAGE_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
result = response.json()

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"]
    }
  }'
const response = await fetch('https://api.getsillage.com/api/v2/agents', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SILLAGE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Hiring intent monitor',
    type: 'job_posting_keyword_detection',
    parameters: {
      tracking_keywords: ['salesforce', 'revenue operations', 'outbound'],
    },
  }),
})

const result = await response.json()
import { request } from 'node:https'

const body = JSON.stringify({
  name: 'Hiring intent monitor',
  type: 'job_posting_keyword_detection',
  parameters: {
    tracking_keywords: ['salesforce', 'revenue operations', 'outbound'],
  },
})

const req = request(
  new URL('https://api.getsillage.com/api/v2/agents'),
  {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.SILLAGE_API_KEY}`,
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(body),
    },
  },
  (res) => {
    let data = ''
    res.on('data', (chunk) => {
      data += chunk
    })
    res.on('end', () => {
      console.log(JSON.parse(data))
    })
  },
)

req.write(body)
req.end()
import os
import requests

response = requests.post(
    "https://api.getsillage.com/api/v2/agents",
    json={
        "name": "Hiring intent monitor",
        "type": "job_posting_keyword_detection",
        "parameters": {
            "tracking_keywords": ["salesforce", "revenue operations", "outbound"],
        },
    },
    headers={"Authorization": f"Bearer {os.environ['SILLAGE_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
result = response.json()

Example response

201 Created

{
  "data": {
    "id": 42,
    "name": "LinkedIn keyword monitor",
    "type": "keyword_detection",
    "enabled": true,
    "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, job_posting_keyword_detection, job_update, competitor, partner, customer, influencer, champion).
data.enabledbooleanWhether the agent is currently active. A newly created agent is true.
data.parametersobjectConfigured parameters (keyword detection and job posting keyword detection); empty object for watchlist types.
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 or job_posting_keyword_detection, or watchlist_id references a list whose type does not match the agent type. Also returned when the workspace does not yet meet the minimum setup required for this agent type — see Minimum setup required.

On this page