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/signals/companies/table?queryId=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": "<string>"
}{
"errorCode": "NOT_PERMITTED",
"message": "You do not have permission to access this resource."
}{
"errorCode": "<string>",
"message": "<string>"
}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/signals/companies/table?queryId=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": "<string>"
}{
"errorCode": "NOT_PERMITTED",
"message": "You do not have permission to access this resource."
}{
"errorCode": "<string>",
"message": "<string>"
}Authorizations
Query Parameters
The page number of results to return, base 0, default is 0.
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 <= 50Body
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.
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
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.
- Company
- Person
- Talent Signal
- Investor Interest Signal
- Investor
- Funding Round
- Acquisition
- IPO
Show child attributes
Show child attributes
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 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.
Was this page helpful?