curl --request GET \
--url https://api.tamtam.ai/api/v2/linkedin-content-signal-events \
--header 'Authorization: <api-key>'import requests
url = "https://api.tamtam.ai/api/v2/linkedin-content-signal-events"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.tamtam.ai/api/v2/linkedin-content-signal-events', 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/linkedin-content-signal-events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tamtam.ai/api/v2/linkedin-content-signal-events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tamtam.ai/api/v2/linkedin-content-signal-events")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/linkedin-content-signal-events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"events": [
{
"detected_at": "2023-11-07T05:31:56Z",
"id": "<string>",
"interaction_type": "Commenter",
"linkedin_post_id": 123,
"matched_use_cases": [
"<string>"
],
"occurred_at": "2023-11-07T05:31:56Z",
"profile_url": "<string>",
"signal_id": "<string>",
"comment_text": "<string>",
"contact_id": "<string>",
"headline": "<string>",
"linkedin_profile_id": "<string>",
"name": "<string>",
"post_url": "<string>"
}
],
"has_more": true,
"next_cursor": "<string>"
}{
"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"
}List content signal events
The people who liked or commented on posts the AI judged relevant for your signals.
To poll: call with no cursor, process the events, save next_cursor, and pass it back next time to get whatever has arrived since. next_cursor comes back on every non-empty page, including the last one; has_more: false means you are caught up, not that the feed has ended.
Delivery is at-least-once. Each event carries a stable id; store the ids you have processed and skip repeats rather than assuming an event arrives exactly once.
Each event carries matched_use_cases: the names of the use-cases the post fell into when it was judged, so you can route a lead by what they engaged with. Commenters also carry comment_text, the evidence to open with.
Identify people by contact_id, not by profile_url. Collecting a person upserts them as a contact in your account, so contact_id is present on nearly every event and is the id every other Tamtam surface takes. It is nullable, and the feed does not filter on it: a person whose profile could not be resolved stays in the feed unlinked. profile_url is for display, about half carrying LinkedIn’s encoded member id (/in/ACoAA…) rather than a readable name, so treat a null contact_id as not-linked-yet rather than as a person to re-identify from the URL or by name. linkedin_profile_id is the account-independent identity, for recognising the same person across signals or accounts.
curl --request GET \
--url https://api.tamtam.ai/api/v2/linkedin-content-signal-events \
--header 'Authorization: <api-key>'import requests
url = "https://api.tamtam.ai/api/v2/linkedin-content-signal-events"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.tamtam.ai/api/v2/linkedin-content-signal-events', 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/linkedin-content-signal-events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tamtam.ai/api/v2/linkedin-content-signal-events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tamtam.ai/api/v2/linkedin-content-signal-events")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/linkedin-content-signal-events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"events": [
{
"detected_at": "2023-11-07T05:31:56Z",
"id": "<string>",
"interaction_type": "Commenter",
"linkedin_post_id": 123,
"matched_use_cases": [
"<string>"
],
"occurred_at": "2023-11-07T05:31:56Z",
"profile_url": "<string>",
"signal_id": "<string>",
"comment_text": "<string>",
"contact_id": "<string>",
"headline": "<string>",
"linkedin_profile_id": "<string>",
"name": "<string>",
"post_url": "<string>"
}
],
"has_more": true,
"next_cursor": "<string>"
}{
"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
Query Parameters
Target account UUID. Required for staff callers; ignored for customer API keys.
Only return engagers surfaced by this signal. Omit for every signal on the account.
Only return events detected at or after this RFC3339 timestamp. Prefer the cursor for sequential polling.
"2026-09-01T00:00:00Z"
Pagination cursor from a previous call. Save next_cursor and pass it back unchanged to fetch what has arrived since.
Maximum events to return.
1 <= x <= 500Response
OK
Events in detection order, oldest first.
Show child attributes
Show child attributes
True when more events are already waiting. False means you are caught up, not that the feed has ended.
Pass back unchanged to fetch events detected after this page. Returned on every non-empty page, including the last.