curl --request POST \
--url https://api.tamtam.ai/api/v2/lead-generation-runs \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"signals": [
{
"id": "<string>"
}
],
"target_leads": 1000,
"name": "<string>",
"qa_enabled": true
}
'import requests
url = "https://api.tamtam.ai/api/v2/lead-generation-runs"
payload = {
"signals": [{ "id": "<string>" }],
"target_leads": 1000,
"name": "<string>",
"qa_enabled": True
}
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({
signals: [{id: '<string>'}],
target_leads: 1000,
name: '<string>',
qa_enabled: true
})
};
fetch('https://api.tamtam.ai/api/v2/lead-generation-runs', 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/lead-generation-runs",
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([
'signals' => [
[
'id' => '<string>'
]
],
'target_leads' => 1000,
'name' => '<string>',
'qa_enabled' => true
]),
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/lead-generation-runs"
payload := strings.NewReader("{\n \"signals\": [\n {\n \"id\": \"<string>\"\n }\n ],\n \"target_leads\": 1000,\n \"name\": \"<string>\",\n \"qa_enabled\": true\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/lead-generation-runs")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"signals\": [\n {\n \"id\": \"<string>\"\n }\n ],\n \"target_leads\": 1000,\n \"name\": \"<string>\",\n \"qa_enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/lead-generation-runs")
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 \"signals\": [\n {\n \"id\": \"<string>\"\n }\n ],\n \"target_leads\": 1000,\n \"name\": \"<string>\",\n \"qa_enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"name": "<string>",
"program_id": "<string>",
"qa_enabled": true,
"run_id": "<string>",
"signals": 123,
"target_leads": 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"
}Start a lead generation run
Sweep several of the signals you already have, all at once, and collect what they find into one list, up to target_leads. This is what makes a signal run at all: a signal no program picks never sweeps. It records a lead generation program with no schedule (open it under Settings > Signals > Lead generation to put it on one, add a lead score floor or firmographic rules, rewrite the QA prompt or choose the lists it fills) and starts a run of it immediately. It creates no signal.
Pick the signals from List signals. Every kind with a sweep of its own can be picked; the inbox signals and job change alerts cannot. With qa_enabled the run collects about 30% more than the target and has an AI judge each lead against your ICP and personas, dropping the ones that fail.
This is the operation that spends. Starting a run starts every picked signal’s own sweep immediately, each billing at its own rate (per post or article judged, per person collected), and the QA adds one AI call per lead judged. A run can take from minutes to hours; this returns as soon as it has started.
curl --request POST \
--url https://api.tamtam.ai/api/v2/lead-generation-runs \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"signals": [
{
"id": "<string>"
}
],
"target_leads": 1000,
"name": "<string>",
"qa_enabled": true
}
'import requests
url = "https://api.tamtam.ai/api/v2/lead-generation-runs"
payload = {
"signals": [{ "id": "<string>" }],
"target_leads": 1000,
"name": "<string>",
"qa_enabled": True
}
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({
signals: [{id: '<string>'}],
target_leads: 1000,
name: '<string>',
qa_enabled: true
})
};
fetch('https://api.tamtam.ai/api/v2/lead-generation-runs', 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/lead-generation-runs",
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([
'signals' => [
[
'id' => '<string>'
]
],
'target_leads' => 1000,
'name' => '<string>',
'qa_enabled' => true
]),
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/lead-generation-runs"
payload := strings.NewReader("{\n \"signals\": [\n {\n \"id\": \"<string>\"\n }\n ],\n \"target_leads\": 1000,\n \"name\": \"<string>\",\n \"qa_enabled\": true\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/lead-generation-runs")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"signals\": [\n {\n \"id\": \"<string>\"\n }\n ],\n \"target_leads\": 1000,\n \"name\": \"<string>\",\n \"qa_enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/lead-generation-runs")
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 \"signals\": [\n {\n \"id\": \"<string>\"\n }\n ],\n \"target_leads\": 1000,\n \"name\": \"<string>\",\n \"qa_enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"name": "<string>",
"program_id": "<string>",
"qa_enabled": true,
"run_id": "<string>",
"signals": 123,
"target_leads": 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
One to twenty signals to sweep, from List signals. Every kind with a sweep of its own can be picked.
1 - 20 elementsShow child attributes
Show child attributes
How many leads you want in the list.
1 <= x <= 2000Optional name for the program, which also names the list its runs fill. Omit for a timestamped default.
120Have an AI judge each lead against your ICP and personas and drop the failures. Defaults to true.
Response
OK
The program recorded for this run, with no schedule. Open it under Settings > Signals > Lead generation to put it on one.
How many signals the run sweeps.