Search people (standard)
People search on LinkedIn's regular search, not Sales Navigator.
https://api.up2data.ai/v1/search/people/standardPass structured filters; at least one is required. Filters combine with AND, and several values inside one filter match any of them. Company, past company, industry, geo, and school filters take LinkedIn IDs; company_urls and locations take URLs and place names and are resolved to IDs for you. Seniority is matched on job titles (for example vp matches VP, Vice President, and SVP). A single call returns at most 100 results (pagination.has_more is true when more exist). Empty pages are free.
An Up2Data extension, not part of the up2data-compatible surface. Results carry the headline, vanity URL, and member URN that regular search shows. function_ids, company_sizes, past_titles, the years_* filters, posted_on_linkedin, and recently_changed_jobs have no equivalent in regular LinkedIn search and answer 400 here; use Search people for those.
Counts as 1 request against the 300/min per-key limit and 1 search against the 20/hour per-organization search quota. See Rate limits.
Send many as batch operation items (operation search.people.standard); up to 2,500 results per item, 1 credit per 25-row page. See the batch endpoint.
#Request
| Field | Type | Notes |
|---|---|---|
filtersrequired | object | At least one filter. |
filters.keywords | string | Free text matched anywhere on the profile. |
filters.titles | string[] | Matched against current titles. |
filters.seniorities | string[] | Enum per item: owner, partner, cxo, vp, director, manager, senior, entry. titles and seniorities together allow at most 6 values. |
filters.company_ids | FacetId[] | Current company. Bare id string, or { id, text }. |
filters.company_urls | string[] | Current company by page URL or slug. An unknown company answers 400. |
filters.past_company_ids | FacetId[] | |
filters.industry_ids | FacetId[] | |
filters.location_ids | FacetId[] | LinkedIn geo ids. |
filters.locations | string[] | Place names, e.g. United States or London. An unknown place answers 400. |
filters.school_ids | FacetId[] | |
filters.first_name | string | |
filters.last_name | string | |
max_results | integer | Default 25. 1 to 2,500; a sync call returns at most 100 results. |
#Call it
curl -X POST "https://api.up2data.ai/v1/search/people/standard" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"filters": {
"titles": [
"CTO"
],
"keywords": "kubernetes",
"locations": [
"United States"
]
},
"max_results": 25
}'import requests
url = "https://api.up2data.ai/v1/search/people/standard"
headers = {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
}
payload = {
"filters": {
"titles": [
"CTO"
],
"keywords": "kubernetes",
"locations": [
"United States"
]
},
"max_results": 25
}
response = requests.post(url, headers=headers, json=payload)
print(response.json())const url = "https://api.up2data.ai/v1/search/people/standard";
const headers = {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
};
const body = {
"filters": {
"titles": [
"CTO"
],
"keywords": "kubernetes",
"locations": [
"United States"
]
},
"max_results": 25
};
const response = await fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
});
const data = await response.json();
console.log(data);package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.up2data.ai/v1/search/people/standard"
body := bytes.NewBufferString(`{
"filters": {
"titles": [
"CTO"
],
"keywords": "kubernetes",
"locations": [
"United States"
]
},
"max_results": 25
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
panic(err)
}
req.Header.Set("X-API-Key", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}#Response
{
"data": {
"results": [{
"url": "https://www.linkedin.com/in/thmeyer",
"public_identifier": "thmeyer",
"linkedin_id": "16113090",
"urn": "ACoAAAD13cIBbJUHDIuBAw-cS8NSsTdXj2fAYtc",
"full_name": "Thomas Meyer",
"headline": "CTO / Software Architect at Inalp",
"profile_picture_url": "https://media.licdn.com/dms/image/v2/D4E03AQExample/profile-displayphoto-shrink_100_100/0/thmeyer",
"location": { "city": "Greater Bern Area" },
"scraped_at": "2026-09-25T21:52:56.000Z"
}],
"pagination": { "returned": 25, "max_results": 25, "pages_scraped": 1, "has_more": true }
},
"meta": { "creditsUsed": 1, "creditsRemaining": 98418, "billed": true, "reason": "success", "requestId": "req_example", "latencyMs": 4100 }
}#Errors
| Status | Type | When | Billed |
|---|---|---|---|
| 400 | invalid_request | Missing or empty filters, unknown or unsupported filter, bad seniority value, more than 6 titles and seniorities combined, or a location or company that matches nothing. | No |
| 401 | invalid_api_key | Missing, malformed, or revoked key. | No |
| 402 | insufficient_credits | Balance can't cover the page(s) requested. | No |
| 429 | rate_limited | Over the 300 requests/min limit, or the 20 searches/hour per-organization quota. Honor Retry-After. | No |
| 500 | upstream_error | LinkedIn rejected the search query, or something broke on the server side. | No |
| 504 | upstream_timeout | The live scrape didn't complete in time. | No |
See the Errors guide for every error type this version can return.