Single work email lookup
curl --request POST \
--url https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/ \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"first_name": "",
"last_name": "",
"domain": "",
"linkedin_public_identifier": "",
"webhook_url": ""
}
'import requests
url = "https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/"
payload = {
"first_name": "",
"last_name": "",
"domain": "",
"linkedin_public_identifier": "",
"webhook_url": ""
}
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({
first_name: '',
last_name: '',
domain: '',
linkedin_public_identifier: '',
webhook_url: ''
})
};
fetch('https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
first_name: '',
last_name: '',
domain: '',
linkedin_public_identifier: '',
webhook_url: ''
})
};
fetch('https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/"
payload := strings.NewReader("{\n \"first_name\": \"\",\n \"last_name\": \"\",\n \"domain\": \"\",\n \"linkedin_public_identifier\": \"\",\n \"webhook_url\": \"\"\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))
}require 'uri'
require 'net/http'
url = URI("https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/")
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 \"first_name\": \"\",\n \"last_name\": \"\",\n \"domain\": \"\",\n \"linkedin_public_identifier\": \"\",\n \"webhook_url\": \"\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/",
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([
'first_name' => '',
'last_name' => '',
'domain' => '',
'linkedin_public_identifier' => '',
'webhook_url' => ''
]),
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;
}HttpResponse<String> response = Unirest.post("https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"first_name\": \"\",\n \"last_name\": \"\",\n \"domain\": \"\",\n \"linkedin_public_identifier\": \"\",\n \"webhook_url\": \"\"\n}")
.asString();{
"job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"status_check_url": "<string>",
"webhook_url": "<string>"
}{
"detail": "Authentication credentials were not provided."
}Work email finder API
Start an asynchronous work email lookup and get back a job id immediately.
POST
https://api-v2.forager.ai
/
api
/
v2
/
{account_id}
/
datastorage
/
person_contacts_lookup
/
work_emails
/
Single work email lookup
curl --request POST \
--url https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/ \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"first_name": "",
"last_name": "",
"domain": "",
"linkedin_public_identifier": "",
"webhook_url": ""
}
'import requests
url = "https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/"
payload = {
"first_name": "",
"last_name": "",
"domain": "",
"linkedin_public_identifier": "",
"webhook_url": ""
}
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({
first_name: '',
last_name: '',
domain: '',
linkedin_public_identifier: '',
webhook_url: ''
})
};
fetch('https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
first_name: '',
last_name: '',
domain: '',
linkedin_public_identifier: '',
webhook_url: ''
})
};
fetch('https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/"
payload := strings.NewReader("{\n \"first_name\": \"\",\n \"last_name\": \"\",\n \"domain\": \"\",\n \"linkedin_public_identifier\": \"\",\n \"webhook_url\": \"\"\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))
}require 'uri'
require 'net/http'
url = URI("https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/")
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 \"first_name\": \"\",\n \"last_name\": \"\",\n \"domain\": \"\",\n \"linkedin_public_identifier\": \"\",\n \"webhook_url\": \"\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/",
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([
'first_name' => '',
'last_name' => '',
'domain' => '',
'linkedin_public_identifier' => '',
'webhook_url' => ''
]),
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;
}HttpResponse<String> response = Unirest.post("https://api-v2.forager.ai/api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"first_name\": \"\",\n \"last_name\": \"\",\n \"domain\": \"\",\n \"linkedin_public_identifier\": \"\",\n \"webhook_url\": \"\"\n}")
.asString();{
"job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"status_check_url": "<string>",
"webhook_url": "<string>"
}{
"detail": "Authentication credentials were not provided."
}When to use this endpoint
You need one person’s verified work email and can identify them by name and company domain, or by LinkedIn public identifier. The lookup is asynchronous: this call answers202 with a job_id to poll. For more than a handful of people use the bulk lookup.
Example request
cURL
curl -X POST "https://api-v2.forager.ai/api/v2/$FORAGER_ACCOUNT_ID/datastorage/person_contacts_lookup/work_emails/" \
-H "X-API-KEY: $FORAGER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"last_name": "Doe",
"domain": "acme.com"
}'
FORAGER_API_KEY and FORAGER_ACCOUNT_ID as in the quickstart.
Example response
202 (illustrative values)
{
"job_id": "2b7e1a40-3c5d-4f6e-8a9b-0c1d2e3f4a5b",
"status": "queued",
"status_check_url": "https://api-v2.forager.ai/api/v2/123456/datastorage/person_contacts_lookup/work_emails/2b7e1a40-3c5d-4f6e-8a9b-0c1d2e3f4a5b/",
"webhook_url": ""
}
Credits
A lookup costs 5 credits, charged only when an address is found. Polling for the result is free. See API credits and pricing for how credits are charged and how to check what you spent.Authorizations
Path Parameters
Body
application/jsonapplication/x-www-form-urlencodedmultipart/form-data
The single-submit body: one lookup, plus an optional result webhook.
Kept apart from the bulk child WorkEmailLookupRequestSerializer so
webhook_url sits beside the lookup on a single submit but never appears on
each row of a bulk request, where the target is batch-scoped instead.
Company domain, e.g. "acme.com". A full URL is accepted and reduced to its domain.
LinkedIn person "Public identifier/Slug" - "linkedin.com/in/!slug!/".
Optional https URL we POST the results to when the batch completes, so you need not poll. Put any secret used to authenticate the callback in the URL query string; it is never returned by the poll endpoints or written to logs. Omit to poll only.
Maximum string length:
2048Last modified on November 1, 2026