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.
| Type | Description |
|---|---|
keyword_detection | Monitors LinkedIn posts for specified keywords. |
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) |
Note: For the five 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.
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
Request body
| Field | Type | Description |
|---|---|---|
| name | string | Display name of the agent. Between 1 and 100 characters. |
| type | enum (keyword_detection, job_posting_keyword_detection, job_update, competitor, partner, customer, influencer, champion) | The agent type. |
| parameters | object | keyword_detection and job_posting_keyword_detection only. Type-specific configuration (see below). Omit for watchlist types. |
| parameters.tracking_keywords | string[] | 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_scrape | integer | keyword_detection only. Optional. Maximum number of posts to scrape per run. |
| parameters.start_date | string | keyword_detection only. Optional. ISO 8601 date — scrape only posts published after this date. |
| watchlist_id | integer | Optional. 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
| 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, job_posting_keyword_detection, job_update, competitor, partner, customer, influencer, champion). |
| data.enabled | boolean | Whether the agent is currently active. A newly created agent is true. |
| data.parameters | object | Configured parameters (keyword detection and job posting keyword detection); empty object for watchlist types. |
| 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 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. |