curl --request POST \
--url https://app.tryspecter.com/api/v1/search \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"product": "company",
"query": "high-growth fintech companies in Europe"
}
'import requests
url = "https://app.tryspecter.com/api/v1/search"
payload = {
"product": "company",
"query": "high-growth fintech companies in Europe"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({product: 'company', query: 'high-growth fintech companies in Europe'})
};
fetch('https://app.tryspecter.com/api/v1/search', 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://app.tryspecter.com/api/v1/search",
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([
'product' => 'company',
'query' => 'high-growth fintech companies in Europe'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.tryspecter.com/api/v1/search"
payload := strings.NewReader("{\n \"product\": \"company\",\n \"query\": \"high-growth fintech companies in Europe\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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://app.tryspecter.com/api/v1/search")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"product\": \"company\",\n \"query\": \"high-growth fintech companies in Europe\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryspecter.com/api/v1/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"product\": \"company\",\n \"query\": \"high-growth fintech companies in Europe\"\n}"
response = http.request(request)
puts response.read_body{
"product": "company",
"query_id": 84213,
"web_url": "https://app.tryspecter.com/companies/84213",
"total_count": 128,
"items": [
{
"id": "5e3bc2b700c8f4c966ad2bbd",
"organization_name": "Hedgehog Analytics",
"description": "Real-time supply-chain risk scoring for mid-market manufacturers.",
"founded_year": 2022,
"growth_stage": "early",
"employee_count": 48,
"website": {
"domain": "hedgehoganalytics.com",
"url": "https://hedgehoganalytics.com"
},
"funding": {
"total_funding_usd": 14500000,
"last_funding_usd": 12000000,
"last_funding_type": "Series A",
"round_count": 2
},
"hq": {
"city": "Berlin",
"state": "Berlin",
"country": "Germany",
"continent": "Europe",
"regions": [
"Berlin",
"Germany"
]
}
},
{
"id": "6a1de49c11b2f7d3aa84c012",
"organization_name": "Kestrel Freight",
"description": "Freight-forwarding automation for cross-border shippers.",
"founded_year": 2021,
"growth_stage": "seed",
"employee_count": 22,
"website": {
"domain": "kestrelfreight.com",
"url": "https://kestrelfreight.com"
},
"funding": {
"total_funding_usd": 5200000,
"last_funding_usd": 5200000,
"last_funding_type": "Seed",
"round_count": 1
},
"hq": {
"city": "Rotterdam",
"state": "South Holland",
"country": "Netherlands",
"continent": "Europe",
"regions": [
"Rotterdam",
"Netherlands"
]
}
}
]
}{
"errorCode": "API_KEY_MISSING",
"message": "No API Key was presented on the header X-API-KEY"
}{
"errorCode": "OUT_OF_CREDITS",
"message": "There are no more credits available to complete the request"
}{
"errorCode": "NOT_PERMITTED",
"message": "API key present, but you are not permitted"
}{
"errorCode": "VALIDATION_ERROR",
"message": "Field required (body.name)"
}{
"errorCode": "RATE_LIMITED",
"message": "You have been rate-limited"
}{
"errorCode": "clerk_unavailable",
"message": "Key verification is temporarily unavailable"
}AI search
Search Specter with a plain-English query. Describe what you’re looking for, such as “high-growth fintech companies in Germany founded after 2022” or “VC investors focused on climate”, and the endpoint turns it into a structured search and returns the matching records.
Costs 1 credit for every 5 results returned, rounded up.
What you need
A plain-English query. Optionally set product to force which product to search;
omit it and Specter infers the best product from your query. No IDs or prior setup
are required.
Supported products and return types
All eight products are searchable, and each result is the same object that product’s
own endpoints return, so you parse it the same way. Pass a product value to get
the matching object:
product | Returns |
|---|---|
company | Company |
people | Person |
investors | Investor |
talent_signals | Talent signal |
interest_signals | Investor-interest signal |
funding_rounds | Funding round |
acquisitions | Acquisition |
ipos | IPO |
Supported filters
Any filter a product supports can be expressed in the query: geography, sector, growth stage, funding, headcount, revenue, seniority, dates, “similar to” a company, and “backed by” an investor.
User-scoped filters aren’t supported. The API runs at the organization level, not
per user, so filters like “your network,” “your CRM,” or “your saved lists” won’t
work. Requests using them return a 422 error. Remove these filters and use
standard attributes instead.
Behaviour
- The search is organization-scoped. It is not saved as a saved search, but the
response returns a
query_idthat identifies the structured filters the query resolved to (identical queries share an id). - Results are paginated like the other reads: 50 to a page, walked with
pageandlimit, and alimitabove 50 is rejected with a422rather than quietly trimmed. Paging a query returns the same result set, so a record does not move between pages as you walk them. - The bill follows the results, not the request: every 5 results returned costs 1 credit, rounded up. A full page of 50 costs 10, three results cost 1, and a query that matches nothing costs nothing.
- The number of records that matched overall is returned on the body (
total_count) and in theX-Total-Countresponse header, alongsideX-Page,X-Page-Size,X-Total-Pagesand aLinkheader. querymust be non-empty, and an unknownproductvalue is rejected with a422.
What you do next
- Get the full record. Every result carries its ID. Pass it to that product’s
by-ID endpoint: a
companyresult to Get company by ID, aninvestorsresult to Get investor by ID. - Save results to a list. Add companies with Create company list, or people with Create people list.
curl --request POST \
--url https://app.tryspecter.com/api/v1/search \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"product": "company",
"query": "high-growth fintech companies in Europe"
}
'import requests
url = "https://app.tryspecter.com/api/v1/search"
payload = {
"product": "company",
"query": "high-growth fintech companies in Europe"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({product: 'company', query: 'high-growth fintech companies in Europe'})
};
fetch('https://app.tryspecter.com/api/v1/search', 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://app.tryspecter.com/api/v1/search",
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([
'product' => 'company',
'query' => 'high-growth fintech companies in Europe'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.tryspecter.com/api/v1/search"
payload := strings.NewReader("{\n \"product\": \"company\",\n \"query\": \"high-growth fintech companies in Europe\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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://app.tryspecter.com/api/v1/search")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"product\": \"company\",\n \"query\": \"high-growth fintech companies in Europe\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryspecter.com/api/v1/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"product\": \"company\",\n \"query\": \"high-growth fintech companies in Europe\"\n}"
response = http.request(request)
puts response.read_body{
"product": "company",
"query_id": 84213,
"web_url": "https://app.tryspecter.com/companies/84213",
"total_count": 128,
"items": [
{
"id": "5e3bc2b700c8f4c966ad2bbd",
"organization_name": "Hedgehog Analytics",
"description": "Real-time supply-chain risk scoring for mid-market manufacturers.",
"founded_year": 2022,
"growth_stage": "early",
"employee_count": 48,
"website": {
"domain": "hedgehoganalytics.com",
"url": "https://hedgehoganalytics.com"
},
"funding": {
"total_funding_usd": 14500000,
"last_funding_usd": 12000000,
"last_funding_type": "Series A",
"round_count": 2
},
"hq": {
"city": "Berlin",
"state": "Berlin",
"country": "Germany",
"continent": "Europe",
"regions": [
"Berlin",
"Germany"
]
}
},
{
"id": "6a1de49c11b2f7d3aa84c012",
"organization_name": "Kestrel Freight",
"description": "Freight-forwarding automation for cross-border shippers.",
"founded_year": 2021,
"growth_stage": "seed",
"employee_count": 22,
"website": {
"domain": "kestrelfreight.com",
"url": "https://kestrelfreight.com"
},
"funding": {
"total_funding_usd": 5200000,
"last_funding_usd": 5200000,
"last_funding_type": "Seed",
"round_count": 1
},
"hq": {
"city": "Rotterdam",
"state": "South Holland",
"country": "Netherlands",
"continent": "Europe",
"regions": [
"Rotterdam",
"Netherlands"
]
}
}
]
}{
"errorCode": "API_KEY_MISSING",
"message": "No API Key was presented on the header X-API-KEY"
}{
"errorCode": "OUT_OF_CREDITS",
"message": "There are no more credits available to complete the request"
}{
"errorCode": "NOT_PERMITTED",
"message": "API key present, but you are not permitted"
}{
"errorCode": "VALIDATION_ERROR",
"message": "Field required (body.name)"
}{
"errorCode": "RATE_LIMITED",
"message": "You have been rate-limited"
}{
"errorCode": "clerk_unavailable",
"message": "Key verification is temporarily unavailable"
}Authorizations
Query Parameters
The number of results to return per page (minimum 1, maximum 50, default 50). A page is the unit these endpoints are priced in, so it cannot be widened beyond 50.
1 <= x <= 50The page number of results to return, base 0, default is 0.
x >= 0Body
A natural-language description of what to search for.
1"high-growth fintech companies in Germany founded after 2022"
The product to search for. Omit to infer it from the query.
company, people, talent_signals, interest_signals, investors, funding_rounds, acquisitions, ipos "company"
Response
The matching results. product reports the product that was actually searched: the request's product when one was provided, or the product inferred from the query otherwise. Every object in items is of the type that matches product.
The product that was searched - the requested product, or the one inferred from the query when it was omitted. Every object in items is of this type.
company, people, talent_signals, interest_signals, investors, funding_rounds, acquisitions, ipos Identifies the structured filters this natural-language query resolved to. Identical queries share an id. The search itself is not stored as a saved search.
254476
Deep-link that opens this search in the Specter web app, with the resolved filters pre-applied. Open it to refine, save, export, or push the results to a CRM.
Total number of matches across all pages (also returned as the X-Total-Count response header).
56
The current page of results. Each item's type matches product.
- CompanyV1Response
- PublicPersonResponse
- PublicTalentSignal
- InvestorSignalV1Response
- InvestorV1Response
- PublicFundingRound
- PublicAcquisition
- PublicIpo
Show child attributes
Show child attributes
Was this page helpful?