curl --request POST \
--url https://api.tamtam.ai/api/v2/people/resolve \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"requests": [
{
"company_linkedin_id": "1441",
"company_name": "Acme Corp",
"custom": {},
"email": "jean.dupont@acme.com",
"firstname": "Jean",
"full_name": "Jean Dupont",
"job_title": "VP Sales",
"lastname": "Dupont"
}
]
}
'import requests
url = "https://api.tamtam.ai/api/v2/people/resolve"
payload = { "requests": [
{
"company_linkedin_id": "1441",
"company_name": "Acme Corp",
"custom": {},
"email": "jean.dupont@acme.com",
"firstname": "Jean",
"full_name": "Jean Dupont",
"job_title": "VP Sales",
"lastname": "Dupont"
}
] }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
requests: [
{
company_linkedin_id: '1441',
company_name: 'Acme Corp',
custom: {},
email: 'jean.dupont@acme.com',
firstname: 'Jean',
full_name: 'Jean Dupont',
job_title: 'VP Sales',
lastname: 'Dupont'
}
]
})
};
fetch('https://api.tamtam.ai/api/v2/people/resolve', 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.tamtam.ai/api/v2/people/resolve",
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([
'requests' => [
[
'company_linkedin_id' => '1441',
'company_name' => 'Acme Corp',
'custom' => [
],
'email' => 'jean.dupont@acme.com',
'firstname' => 'Jean',
'full_name' => 'Jean Dupont',
'job_title' => 'VP Sales',
'lastname' => 'Dupont'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$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.tamtam.ai/api/v2/people/resolve"
payload := strings.NewReader("{\n \"requests\": [\n {\n \"company_linkedin_id\": \"1441\",\n \"company_name\": \"Acme Corp\",\n \"custom\": {},\n \"email\": \"jean.dupont@acme.com\",\n \"firstname\": \"Jean\",\n \"full_name\": \"Jean Dupont\",\n \"job_title\": \"VP Sales\",\n \"lastname\": \"Dupont\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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.tamtam.ai/api/v2/people/resolve")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"requests\": [\n {\n \"company_linkedin_id\": \"1441\",\n \"company_name\": \"Acme Corp\",\n \"custom\": {},\n \"email\": \"jean.dupont@acme.com\",\n \"firstname\": \"Jean\",\n \"full_name\": \"Jean Dupont\",\n \"job_title\": \"VP Sales\",\n \"lastname\": \"Dupont\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/people/resolve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"requests\": [\n {\n \"company_linkedin_id\": \"1441\",\n \"company_name\": \"Acme Corp\",\n \"custom\": {},\n \"email\": \"jean.dupont@acme.com\",\n \"firstname\": \"Jean\",\n \"full_name\": \"Jean Dupont\",\n \"job_title\": \"VP Sales\",\n \"lastname\": \"Dupont\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"charged": true,
"company_name": "Acme Corp",
"custom": {},
"error": "insufficient_hint",
"firstname": "<string>",
"headline": "VP Sales at Acme Corp",
"lastname": "<string>",
"linkedin_slug": "jean-dupont",
"linkedin_url": "https://www.linkedin.com/in/jean-dupont",
"match_reason": "Linkup reported its top result as verified on both name and company",
"match_score": 85,
"source": "linkup"
}
]
}{
"detail": "Property foo is required but is missing.",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
],
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "https://example.com/errors/example"
}Resolve people to LinkedIn profiles
Turn what a row of your file says about a person — a name, an email, a company — into the LinkedIn profile it most likely is, with a confidence you can threshold, without extracting the profile. Up to 10 people per call, answered in order with your custom map echoed.
Each row runs the same waterfall as POST /v2/people/extract: Tamtam’s own email caches and the account’s CRM first, then Sales Navigator, Linkup, and web search with AI verification. The answer says which step found the profile (source) and what that step reported about the person — name, headline, company — so a job change can usually be read off the row without an extract.
Pricing follows the source. A cache or crm hit is free. A profile found by sales_navigator, linkup or web_search costs 1 credit, and the row says so with charged: true. Nobody found costs nothing. The one whole-batch refusal is 402, checked before anything runs, when the account could not pay for every row in the batch resolving by search.
A row with nothing to search on (no name, email or company) is answered with error: insufficient_hint; a strategy failure with error: resolution_failed. Neither stops the other rows.
curl --request POST \
--url https://api.tamtam.ai/api/v2/people/resolve \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"requests": [
{
"company_linkedin_id": "1441",
"company_name": "Acme Corp",
"custom": {},
"email": "jean.dupont@acme.com",
"firstname": "Jean",
"full_name": "Jean Dupont",
"job_title": "VP Sales",
"lastname": "Dupont"
}
]
}
'import requests
url = "https://api.tamtam.ai/api/v2/people/resolve"
payload = { "requests": [
{
"company_linkedin_id": "1441",
"company_name": "Acme Corp",
"custom": {},
"email": "jean.dupont@acme.com",
"firstname": "Jean",
"full_name": "Jean Dupont",
"job_title": "VP Sales",
"lastname": "Dupont"
}
] }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
requests: [
{
company_linkedin_id: '1441',
company_name: 'Acme Corp',
custom: {},
email: 'jean.dupont@acme.com',
firstname: 'Jean',
full_name: 'Jean Dupont',
job_title: 'VP Sales',
lastname: 'Dupont'
}
]
})
};
fetch('https://api.tamtam.ai/api/v2/people/resolve', 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.tamtam.ai/api/v2/people/resolve",
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([
'requests' => [
[
'company_linkedin_id' => '1441',
'company_name' => 'Acme Corp',
'custom' => [
],
'email' => 'jean.dupont@acme.com',
'firstname' => 'Jean',
'full_name' => 'Jean Dupont',
'job_title' => 'VP Sales',
'lastname' => 'Dupont'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$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.tamtam.ai/api/v2/people/resolve"
payload := strings.NewReader("{\n \"requests\": [\n {\n \"company_linkedin_id\": \"1441\",\n \"company_name\": \"Acme Corp\",\n \"custom\": {},\n \"email\": \"jean.dupont@acme.com\",\n \"firstname\": \"Jean\",\n \"full_name\": \"Jean Dupont\",\n \"job_title\": \"VP Sales\",\n \"lastname\": \"Dupont\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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.tamtam.ai/api/v2/people/resolve")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"requests\": [\n {\n \"company_linkedin_id\": \"1441\",\n \"company_name\": \"Acme Corp\",\n \"custom\": {},\n \"email\": \"jean.dupont@acme.com\",\n \"firstname\": \"Jean\",\n \"full_name\": \"Jean Dupont\",\n \"job_title\": \"VP Sales\",\n \"lastname\": \"Dupont\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tamtam.ai/api/v2/people/resolve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"requests\": [\n {\n \"company_linkedin_id\": \"1441\",\n \"company_name\": \"Acme Corp\",\n \"custom\": {},\n \"email\": \"jean.dupont@acme.com\",\n \"firstname\": \"Jean\",\n \"full_name\": \"Jean Dupont\",\n \"job_title\": \"VP Sales\",\n \"lastname\": \"Dupont\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"charged": true,
"company_name": "Acme Corp",
"custom": {},
"error": "insufficient_hint",
"firstname": "<string>",
"headline": "VP Sales at Acme Corp",
"lastname": "<string>",
"linkedin_slug": "jean-dupont",
"linkedin_url": "https://www.linkedin.com/in/jean-dupont",
"match_reason": "Linkup reported its top result as verified on both name and company",
"match_score": 85,
"source": "linkup"
}
]
}{
"detail": "Property foo is required but is missing.",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
],
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "https://example.com/errors/example"
}Authorizations
Account API key passed in the Authorization header
Body
People to resolve, at most 10 per call.
1 - 10 elementsShow child attributes
Show child attributes
Response
OK
One entry per request row, in the same order.
Show child attributes
Show child attributes