curl --request GET \
--url https://www.trysignalbase.com/api/v2/people \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.trysignalbase.com/api/v2/people"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.trysignalbase.com/api/v2/people', 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://www.trysignalbase.com/api/v2/people",
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: Bearer <token>"
],
]);
$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://www.trysignalbase.com/api/v2/people"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.trysignalbase.com/api/v2/people")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trysignalbase.com/api/v2/people")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"name": "Sarah K.",
"linkedin_url": "https://www.linkedin.com/in/sarah-k",
"title": "Chief Technology Officer",
"status": "active",
"city": null,
"country": null,
"company": {
"name": "NextGen Software",
"domain": "nextgensoftware.com",
"linkedin_url": "https://www.linkedin.com/company/nextgensoftware",
"country": "NL",
"city": null,
"size_band": "101-250",
"industry": "Technology"
},
"is_latest_signal": true,
"matched_signal": {
"type": "funding_round",
"date": "2026-05-12",
"summary": "Series B, $40M led by Accel",
"source_url": "https://techcrunch.com/2026/05/12/nextgen-series-b"
}
},
{
"name": "Michael R.",
"linkedin_url": "https://www.linkedin.com/in/michael-r",
"title": "VP of Engineering",
"status": "active",
"city": "Berlin",
"country": "DE",
"company": {
"name": "HealthTech Solutions",
"domain": "healthtechsolutions.co.uk",
"linkedin_url": "https://www.linkedin.com/company/healthtechsolutions",
"country": "GB",
"city": null,
"size_band": "51-100",
"industry": "Healthcare Technology"
},
"is_latest_signal": false,
"matched_signal": {
"type": "job_change",
"date": "2026-04-02",
"summary": "Michael R. started as VP of Engineering at HealthTech Solutions",
"source_url": "https://www.linkedin.com/in/michael-r"
}
}
],
"pagination": {
"currentPage": 1,
"totalPages": 12,
"totalCount": 1183,
"hasNextPage": true,
"hasPreviousPage": false
},
"meta": {
"endpoint": "people.list",
"creditsUsed": 1,
"creditsRemaining": 4999
}
}{
"success": false,
"error": "Invalid seniority value: exec. Accepted values: founder, c_level, vp, director, head, lead, manager."
}{
"success": false,
"error": "Invalid API key"
}{
"success": false,
"error": "out of credits, please contact support to increase your usage"
}{
"success": false,
"error": "Rate limit exceeded. Please try again later."
}{
"success": false,
"error": "Failed to search people"
}Search People
Discover people across employees and job-change subjects, filtered by title, function, seniority, geography, company attributes, and signal activity. Each result includes an inline matched_signal — the latest signal that matched your filters — plus is_latest_signal, which reports whether that matched signal is also the person’s newest overall signal.
Different filters combine with AND; comma-separated values within a single filter combine with OR. A person qualifies if any of their signals match the filters, and the latest matching one is surfaced as matched_signal. Results are deduplicated by normalized person LinkedIn URL (falling back to normalized name + company identity) before pagination. Default sort is matched_signal.date descending.
curl --request GET \
--url https://www.trysignalbase.com/api/v2/people \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.trysignalbase.com/api/v2/people"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.trysignalbase.com/api/v2/people', 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://www.trysignalbase.com/api/v2/people",
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: Bearer <token>"
],
]);
$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://www.trysignalbase.com/api/v2/people"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.trysignalbase.com/api/v2/people")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trysignalbase.com/api/v2/people")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"name": "Sarah K.",
"linkedin_url": "https://www.linkedin.com/in/sarah-k",
"title": "Chief Technology Officer",
"status": "active",
"city": null,
"country": null,
"company": {
"name": "NextGen Software",
"domain": "nextgensoftware.com",
"linkedin_url": "https://www.linkedin.com/company/nextgensoftware",
"country": "NL",
"city": null,
"size_band": "101-250",
"industry": "Technology"
},
"is_latest_signal": true,
"matched_signal": {
"type": "funding_round",
"date": "2026-05-12",
"summary": "Series B, $40M led by Accel",
"source_url": "https://techcrunch.com/2026/05/12/nextgen-series-b"
}
},
{
"name": "Michael R.",
"linkedin_url": "https://www.linkedin.com/in/michael-r",
"title": "VP of Engineering",
"status": "active",
"city": "Berlin",
"country": "DE",
"company": {
"name": "HealthTech Solutions",
"domain": "healthtechsolutions.co.uk",
"linkedin_url": "https://www.linkedin.com/company/healthtechsolutions",
"country": "GB",
"city": null,
"size_band": "51-100",
"industry": "Healthcare Technology"
},
"is_latest_signal": false,
"matched_signal": {
"type": "job_change",
"date": "2026-04-02",
"summary": "Michael R. started as VP of Engineering at HealthTech Solutions",
"source_url": "https://www.linkedin.com/in/michael-r"
}
}
],
"pagination": {
"currentPage": 1,
"totalPages": 12,
"totalCount": 1183,
"hasNextPage": true,
"hasPreviousPage": false
},
"meta": {
"endpoint": "people.list",
"creditsUsed": 1,
"creditsRemaining": 4999
}
}{
"success": false,
"error": "Invalid seniority value: exec. Accepted values: founder, c_level, vp, director, head, lead, manager."
}{
"success": false,
"error": "Invalid API key"
}{
"success": false,
"error": "out of credits, please contact support to increase your usage"
}{
"success": false,
"error": "Rate limit exceeded. Please try again later."
}{
"success": false,
"error": "Failed to search people"
}Authorizations
Use your ff_live_… API key as a Bearer token in the Authorization header.
Query Parameters
Page number for pagination
x >= 1Number of results per page (maximum 100)
1 <= x <= 100Job title or comma-separated list (e.g. CTO,VP of Engineering). Matched with word boundaries via taxonomy/pattern logic — COO will not match Cook or Coordinator, and Assistant to the CEO is excluded from CEO.
Comma-separated function ids. Accepted values: marketing, sales, engineering, product, design, operations, finance, people, data, customer_success, growth, legal. Unknown values return 400.
Comma-separated seniority ids. Accepted values: founder, c_level, vp, director, head, lead, manager. Unknown values return 400.
ISO 3166-1 alpha-2 country code or comma-separated list (e.g. US,NL). Matches either the company's country or the person's country.
ISO 3166-1 alpha-2 country code or comma-separated list (e.g. GB,IE). Matches the person's own country only — no company-country fallback, unlike country. Person location is currently available on a minority of records (job-change sourced), so this filter favors precision over recall; combine with country if you need maximum coverage.
Comma-separated list of country codes to EXCLUDE (denylist), e.g. CN. A person is excluded when EITHER their company country or their own person country matches; rows with an unknown country on a side are kept.
Free-text city match (partial, case-insensitive). Only job-change people carry city data today; employee-sourced people have no city and are excluded when this filter is set.
Comma-separated company size bands, matched against the company's employee count. Accepted values: 1-10, 11-50, 51-100, 101-250, 251-500, 501-1000, 1000-plus. People whose record has no linked company with a known headcount are excluded when this filter is set. Unknown values return 400.
Industry name or comma-separated list (case-insensitive exact match on the company's industry).
Person LinkedIn profile URL — resolves a specific person instead of browsing an ICP. Matches current employees and job-change subjects by canonical equality; scheme, www. and a trailing slash are accepted and ignored. Must be a personal profile URL (/in/ or legacy /pub/) — pass a company page to company_linkedin_url instead. Invalid syntax returns 400; a valid URL with no match returns an empty data set. When set, signal_date_range defaults to all-time.
Company website domain — returns the people at that company. Exact (canonicalized) match; scheme, www., port, path and trailing slash are normalized. Invalid syntax returns 400; no match returns an empty data set. When set, signal_date_range defaults to all-time.
Company LinkedIn URL — returns the people at that company. Exact (canonicalized) match; scheme, www. and trailing slash are normalized. Invalid syntax returns 400; no match returns an empty data set. When set, signal_date_range defaults to all-time.
Comma-separated signal type(s) to pin matched_signal to. Accepted values: funding_round, acquisition, job_change. When omitted, matched_signal is the person's newest qualifying signal of any supported type, so types can mix across a page. Unknown values return 400.
Lookback window for the matched signal, as <n><unit> where unit is d (days), w (weeks), m (months), or y (years) — e.g. 30d, 6m, 12m, 2y. People whose latest matching signal falls outside this window are excluded. Malformed or out-of-range values return 400. Default: 12m for a normal ICP browse, but all-time when an identifier lookup (linkedin_url, company_domain, or company_linkedin_url) is set — pass an explicit value to still narrow the window.
Whether to include former employees. Currently only false is supported — passing true returns 400 because job-change records have no current/former semantics yet. The endpoint is active-only (current employees).
false If set to true, returns only the total count without data rows and without deducting credits.
true 