curl --request POST \
--url https://api.tamtam.ai/api/v2/page-follower-signals \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"linkedin_company_url": "<string>",
"name": "<string>",
"countries": [
"<string>"
],
"departments": [
"<string>"
],
"is_enabled": true,
"job_titles": [
"<string>"
],
"max_followers_per_sweep": 500,
"seniority_levels": [
"<string>"
]
}
'import requests
url = "https://api.tamtam.ai/api/v2/page-follower-signals"
payload = {
"linkedin_company_url": "<string>",
"name": "<string>",
"countries": ["<string>"],
"departments": ["<string>"],
"is_enabled": True,
"job_titles": ["<string>"],
"max_followers_per_sweep": 500,
"seniority_levels": ["<string>"]
}
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({
linkedin_company_url: '<string>',
name: '<string>',
countries: ['<string>'],
departments: ['<string>'],
is_enabled: true,
job_titles: ['<string>'],
max_followers_per_sweep: 500,
seniority_levels: ['<string>']
})
};
fetch('https://api.tamtam.ai/api/v2/page-follower-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/page-follower-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([
'linkedin_company_url' => '<string>',
'name' => '<string>',
'countries' => [
'<string>'
],
'departments' => [
'<string>'
],
'is_enabled' => true,
'job_titles' => [
'<string>'
],
'max_followers_per_sweep' => 500,
'seniority_levels' => [
'<string>'
]
]),
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/page-follower-signals"
payload := strings.NewReader("{\n \"linkedin_company_url\": \"<string>\",\n \"name\": \"<string>\",\n \"countries\": [\n \"<string>\"\n ],\n \"departments\": [\n \"<string>\"\n ],\n \"is_enabled\": true,\n \"job_titles\": [\n \"<string>\"\n ],\n \"max_followers_per_sweep\": 500,\n \"seniority_levels\": [\n \"<string>\"\n ]\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/page-follower-signals")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"linkedin_company_url\": \"<string>\",\n \"name\": \"<string>\",\n \"countries\": [\n \"<string>\"\n ],\n \"departments\": [\n \"<string>\"\n ],\n \"is_enabled\": true,\n \"job_titles\": [\n \"<string>\"\n ],\n \"max_followers_per_sweep\": 500,\n \"seniority_levels\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/page-follower-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 \"linkedin_company_url\": \"<string>\",\n \"name\": \"<string>\",\n \"countries\": [\n \"<string>\"\n ],\n \"departments\": [\n \"<string>\"\n ],\n \"is_enabled\": true,\n \"job_titles\": [\n \"<string>\"\n ],\n \"max_followers_per_sweep\": 500,\n \"seniority_levels\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"is_enabled": true,
"kind": "<string>",
"name": "<string>",
"used_by_program_count": 123
}{
"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 page follower signal
Each sweep reads the people who follow a LinkedIn company page and collects them. The page can be anyone’s: your own, a competitor’s, a partner’s, an event or association page. Following a competitor’s page is a buying signal in itself.
The signal has no persona or keyword filter of its own: it collects the followers, and deciding which of them are leads (persona fit, lead score, AI QA) is the lead generation program’s job. Four filters are applied by the provider during the scrape, so they decide who is read and paid for; read their vocabularies at List page follower filter values first, because anything else is refused.
Cost when it runs: up to max_followers_per_sweep followers read per sweep, and the read is paid.
Creating a signal starts nothing and bills nothing. A signal runs only when a lead generation program picks it: Start a lead generation run sweeps it now and records a program you can put on a schedule under Settings > Signals > Lead generation. List signals reports used_by_program_count per signal; zero means it is defined and never runs. List first, so you do not create a second signal over a question you already ask: duplicates bill twice and split the leads across two names.
curl --request POST \
--url https://api.tamtam.ai/api/v2/page-follower-signals \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"linkedin_company_url": "<string>",
"name": "<string>",
"countries": [
"<string>"
],
"departments": [
"<string>"
],
"is_enabled": true,
"job_titles": [
"<string>"
],
"max_followers_per_sweep": 500,
"seniority_levels": [
"<string>"
]
}
'import requests
url = "https://api.tamtam.ai/api/v2/page-follower-signals"
payload = {
"linkedin_company_url": "<string>",
"name": "<string>",
"countries": ["<string>"],
"departments": ["<string>"],
"is_enabled": True,
"job_titles": ["<string>"],
"max_followers_per_sweep": 500,
"seniority_levels": ["<string>"]
}
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({
linkedin_company_url: '<string>',
name: '<string>',
countries: ['<string>'],
departments: ['<string>'],
is_enabled: true,
job_titles: ['<string>'],
max_followers_per_sweep: 500,
seniority_levels: ['<string>']
})
};
fetch('https://api.tamtam.ai/api/v2/page-follower-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/page-follower-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([
'linkedin_company_url' => '<string>',
'name' => '<string>',
'countries' => [
'<string>'
],
'departments' => [
'<string>'
],
'is_enabled' => true,
'job_titles' => [
'<string>'
],
'max_followers_per_sweep' => 500,
'seniority_levels' => [
'<string>'
]
]),
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/page-follower-signals"
payload := strings.NewReader("{\n \"linkedin_company_url\": \"<string>\",\n \"name\": \"<string>\",\n \"countries\": [\n \"<string>\"\n ],\n \"departments\": [\n \"<string>\"\n ],\n \"is_enabled\": true,\n \"job_titles\": [\n \"<string>\"\n ],\n \"max_followers_per_sweep\": 500,\n \"seniority_levels\": [\n \"<string>\"\n ]\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/page-follower-signals")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"linkedin_company_url\": \"<string>\",\n \"name\": \"<string>\",\n \"countries\": [\n \"<string>\"\n ],\n \"departments\": [\n \"<string>\"\n ],\n \"is_enabled\": true,\n \"job_titles\": [\n \"<string>\"\n ],\n \"max_followers_per_sweep\": 500,\n \"seniority_levels\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/page-follower-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 \"linkedin_company_url\": \"<string>\",\n \"name\": \"<string>\",\n \"countries\": [\n \"<string>\"\n ],\n \"departments\": [\n \"<string>\"\n ],\n \"is_enabled\": true,\n \"job_titles\": [\n \"<string>\"\n ],\n \"max_followers_per_sweep\": 500,\n \"seniority_levels\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"is_enabled": true,
"kind": "<string>",
"name": "<string>",
"used_by_program_count": 123
}{
"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
The page to watch: a linkedin.com /company/, /school/ or /showcase/ URL. Anyone's page, not only your own.
1Short label, unique in the account. Name it after the page, e.g. 'Acme page followers'.
1Provider-side country filter, country NAMES from List page follower filter values. Applied during the scrape, so it lowers what each sweep costs.
Provider-side department filter, from List page follower filter values. Applied during the scrape.
Defaults to true.
Provider-side job-title filter, from List page follower filter values. Applied during the scrape.
Followers read per sweep. Defaults to 250. The cost dial: reading a follower is paid.
1 <= x <= 1000Provider-side seniority filter, from List page follower filter values. Applied during the scrape.