curl --request POST \
--url https://api.lemlist.com/api/watchlist \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "New hires at target accounts",
"type": "newHire"
}
'import requests
url = "https://api.lemlist.com/api/watchlist"
payload = {
"name": "New hires at target accounts",
"type": "newHire"
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'New hires at target accounts', type: 'newHire'})
};
fetch('https://api.lemlist.com/api/watchlist', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));require 'uri'
require 'net/http'
url = URI("https://api.lemlist.com/api/watchlist")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"New hires at target accounts\",\n \"type\": \"newHire\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lemlist.com/api/watchlist",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'New hires at target accounts',
'type' => 'newHire'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"data": {
"_id": "<string>",
"name": "<string>",
"type": "companyIsHiring",
"status": "active",
"entity": "contact",
"segmentType": "all",
"signalProcessingType": "manual",
"signalOpportunityTemplate": {
"ownerType": "contact_owner",
"ownerId": "<string>",
"type": "email",
"priority": 0,
"data": {
"title": "<string>",
"subject": "<string>",
"emailTemplateId": "<string>",
"message": "<string>"
}
},
"filters": [
{
"filterId": "title",
"in": [
"<string>"
],
"out": [
"<string>"
]
}
],
"emoji": "<string>"
}
}activate requires both segmentType and signalProcessingTypeUnauthorizedInsufficient credits{
"error": "Beta is not enabled",
"code": "BETA_NOT_ENABLED"
}{
"error": "Campaign not found",
"code": "WATCH_LIST_IMPORT_LEADS_CAMPAIGN_NOT_FOUND"
}{
"error": "This campaign was set up as a manual campaign and cannot take a signal trigger; create a signal-based campaign instead",
"code": "WATCH_LIST_CAMPAIGN_IS_MANUAL"
}Monitoring limit exceededInternal server errorCreate Signal Agent
Creates a new Signal Agent (watch list).
curl --request POST \
--url https://api.lemlist.com/api/watchlist \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "New hires at target accounts",
"type": "newHire"
}
'import requests
url = "https://api.lemlist.com/api/watchlist"
payload = {
"name": "New hires at target accounts",
"type": "newHire"
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'New hires at target accounts', type: 'newHire'})
};
fetch('https://api.lemlist.com/api/watchlist', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));require 'uri'
require 'net/http'
url = URI("https://api.lemlist.com/api/watchlist")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"New hires at target accounts\",\n \"type\": \"newHire\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lemlist.com/api/watchlist",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'New hires at target accounts',
'type' => 'newHire'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"data": {
"_id": "<string>",
"name": "<string>",
"type": "companyIsHiring",
"status": "active",
"entity": "contact",
"segmentType": "all",
"signalProcessingType": "manual",
"signalOpportunityTemplate": {
"ownerType": "contact_owner",
"ownerId": "<string>",
"type": "email",
"priority": 0,
"data": {
"title": "<string>",
"subject": "<string>",
"emailTemplateId": "<string>",
"message": "<string>"
}
},
"filters": [
{
"filterId": "title",
"in": [
"<string>"
],
"out": [
"<string>"
]
}
],
"emoji": "<string>"
}
}activate requires both segmentType and signalProcessingTypeUnauthorizedInsufficient credits{
"error": "Beta is not enabled",
"code": "BETA_NOT_ENABLED"
}{
"error": "Campaign not found",
"code": "WATCH_LIST_IMPORT_LEADS_CAMPAIGN_NOT_FOUND"
}{
"error": "This campaign was set up as a manual campaign and cannot take a signal trigger; create a signal-based campaign instead",
"code": "WATCH_LIST_CAMPAIGN_IS_MANUAL"
}Monitoring limit exceededInternal server errorsegmentType, signalProcessingType and activate: true to run the full setup and start monitoring immediately. filters are validated against the chosen type — use List allowed filters to discover which filters a type accepts.campaignId with signalProcessingType: "push_to_campaign" to link the new agent to that campaign as its signal trigger in the same call — same effect as Add Signal Agent trigger. It requires the campaignSignalTrigger beta. If the call is refused (400, 403, 404 or 409), no agent is created. campaignId is not accepted by Update Signal Agent: to link an existing agent, use Add Signal Agent trigger.Authorizations
Basic authentication header of the form Basic <encoded-value>, where <encoded-value> is the base64-encoded string username:password.
Body
Display name
Signal type to monitor
companyIsHiring, companyRaisedFunds, recruitmentCampaign, newHire, companyEmployeeVisitedMyWebsite, customSignals, competitorConnections, competitorReactions, technologyChange, linkedinPeopleProfile, linkedinCompanyProfile, mergersAcquisitions, promotion, linkedinKeywords, republishedJobOffers, buyingIntent, newProductLaunch, companyAward, newPartnership, newOffice, closingOffice, costCutting, outagesAndSecurityBreaches, lawsuitsAndLegalIssues, githubStargazer Filters to apply (validated against the signal type)
Show child attributes
Show child attributes
Emoji shown next to the agent name (defaults to a random emoji)
Entity sourcing. Only all is supported via the API. Required together with signalProcessingType when activate is true.
all How detected signals are processed
manual, create_opportunity, push_to_campaign Task/opportunity template applied to each signal when signalProcessingType is create_opportunity.
Show child attributes
Show child attributes
Persona (pdp_xxx) used to source contacts from the People Database. Only for a company Signal Agent with signalProcessingType = push_to_campaign whose signal type does not already ship its own contact (those company signals carry no contact, so the persona is the only way to know who to reach). Optional; rejected on any other configuration.
Campaign (cam_xxx) to link as this Signal Agent's signal trigger, in the same call: every new signal pushes its contact into that campaign as a lead. Only with signalProcessingType = push_to_campaign. A campaign set up as manual in the lemlist app is refused (409). Requires the campaignSignalTrigger beta. Optional; on any refusal no agent is created.
"cam_ExAmPlE4k8Qz2Wn7R"
Fully set up and activate the agent. Requires segmentType and signalProcessingType.
Response
Created
A Signal Agent (watch list) configuration.
Show child attributes
Show child attributes
Was this page helpful?