Add Signal Agent Trigger
curl --request POST \
--url https://api.lemlist.com/api/campaigns/{campaignId}/triggers/watch-lists \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"watchListId": "wat_ExAmPlE9Hd3Vx6Tp1"
}
'import requests
url = "https://api.lemlist.com/api/campaigns/{campaignId}/triggers/watch-lists"
payload = { "watchListId": "wat_ExAmPlE9Hd3Vx6Tp1" }
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({watchListId: 'wat_ExAmPlE9Hd3Vx6Tp1'})
};
fetch('https://api.lemlist.com/api/campaigns/{campaignId}/triggers/watch-lists', 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/campaigns/{campaignId}/triggers/watch-lists")
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 \"watchListId\": \"wat_ExAmPlE9Hd3Vx6Tp1\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lemlist.com/api/campaigns/{campaignId}/triggers/watch-lists",
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([
'watchListId' => 'wat_ExAmPlE9Hd3Vx6Tp1'
]),
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": {
"watchListIds": [
"wat_ExAmPlE9Hd3Vx6Tp1"
],
"importFromExistingSignals": false,
"deduplicate": true,
"duplicateProcessingType": "manual"
}
}
Campaigns
Add Signal Agent Trigger
Links a Signal Agent to a campaign as its signal trigger.
POST
/
campaigns
/
{campaignId}
/
triggers
/
watch-lists
Add Signal Agent Trigger
curl --request POST \
--url https://api.lemlist.com/api/campaigns/{campaignId}/triggers/watch-lists \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"watchListId": "wat_ExAmPlE9Hd3Vx6Tp1"
}
'import requests
url = "https://api.lemlist.com/api/campaigns/{campaignId}/triggers/watch-lists"
payload = { "watchListId": "wat_ExAmPlE9Hd3Vx6Tp1" }
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({watchListId: 'wat_ExAmPlE9Hd3Vx6Tp1'})
};
fetch('https://api.lemlist.com/api/campaigns/{campaignId}/triggers/watch-lists', 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/campaigns/{campaignId}/triggers/watch-lists")
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 \"watchListId\": \"wat_ExAmPlE9Hd3Vx6Tp1\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lemlist.com/api/campaigns/{campaignId}/triggers/watch-lists",
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([
'watchListId' => 'wat_ExAmPlE9Hd3Vx6Tp1'
]),
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": {
"watchListIds": [
"wat_ExAmPlE9Hd3Vx6Tp1"
],
"importFromExistingSignals": false,
"deduplicate": true,
"duplicateProcessingType": "manual"
}
}
This endpoint is in beta: it requires the
campaignSignalTrigger beta on your team (403 BETA_NOT_ENABLED otherwise).watchListIds in the response lists every agent linked to the campaign.
The link uses the default import options — deduplicate on, duplicates handled
manually, no backfill. Adjust them in the campaign editor in the lemlist app.
A campaign created through the API or the MCP has no creation mode yet: the
first link makes it a signal-based campaign, so the trigger shows in its
sequence editor. A campaign set up as manual in the lemlist app cannot take a
signal trigger (409): create a signal-based campaign instead.
A draft Signal Agent can be linked, but the campaign cannot be launched from
the lemlist app until at least one linked agent is active.
A company-level Signal Agent without a persona sources no contact, so nothing
reaches the campaign. Set its
personaId first — see
List personas.campaignId to
Create Signal Agent.Authorizations
Basic authentication header of the form Basic <encoded-value>, where <encoded-value> is the base64-encoded string username:password.
Path Parameters
The unique identifier of the campaign
Body
application/json
Id of the Signal Agent (wat_xxx) to link to the campaign.
Example:
"wat_ExAmPlE9Hd3Vx6Tp1"
Response
The Signal Agent is linked. data is the campaign's signal-trigger configuration, with every linked agent in watchListIds.
Show child attributes
Show child attributes
Was this page helpful?