curl --request POST \
--url https://app.tryspecter.com/api/v1/people/by-id/bulk \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
[
{
"linkedin_url": "https://www.linkedin.com/in/patrickcollison"
},
{
"linkedin_url": "https://www.linkedin.com/in/dhorowitz"
}
]
'import requests
url = "https://app.tryspecter.com/api/v1/people/by-id/bulk"
payload = [{ "linkedin_url": "https://www.linkedin.com/in/patrickcollison" }, { "linkedin_url": "https://www.linkedin.com/in/dhorowitz" }]
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([
{linkedin_url: 'https://www.linkedin.com/in/patrickcollison'},
{linkedin_url: 'https://www.linkedin.com/in/dhorowitz'}
])
};
fetch('https://app.tryspecter.com/api/v1/people/by-id/bulk', 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/people/by-id/bulk",
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([
[
'linkedin_url' => 'https://www.linkedin.com/in/patrickcollison'
],
[
'linkedin_url' => 'https://www.linkedin.com/in/dhorowitz'
]
]),
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/people/by-id/bulk"
payload := strings.NewReader("[\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/patrickcollison\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/dhorowitz\"\n }\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/people/by-id/bulk")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/patrickcollison\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/dhorowitz\"\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryspecter.com/api/v1/people/by-id/bulk")
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 {\n \"linkedin_url\": \"https://www.linkedin.com/in/patrickcollison\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/dhorowitz\"\n }\n]"
response = http.request(request)
puts response.read_body[
{
"status": "found",
"person": {
"person_id": "per_7f8d9e2a1b3c4d5e6f7g8h9i0",
"full_name": "Sarah Chen",
"linkedin_url": "https://www.linkedin.com/in/sarahchen9776"
}
},
{
"status": "queued",
"enrichment": {
"message": "Enrichment in progress"
}
}
]{
"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>"
}Enrich people (bulk)
Enrich up to 50 people in one request — the bulk counterpart to Enrich person. Each lookup object carries one LinkedIn identifier you already hold (URL, vanity ID, numeric ID, or URN) and comes back as a full person record. No Specter ID is involved: use Get person by ID when you already have one.
queued rows aren’t charged. What you need
A JSON array of 1–50 lookup objects, each identifying one person by LinkedIn URL, vanity ID, numeric ID, or URN.
Behaviour
- Provide exactly one identifier per lookup object.
- Results are returned in input order, so each row maps back to its lookup.
- Each row carries a
status:found(resolved, with thepersonpayload) orqueued(not found; an enrichment was started, poll later).
What you do next
- Reach out. The profile doesn’t include a contactable address; get one with Get person email.
curl --request POST \
--url https://app.tryspecter.com/api/v1/people/by-id/bulk \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
[
{
"linkedin_url": "https://www.linkedin.com/in/patrickcollison"
},
{
"linkedin_url": "https://www.linkedin.com/in/dhorowitz"
}
]
'import requests
url = "https://app.tryspecter.com/api/v1/people/by-id/bulk"
payload = [{ "linkedin_url": "https://www.linkedin.com/in/patrickcollison" }, { "linkedin_url": "https://www.linkedin.com/in/dhorowitz" }]
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([
{linkedin_url: 'https://www.linkedin.com/in/patrickcollison'},
{linkedin_url: 'https://www.linkedin.com/in/dhorowitz'}
])
};
fetch('https://app.tryspecter.com/api/v1/people/by-id/bulk', 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/people/by-id/bulk",
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([
[
'linkedin_url' => 'https://www.linkedin.com/in/patrickcollison'
],
[
'linkedin_url' => 'https://www.linkedin.com/in/dhorowitz'
]
]),
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/people/by-id/bulk"
payload := strings.NewReader("[\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/patrickcollison\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/dhorowitz\"\n }\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/people/by-id/bulk")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/patrickcollison\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/dhorowitz\"\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryspecter.com/api/v1/people/by-id/bulk")
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 {\n \"linkedin_url\": \"https://www.linkedin.com/in/patrickcollison\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/in/dhorowitz\"\n }\n]"
response = http.request(request)
puts response.read_body[
{
"status": "found",
"person": {
"person_id": "per_7f8d9e2a1b3c4d5e6f7g8h9i0",
"full_name": "Sarah Chen",
"linkedin_url": "https://www.linkedin.com/in/sarahchen9776"
}
},
{
"status": "queued",
"enrichment": {
"message": "Enrichment in progress"
}
}
]{
"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
Body
1 - 50 elementsThe person's LinkedIn profile URL. Accepts http/https, with or without www.
"https://www.linkedin.com/in/janedoe"
The person's LinkedIn vanity ID, the slug at the end of their profile URL (e.g. john-doe-123abc in linkedin.com/in/john-doe-123abc).
"janedoe"
The person's LinkedIn numeric member ID.
123456789
The person's LinkedIn URN, a stable, non-changing reference found in many datasets.
"ACoAAAxxxxxxxx"
Response
One row per lookup, in input order. found rows carry the resolved person; queued rows carry the enrichment request context.
found when resolved, queued when an async enrichment was started for an unknown person.
found, queued The resolved person. Present when status is found.
Show child attributes
Show child attributes
Enrichment request context. Present when status is queued.
Show child attributes
Show child attributes
Was this page helpful?