curl --request PUT \
--url https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"signal_types": [
"news",
"job_posting"
],
"is_enabled": true,
"news_topics": [
"m_and_a"
]
}
'import requests
url = "https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}"
payload = {
"signal_types": ["news", "job_posting"],
"is_enabled": True,
"news_topics": ["m_and_a"]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
signal_types: ['news', 'job_posting'],
is_enabled: true,
news_topics: ['m_and_a']
})
};
fetch('https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'signal_types' => [
'news',
'job_posting'
],
'is_enabled' => true,
'news_topics' => [
'm_and_a'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}"
payload := strings.NewReader("{\n \"signal_types\": [\n \"news\",\n \"job_posting\"\n ],\n \"is_enabled\": true,\n \"news_topics\": [\n \"m_and_a\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"signal_types\": [\n \"news\",\n \"job_posting\"\n ],\n \"is_enabled\": true,\n \"news_topics\": [\n \"m_and_a\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"signal_types\": [\n \"news\",\n \"job_posting\"\n ],\n \"is_enabled\": true,\n \"news_topics\": [\n \"m_and_a\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2023-11-07T05:31:56Z",
"icp_criteria_id": "<string>",
"id": "<string>",
"is_enabled": true,
"news_topics": [
"m_and_a"
],
"signal_types": [
"news",
"job_posting"
],
"updated_at": "2023-11-07T05:31:56Z"
}{
"detail": "Property foo is required but is missing.",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
],
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "https://example.com/errors/example"
}Create or update an ICP signal watch
Watch an ICP, so signals are detected on any company matching it — not only on companies already in your Key Accounts.
Keyed on the ICP, so there is at most one watch per ICP and calling this repeatedly is safe: it creates the watch the first time and reconfigures it afterwards.
Rejected with 422 when the ICP has no criteria, since that would match every company on the market.
curl --request PUT \
--url https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"signal_types": [
"news",
"job_posting"
],
"is_enabled": true,
"news_topics": [
"m_and_a"
]
}
'import requests
url = "https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}"
payload = {
"signal_types": ["news", "job_posting"],
"is_enabled": True,
"news_topics": ["m_and_a"]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
signal_types: ['news', 'job_posting'],
is_enabled: true,
news_topics: ['m_and_a']
})
};
fetch('https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'signal_types' => [
'news',
'job_posting'
],
'is_enabled' => true,
'news_topics' => [
'm_and_a'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}"
payload := strings.NewReader("{\n \"signal_types\": [\n \"news\",\n \"job_posting\"\n ],\n \"is_enabled\": true,\n \"news_topics\": [\n \"m_and_a\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"signal_types\": [\n \"news\",\n \"job_posting\"\n ],\n \"is_enabled\": true,\n \"news_topics\": [\n \"m_and_a\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/icp-signal-watches/{icpCriteriaID}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"signal_types\": [\n \"news\",\n \"job_posting\"\n ],\n \"is_enabled\": true,\n \"news_topics\": [\n \"m_and_a\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2023-11-07T05:31:56Z",
"icp_criteria_id": "<string>",
"id": "<string>",
"is_enabled": true,
"news_topics": [
"m_and_a"
],
"signal_types": [
"news",
"job_posting"
],
"updated_at": "2023-11-07T05:31:56Z"
}{
"detail": "Property foo is required but is missing.",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
],
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "https://example.com/errors/example"
}Authorizations
Account API key passed in the Authorization header
Path Parameters
ICP criteria UUID. Create one via Create an ICP criteria.
Query Parameters
Target account UUID. Required for staff; ignored for customer keys.
Body
Signal types to detect. Supported: news, job_posting.
["news", "job_posting"]
Defaults to true. Set false to record events without delivering them.
true
Which news topics to search. Supported: m_and_a, rebranding, funding_round, product_launch, relocation. Omit or send an empty array for every topic. Narrowing costs nothing and searches each selected topic more deeply, since a run's article budget is split across (markets x topics). Ignored when signal_types does not include news.
["m_and_a"]
Response
OK
When the watch was first created.
The ICP whose matching companies are watched.
Watch UUID. Stable across reconfigurations; every endpoint keys on icp_criteria_id instead, so you rarely need this.
When false the watch keeps detecting and recording events but delivers nothing — useful to inspect what an ICP would produce before acting on it.
News topics this watch searches. Empty means every supported topic.
["m_and_a"]
Signal types this watch produces.
["news", "job_posting"]
When the watch was last reconfigured.