curl --request POST \
--url https://api.tamtam.ai/api/v2/linkedin-content-signals \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"use_cases": [
{
"name": "Lean",
"prompt": "The post mentions lean, kaizen or continuous improvement on the shop floor."
}
],
"accept_all_posts": true,
"author_profile_urls": [
"<string>"
],
"company_linkedin_ids": [
"<string>"
],
"contacts_list_ids": [
"<string>"
],
"detects_event_attendance": true,
"is_enabled": true,
"keyword_queries": [
"<string>"
],
"max_contacts_per_sweep": 250,
"max_engagers_per_post": 250,
"max_posts_per_contact": 25,
"max_posts_per_sweep": 500,
"mentioned_company_linkedin_ids": [
"<string>"
],
"mentioned_profile_urls": [
"<string>"
],
"min_engagements": 1,
"post_filter": "<string>",
"post_sources": []
}
'import requests
url = "https://api.tamtam.ai/api/v2/linkedin-content-signals"
payload = {
"name": "<string>",
"use_cases": [
{
"name": "Lean",
"prompt": "The post mentions lean, kaizen or continuous improvement on the shop floor."
}
],
"accept_all_posts": True,
"author_profile_urls": ["<string>"],
"company_linkedin_ids": ["<string>"],
"contacts_list_ids": ["<string>"],
"detects_event_attendance": True,
"is_enabled": True,
"keyword_queries": ["<string>"],
"max_contacts_per_sweep": 250,
"max_engagers_per_post": 250,
"max_posts_per_contact": 25,
"max_posts_per_sweep": 500,
"mentioned_company_linkedin_ids": ["<string>"],
"mentioned_profile_urls": ["<string>"],
"min_engagements": 1,
"post_filter": "<string>",
"post_sources": []
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
use_cases: [
{
name: 'Lean',
prompt: 'The post mentions lean, kaizen or continuous improvement on the shop floor.'
}
],
accept_all_posts: true,
author_profile_urls: ['<string>'],
company_linkedin_ids: ['<string>'],
contacts_list_ids: ['<string>'],
detects_event_attendance: true,
is_enabled: true,
keyword_queries: ['<string>'],
max_contacts_per_sweep: 250,
max_engagers_per_post: 250,
max_posts_per_contact: 25,
max_posts_per_sweep: 500,
mentioned_company_linkedin_ids: ['<string>'],
mentioned_profile_urls: ['<string>'],
min_engagements: 1,
post_filter: '<string>',
post_sources: []
})
};
fetch('https://api.tamtam.ai/api/v2/linkedin-content-signals', 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-signals",
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' => '<string>',
'use_cases' => [
[
'name' => 'Lean',
'prompt' => 'The post mentions lean, kaizen or continuous improvement on the shop floor.'
]
],
'accept_all_posts' => true,
'author_profile_urls' => [
'<string>'
],
'company_linkedin_ids' => [
'<string>'
],
'contacts_list_ids' => [
'<string>'
],
'detects_event_attendance' => true,
'is_enabled' => true,
'keyword_queries' => [
'<string>'
],
'max_contacts_per_sweep' => 250,
'max_engagers_per_post' => 250,
'max_posts_per_contact' => 25,
'max_posts_per_sweep' => 500,
'mentioned_company_linkedin_ids' => [
'<string>'
],
'mentioned_profile_urls' => [
'<string>'
],
'min_engagements' => 1,
'post_filter' => '<string>',
'post_sources' => [
]
]),
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/linkedin-content-signals"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"use_cases\": [\n {\n \"name\": \"Lean\",\n \"prompt\": \"The post mentions lean, kaizen or continuous improvement on the shop floor.\"\n }\n ],\n \"accept_all_posts\": true,\n \"author_profile_urls\": [\n \"<string>\"\n ],\n \"company_linkedin_ids\": [\n \"<string>\"\n ],\n \"contacts_list_ids\": [\n \"<string>\"\n ],\n \"detects_event_attendance\": true,\n \"is_enabled\": true,\n \"keyword_queries\": [\n \"<string>\"\n ],\n \"max_contacts_per_sweep\": 250,\n \"max_engagers_per_post\": 250,\n \"max_posts_per_contact\": 25,\n \"max_posts_per_sweep\": 500,\n \"mentioned_company_linkedin_ids\": [\n \"<string>\"\n ],\n \"mentioned_profile_urls\": [\n \"<string>\"\n ],\n \"min_engagements\": 1,\n \"post_filter\": \"<string>\",\n \"post_sources\": []\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.tamtam.ai/api/v2/linkedin-content-signals")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"use_cases\": [\n {\n \"name\": \"Lean\",\n \"prompt\": \"The post mentions lean, kaizen or continuous improvement on the shop floor.\"\n }\n ],\n \"accept_all_posts\": true,\n \"author_profile_urls\": [\n \"<string>\"\n ],\n \"company_linkedin_ids\": [\n \"<string>\"\n ],\n \"contacts_list_ids\": [\n \"<string>\"\n ],\n \"detects_event_attendance\": true,\n \"is_enabled\": true,\n \"keyword_queries\": [\n \"<string>\"\n ],\n \"max_contacts_per_sweep\": 250,\n \"max_engagers_per_post\": 250,\n \"max_posts_per_contact\": 25,\n \"max_posts_per_sweep\": 500,\n \"mentioned_company_linkedin_ids\": [\n \"<string>\"\n ],\n \"mentioned_profile_urls\": [\n \"<string>\"\n ],\n \"min_engagements\": 1,\n \"post_filter\": \"<string>\",\n \"post_sources\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/linkedin-content-signals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"use_cases\": [\n {\n \"name\": \"Lean\",\n \"prompt\": \"The post mentions lean, kaizen or continuous improvement on the shop floor.\"\n }\n ],\n \"accept_all_posts\": true,\n \"author_profile_urls\": [\n \"<string>\"\n ],\n \"company_linkedin_ids\": [\n \"<string>\"\n ],\n \"contacts_list_ids\": [\n \"<string>\"\n ],\n \"detects_event_attendance\": true,\n \"is_enabled\": true,\n \"keyword_queries\": [\n \"<string>\"\n ],\n \"max_contacts_per_sweep\": 250,\n \"max_engagers_per_post\": 250,\n \"max_posts_per_contact\": 25,\n \"max_posts_per_sweep\": 500,\n \"mentioned_company_linkedin_ids\": [\n \"<string>\"\n ],\n \"mentioned_profile_urls\": [\n \"<string>\"\n ],\n \"min_engagements\": 1,\n \"post_filter\": \"<string>\",\n \"post_sources\": []\n}"
response = http.request(request)
puts response.read_body{
"accept_all_posts": true,
"author_profile_urls": [
"<string>"
],
"collection": "engagers",
"company_linkedin_ids": [
"<string>"
],
"contacts_list_ids": [
"<string>"
],
"created_at": "2023-11-07T05:31:56Z",
"detects_event_attendance": true,
"id": "<string>",
"is_enabled": true,
"keyword_queries": [
"<string>"
],
"max_contacts_per_sweep": 123,
"max_engagers_per_post": 123,
"max_posts_per_contact": 123,
"max_posts_per_sweep": 123,
"mentioned_company_linkedin_ids": [
"<string>"
],
"mentioned_profile_urls": [
"<string>"
],
"min_engagements": 123,
"name": "Shop-floor visibility pains",
"post_filter": "<string>",
"post_sources": [
"<string>"
],
"search_sort": "date_posted",
"search_window": "<string>",
"subject": "engagers",
"updated_at": "2023-11-07T05:31:56Z",
"use_cases": [
{
"name": "Lean",
"prompt": "The post mentions lean, kaizen or continuous improvement on the shop floor."
}
],
"last_sweep_engagers_collected": 123,
"last_sweep_outcome": "<string>",
"last_sweep_posts_analyzed": 123,
"last_swept_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 a LinkedIn content signal
Watch LinkedIn posts about a topic, have an AI score each one against your use-cases, and collect the people who liked or commented on the relevant ones as leads.
A signal is a search (keywords in LinkedIn boolean syntax and/or company_linkedin_ids, combined into one search) and one to ten named use-cases, each with its own AI prompt: what a post must be about to fall into it. Every night the sweep searches the past week, has a cheap model score each new post against every use-case (one credit per post judged; a post already judged is never judged again unless you edit the definition), and a post is relevant when it falls into at least one use-case. Each match carries the AI’s reason and whatever the use-case prompt asked to extract. The likers and commenters of relevant posts become events (one credit per person collected), stamped with the use-case names their post fell into.
Cost per sweep is bounded by max_posts_per_sweep (AI calls) plus relevant posts × max_engagers_per_post × 2 (likers and commenters). Both default conservatively; raise them once a signal is producing what you expect.
Read the verdicts at List judged posts and the people at List content signal events.
curl --request POST \
--url https://api.tamtam.ai/api/v2/linkedin-content-signals \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"use_cases": [
{
"name": "Lean",
"prompt": "The post mentions lean, kaizen or continuous improvement on the shop floor."
}
],
"accept_all_posts": true,
"author_profile_urls": [
"<string>"
],
"company_linkedin_ids": [
"<string>"
],
"contacts_list_ids": [
"<string>"
],
"detects_event_attendance": true,
"is_enabled": true,
"keyword_queries": [
"<string>"
],
"max_contacts_per_sweep": 250,
"max_engagers_per_post": 250,
"max_posts_per_contact": 25,
"max_posts_per_sweep": 500,
"mentioned_company_linkedin_ids": [
"<string>"
],
"mentioned_profile_urls": [
"<string>"
],
"min_engagements": 1,
"post_filter": "<string>",
"post_sources": []
}
'import requests
url = "https://api.tamtam.ai/api/v2/linkedin-content-signals"
payload = {
"name": "<string>",
"use_cases": [
{
"name": "Lean",
"prompt": "The post mentions lean, kaizen or continuous improvement on the shop floor."
}
],
"accept_all_posts": True,
"author_profile_urls": ["<string>"],
"company_linkedin_ids": ["<string>"],
"contacts_list_ids": ["<string>"],
"detects_event_attendance": True,
"is_enabled": True,
"keyword_queries": ["<string>"],
"max_contacts_per_sweep": 250,
"max_engagers_per_post": 250,
"max_posts_per_contact": 25,
"max_posts_per_sweep": 500,
"mentioned_company_linkedin_ids": ["<string>"],
"mentioned_profile_urls": ["<string>"],
"min_engagements": 1,
"post_filter": "<string>",
"post_sources": []
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
use_cases: [
{
name: 'Lean',
prompt: 'The post mentions lean, kaizen or continuous improvement on the shop floor.'
}
],
accept_all_posts: true,
author_profile_urls: ['<string>'],
company_linkedin_ids: ['<string>'],
contacts_list_ids: ['<string>'],
detects_event_attendance: true,
is_enabled: true,
keyword_queries: ['<string>'],
max_contacts_per_sweep: 250,
max_engagers_per_post: 250,
max_posts_per_contact: 25,
max_posts_per_sweep: 500,
mentioned_company_linkedin_ids: ['<string>'],
mentioned_profile_urls: ['<string>'],
min_engagements: 1,
post_filter: '<string>',
post_sources: []
})
};
fetch('https://api.tamtam.ai/api/v2/linkedin-content-signals', 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-signals",
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' => '<string>',
'use_cases' => [
[
'name' => 'Lean',
'prompt' => 'The post mentions lean, kaizen or continuous improvement on the shop floor.'
]
],
'accept_all_posts' => true,
'author_profile_urls' => [
'<string>'
],
'company_linkedin_ids' => [
'<string>'
],
'contacts_list_ids' => [
'<string>'
],
'detects_event_attendance' => true,
'is_enabled' => true,
'keyword_queries' => [
'<string>'
],
'max_contacts_per_sweep' => 250,
'max_engagers_per_post' => 250,
'max_posts_per_contact' => 25,
'max_posts_per_sweep' => 500,
'mentioned_company_linkedin_ids' => [
'<string>'
],
'mentioned_profile_urls' => [
'<string>'
],
'min_engagements' => 1,
'post_filter' => '<string>',
'post_sources' => [
]
]),
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/linkedin-content-signals"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"use_cases\": [\n {\n \"name\": \"Lean\",\n \"prompt\": \"The post mentions lean, kaizen or continuous improvement on the shop floor.\"\n }\n ],\n \"accept_all_posts\": true,\n \"author_profile_urls\": [\n \"<string>\"\n ],\n \"company_linkedin_ids\": [\n \"<string>\"\n ],\n \"contacts_list_ids\": [\n \"<string>\"\n ],\n \"detects_event_attendance\": true,\n \"is_enabled\": true,\n \"keyword_queries\": [\n \"<string>\"\n ],\n \"max_contacts_per_sweep\": 250,\n \"max_engagers_per_post\": 250,\n \"max_posts_per_contact\": 25,\n \"max_posts_per_sweep\": 500,\n \"mentioned_company_linkedin_ids\": [\n \"<string>\"\n ],\n \"mentioned_profile_urls\": [\n \"<string>\"\n ],\n \"min_engagements\": 1,\n \"post_filter\": \"<string>\",\n \"post_sources\": []\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.tamtam.ai/api/v2/linkedin-content-signals")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"use_cases\": [\n {\n \"name\": \"Lean\",\n \"prompt\": \"The post mentions lean, kaizen or continuous improvement on the shop floor.\"\n }\n ],\n \"accept_all_posts\": true,\n \"author_profile_urls\": [\n \"<string>\"\n ],\n \"company_linkedin_ids\": [\n \"<string>\"\n ],\n \"contacts_list_ids\": [\n \"<string>\"\n ],\n \"detects_event_attendance\": true,\n \"is_enabled\": true,\n \"keyword_queries\": [\n \"<string>\"\n ],\n \"max_contacts_per_sweep\": 250,\n \"max_engagers_per_post\": 250,\n \"max_posts_per_contact\": 25,\n \"max_posts_per_sweep\": 500,\n \"mentioned_company_linkedin_ids\": [\n \"<string>\"\n ],\n \"mentioned_profile_urls\": [\n \"<string>\"\n ],\n \"min_engagements\": 1,\n \"post_filter\": \"<string>\",\n \"post_sources\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/linkedin-content-signals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"use_cases\": [\n {\n \"name\": \"Lean\",\n \"prompt\": \"The post mentions lean, kaizen or continuous improvement on the shop floor.\"\n }\n ],\n \"accept_all_posts\": true,\n \"author_profile_urls\": [\n \"<string>\"\n ],\n \"company_linkedin_ids\": [\n \"<string>\"\n ],\n \"contacts_list_ids\": [\n \"<string>\"\n ],\n \"detects_event_attendance\": true,\n \"is_enabled\": true,\n \"keyword_queries\": [\n \"<string>\"\n ],\n \"max_contacts_per_sweep\": 250,\n \"max_engagers_per_post\": 250,\n \"max_posts_per_contact\": 25,\n \"max_posts_per_sweep\": 500,\n \"mentioned_company_linkedin_ids\": [\n \"<string>\"\n ],\n \"mentioned_profile_urls\": [\n \"<string>\"\n ],\n \"min_engagements\": 1,\n \"post_filter\": \"<string>\",\n \"post_sources\": []\n}"
response = http.request(request)
puts response.read_body{
"accept_all_posts": true,
"author_profile_urls": [
"<string>"
],
"collection": "engagers",
"company_linkedin_ids": [
"<string>"
],
"contacts_list_ids": [
"<string>"
],
"created_at": "2023-11-07T05:31:56Z",
"detects_event_attendance": true,
"id": "<string>",
"is_enabled": true,
"keyword_queries": [
"<string>"
],
"max_contacts_per_sweep": 123,
"max_engagers_per_post": 123,
"max_posts_per_contact": 123,
"max_posts_per_sweep": 123,
"mentioned_company_linkedin_ids": [
"<string>"
],
"mentioned_profile_urls": [
"<string>"
],
"min_engagements": 123,
"name": "Shop-floor visibility pains",
"post_filter": "<string>",
"post_sources": [
"<string>"
],
"search_sort": "date_posted",
"search_window": "<string>",
"subject": "engagers",
"updated_at": "2023-11-07T05:31:56Z",
"use_cases": [
{
"name": "Lean",
"prompt": "The post mentions lean, kaizen or continuous improvement on the shop floor."
}
],
"last_sweep_engagers_collected": 123,
"last_sweep_outcome": "<string>",
"last_sweep_posts_analyzed": 123,
"last_swept_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
Query Parameters
Target account UUID. Required for staff callers; ignored for customer API keys.
Body
Your label for this signal. Unique per account.
1One to 10 named use-cases, each with its own AI prompt: what a post must be about to fall into it. A post is relevant when it falls into at least one; ambiguous posts match nothing. The names are stamped on the engagers. Optional when accept_all_posts is true, required otherwise.
10Show child attributes
Show child attributes
Take every post the search returns, without the AI judge and at no post credit; use_cases then become optional. For a search narrow enough to be the relevance rule itself (a competitor's own posts, one precise phrase). Defaults to false.
LinkedIn profile URLs (https://www.linkedin.com/in/) of people whose posts to search. At least one of keyword_queries, company_linkedin_ids or author_profile_urls is required. The person's encoded member ID is resolved at sweep time; a URL that cannot be resolved is skipped and logged, never an error.
Engagers only: which person a relevant post yields. engagers (the default): the people who liked or commented on it. post_authors: the person who wrote it, for searches where the post itself is the buying signal. Company-page posts are skipped. No likers/commenters run is made under post_authors, so max_engagers_per_post is unused. Rejected for the authors subject.
engagers, post_authors Numeric LinkedIn company IDs whose posts to search (resolve with the companies search first). Combined with each keyword query into one search.
Contacts lists whose members an authors signal watches. Resolved to contacts at sweep time, so a contact added to the list later is picked up without editing the signal. Authors only; at least one of contacts_list_ids or author_profile_urls is required in that subject.
20Find the people who said they will be at an event, instead of scoring posts against your own use-cases. A post is relevant when its own author says they will be at a specific, named event that has not happened yet; a recap, an announcement of someone else's attendance, or a bare hashtag is not. Each relevant post reports the event's name, start date, location and the author's role (attending, speaking, hosting, exhibiting, sponsoring). Costs one post credit per post judged, like the AI judge, and use_cases become optional. Cannot be combined with accept_all_posts or post_filter, and not available on the authors subject.
Defaults to true.
One to 10 short LinkedIn content queries, each run as its own search and passed through as written: "lean manufacturing", "visual management", "kaizen OR gemba". Quote a phrase with the straight quote only: a typographic one (“ ” « ») is straightened for you, because LinkedIn reads no other kind. Keep each one short (1 to 4 words, one quoted phrase, or a small OR group): LinkedIn's content search returns almost nothing for a long query with several ANDs and many quoted phrases. Test candidates with the query tester in the app. At least one of keyword_queries, company_linkedin_ids or author_profile_urls is required.
10Authors cost dial: how many contacts have their posts fetched per sweep, least-recently-checked first, so a large list drains over several sweeps. One LinkedinContentSignalAuthor credit each. Defaults to 50.
1 <= x <= 500How many likers and how many commenters are read per relevant post. Defaults to 25.
1 <= x <= 500Authors cost dial: how many of each watched contact's recent posts are fetched and judged. Defaults to 10.
1 <= x <= 50How many new posts one pass of a sweep reads and, at most, judges (a sweep runs up to 10 passes until it has collected about 50 people or finds nothing new). Defaults to 10.
1 <= x <= 1000Engagers only: numeric LinkedIn company IDs the posts must mention (tag), whoever wrote them, e.g. posts tagging a competitor. Several IDs match a post mentioning any of them. Combined with keyword_queries and the authors into the same searches, so keywords plus a mention finds posts that say the words AND tag the company. Counts as a search on its own.
Engagers only: LinkedIn profile URLs (https://www.linkedin.com/in/) of people the posts must mention (tag), whoever wrote them. Several people match a post mentioning any of them. The encoded member ID is resolved at sweep time; when none of the mentioned people can be resolved and no mentioned company is set, the sweep fails with their names rather than searching without the mention. Counts as a search on its own. For posts mentioning the people of an authors signal, use post_sources instead.
Only consider posts with reactions + comments >= this. Defaults to 0.
x >= 0Decide relevance with your own keyword rule instead of the AI judge: a boolean expression over the post's text, e.g. "lean manufacturing" OR kaizen NOT hiring. Words, quoted phrases, AND, OR, NOT and parentheses; two words side by side are an AND; matching is case-insensitive and word-bounded. Every post the search returns is then judged by the rule alone, at no post credit, and use_cases become optional. Cannot be combined with accept_all_posts.
500Authors only: which of a watched person's posts count. authored (the default) is what they wrote themselves; mentioned is posts by anyone that tag them, answering "is anyone talking about this person?". Both together reads both corpora. mentioned costs more than authored -- one search per contact per sweep, plus a one-off profile lookup for each contact whose LinkedIn member ID is not already known -- and it can answer nothing for a contact with no LinkedIn profile, which the per-contact counters report separately. Billed as LinkedinContentSignalMention, one per contact searched.
2authored, mentioned Engagers only: the order the searches ask LinkedIn for. date_posted (the default, LinkedIn's Latest) reads the newest posts of the window first; relevance (Top match) reads the posts LinkedIn finds most relevant to the query first, for a broad query where the newest posts are mostly noise. The sweep's date window applies to both. Rejected for the authors subject unless date_posted.
date_posted, relevance Engagers only: how far back the searches look, and so the oldest a post may be to count. Omit to follow sweep_frequency: daily reads the past week, weekly and once the past month. Rejected when shorter than the time between two sweeps (past_24h on a weekly signal), and for the authors subject.
past_24h, past_week, past_month What the signal watches. engagers (default): search LinkedIn for posts and collect the people who liked or commented on the relevant ones. authors: take people you already know -- the contacts lists below -- and judge their own posts, answering "has this person posted about this?" per contact. The use-cases mean the same thing in both.
engagers, authors Response
OK
When true, every post the search returns is taken as relevant without the AI judge (no LinkedinPostAnalyzed credit); the people who engaged are still filtered on their headline and billed. Use-cases are optional in that mode.
LinkedIn profile URLs of people whose posts are searched, normalised to https://www.linkedin.com/in/. Authors (companies and people) are a union, combined with keywords into one search.
Engagers only: which person a relevant post yields. engagers (the default): the people who liked or commented on it. post_authors: the person who wrote it -- the one shopping in public when the post itself is the buying signal. Posts written by a company page have no person and are skipped. Each collected author is one event with interaction_type Author, filtered and billed like an engager.
engagers, post_authors Numeric LinkedIn company IDs whose posts are searched. Combined with each keyword query into one search.
Contacts lists whose members an authors signal watches. Resolved to contacts at sweep time, so a contact added to the list later is picked up without editing the signal. Authors only; at least one of contacts_list_ids or author_profile_urls is required in that subject.
Whether the built-in event rule is this signal's relevance rule: a post is relevant when its author said they will be at a named, upcoming event. The event found is reported on the post.
A disabled signal is not swept and costs nothing, but keeps its history.
The short LinkedIn content queries, exactly as you wrote them. Each one runs as its own search. Empty for a search that only follows companies or people.
Authors cost dial: how many contacts have their posts fetched per sweep, least-recently-checked first, so a large list drains over several sweeps. One LinkedinContentSignalAuthor credit each. Defaults to 50.
Cost dial: how many likers and how many commenters are read per relevant post.
Authors cost dial: how many of each watched contact's recent posts are fetched and judged. Defaults to 10.
Cost dial: how many new posts one pass of a sweep reads and, at most, judges. A sweep runs up to 10 passes, each reading past the posts it already knows, and stops once it has collected about 50 people or finds nothing new. Re-found posts keep their cached verdict and cost nothing.
Numeric LinkedIn company IDs the posts must mention (tag), whoever wrote them. Combined with the keyword queries and authors into the same searches.
LinkedIn profile URLs of people the posts must mention (tag), whoever wrote them, normalised to https://www.linkedin.com/in/.
Only posts with reactions + comments >= this are considered.
Your label for this signal. Unique per account.
"Shop-floor visibility pains"
The seller's own relevance rule, when the AI judge is not used: a boolean keyword expression over the post's text (words, quoted phrases, AND, OR, NOT, parentheses). Empty means the use-cases and the AI judge decide. When set, every post the search returns is judged by the rule alone, at no LinkedinPostAnalyzed credit, and use-cases are optional.
Authors only: which of a watched person's posts count. authored (the default) is what they wrote themselves; mentioned is posts by anyone that tag them, answering "is anyone talking about this person?". Both together reads both corpora. mentioned costs more than authored -- one search per contact per sweep, plus a one-off profile lookup for each contact whose LinkedIn member ID is not already known -- and it can answer nothing for a contact with no LinkedIn profile, which the per-contact counters report separately. Billed as LinkedinContentSignalMention, one per contact searched.
The order the searches ask LinkedIn for. date_posted (LinkedIn's Latest): the newest posts of the window first. relevance (Top match): the posts LinkedIn finds most relevant to the query first, which suits a broad query. The sweep's date window applies to both.
date_posted, relevance How far back the searches look, and so the oldest a post may be to count: past_24h, past_week or past_month. Empty when the window follows sweep_frequency (daily reads the past week, weekly and once the past month).
What the signal watches. engagers (default): search LinkedIn for posts and collect the people who liked or commented on the relevant ones. authors: take people you already know -- the contacts lists below -- and judge their own posts, answering "has this person posted about this?" per contact. The use-cases mean the same thing in both.
engagers, authors Ordered list of named use-cases, each with its own AI prompt. A post is relevant when it falls into at least one; the names are stamped on the engagers it yields.
Show child attributes
Show child attributes
How many people the last run collected from relevant posts. Each one cost one LinkedinContentSignalEngager credit.
What the last run did. One of:
- completed: it ran; last_sweep_posts_analyzed and last_sweep_engagers_collected say what it did. Zero is a real answer.
- out_of_credits: skipped before spending, because the account could not pay for a single post analysis or a single engager. This is the one to check when a feed goes quiet — topping up resumes it on the next sweep.
- failed: it ran and something went wrong, usually the provider. Self-correcting, since the next sweep re-reads an overlapping window.
How many posts the last run had the AI judge. Each one cost one LinkedinPostAnalyzed credit; cached re-finds are not counted.
When this signal last ran. Absent until its first sweep.