Lookup Companies
Resolve companies to their canonical OpenFunnel record(s) by any subset of name / domain / linkedin_url. Batch up to 100 per call. No credits are charged.
X-API-Key - the only required header for this endpoint.Each item may carry any combination of identifiers:
- domain → exact match on any of the company’s domains. Returns all matching records.
- linkedin_url → exact match on the company’s LinkedIn slug (parsed from the URL).
- name → fuzzy match; returns up to 10 ranked candidates with a relevance
score.
If an item includes a domain or linkedin_url, it is resolved by that exact identifier and the name is ignored - the fuzzy name path runs only when name is the sole identifier. Matches are deduped by company_id (precedence: linkedin > domain > name). A returned company_id can be passed straight back into Search Lookalikes as a seed. Unknown inputs return status: "not_found" with an empty matches array.
curl -sS -X POST "https://api.openfunnel.dev/api/v1/account/lookup-companies" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"companies": [{"domain": "stripe.com"}, {"linkedin_url": "https://www.linkedin.com/company/adyen"}, {"name": "Plaid"}]}'import requests
url = "https://api.openfunnel.dev/api/v1/account/lookup-companies"
payload = { "companies": [
{
"name": "<string>",
"domain": "<string>",
"linkedin_url": "<string>"
}
] }
headers = {
"X-API-Key": "<x-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': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({companies: [{name: '<string>', domain: '<string>', linkedin_url: '<string>'}]})
};
fetch('https://api.openfunnel.dev/api/v1/account/lookup-companies', 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.openfunnel.dev/api/v1/account/lookup-companies",
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([
'companies' => [
[
'name' => '<string>',
'domain' => '<string>',
'linkedin_url' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <x-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://api.openfunnel.dev/api/v1/account/lookup-companies"
payload := strings.NewReader("{\n \"companies\": [\n {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"linkedin_url\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<x-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.openfunnel.dev/api/v1/account/lookup-companies")
.header("X-API-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companies\": [\n {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"linkedin_url\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openfunnel.dev/api/v1/account/lookup-companies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companies\": [\n {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"linkedin_url\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"input": {
"name": null,
"domain": "stripe.com",
"linkedin_url": null
},
"status": "resolved",
"matches": [
{
"company_id": "ww_39dde6f3035d07e7e55e882f05ec6d7e",
"name": "Stripe",
"domain": "stripe.com",
"linkedin_url": "https://www.linkedin.com/company/stripe",
"linkedin_slug": "stripe",
"employee_count_min": 5000,
"employee_count_max": 10000,
"stage": "private_equity",
"industries": "Financial Services, FinTech",
"location_city": "San Francisco",
"location_country": "United States",
"location_country_code": "us",
"matched_on": "domain",
"score": null
}
]
},
{
"input": {
"name": "Plaid",
"domain": null,
"linkedin_url": null
},
"status": "resolved",
"matches": [
{
"company_id": "ww_55c8eee3a23eab95f8cc650641deea75",
"name": "Plaid",
"domain": "plaid.com",
"linkedin_url": "https://www.linkedin.com/company/plaid",
"linkedin_slug": "plaid",
"employee_count_min": 1200,
"employee_count_max": 1200,
"stage": "series_unknown",
"industries": "Finance, Banking, FinTech",
"location_city": "San Francisco",
"location_country": "United States",
"location_country_code": "us",
"matched_on": "name",
"score": 0.97
}
]
},
{
"input": {
"name": null,
"domain": "this-domain-does-not-exist-xyz.com",
"linkedin_url": null
},
"status": "not_found",
"matches": []
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Headers
Body
Batch company lookup: resolve up to 100 companies by identifier.
1-100 companies to resolve.
1 - 100 elementsShow child attributes
Show child attributes
Response
One result per input company, in request order.
Response for the batch company lookup endpoint (one result per input, in request order).
Show child attributes
Show child attributes
curl -sS -X POST "https://api.openfunnel.dev/api/v1/account/lookup-companies" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"companies": [{"domain": "stripe.com"}, {"linkedin_url": "https://www.linkedin.com/company/adyen"}, {"name": "Plaid"}]}'import requests
url = "https://api.openfunnel.dev/api/v1/account/lookup-companies"
payload = { "companies": [
{
"name": "<string>",
"domain": "<string>",
"linkedin_url": "<string>"
}
] }
headers = {
"X-API-Key": "<x-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': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({companies: [{name: '<string>', domain: '<string>', linkedin_url: '<string>'}]})
};
fetch('https://api.openfunnel.dev/api/v1/account/lookup-companies', 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.openfunnel.dev/api/v1/account/lookup-companies",
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([
'companies' => [
[
'name' => '<string>',
'domain' => '<string>',
'linkedin_url' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <x-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://api.openfunnel.dev/api/v1/account/lookup-companies"
payload := strings.NewReader("{\n \"companies\": [\n {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"linkedin_url\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<x-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.openfunnel.dev/api/v1/account/lookup-companies")
.header("X-API-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companies\": [\n {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"linkedin_url\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openfunnel.dev/api/v1/account/lookup-companies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companies\": [\n {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"linkedin_url\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"input": {
"name": null,
"domain": "stripe.com",
"linkedin_url": null
},
"status": "resolved",
"matches": [
{
"company_id": "ww_39dde6f3035d07e7e55e882f05ec6d7e",
"name": "Stripe",
"domain": "stripe.com",
"linkedin_url": "https://www.linkedin.com/company/stripe",
"linkedin_slug": "stripe",
"employee_count_min": 5000,
"employee_count_max": 10000,
"stage": "private_equity",
"industries": "Financial Services, FinTech",
"location_city": "San Francisco",
"location_country": "United States",
"location_country_code": "us",
"matched_on": "domain",
"score": null
}
]
},
{
"input": {
"name": "Plaid",
"domain": null,
"linkedin_url": null
},
"status": "resolved",
"matches": [
{
"company_id": "ww_55c8eee3a23eab95f8cc650641deea75",
"name": "Plaid",
"domain": "plaid.com",
"linkedin_url": "https://www.linkedin.com/company/plaid",
"linkedin_slug": "plaid",
"employee_count_min": 1200,
"employee_count_max": 1200,
"stage": "series_unknown",
"industries": "Finance, Banking, FinTech",
"location_city": "San Francisco",
"location_country": "United States",
"location_country_code": "us",
"matched_on": "name",
"score": 0.97
}
]
},
{
"input": {
"name": null,
"domain": "this-domain-does-not-exist-xyz.com",
"linkedin_url": null
},
"status": "not_found",
"matches": []
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}