search_people 10 credits
Find people on LinkedIn by keywords and filters. The right tool when you have a name, role, or 'who is the X at Y' question without a profile URL. Pass keywords (free text: name, title, or both) and any of first_name, last_name, title, school, current_company, past_company. Company filters accept a company name, slug, numeric id, or URN; names are resolved for you. Costs 10 credits including the first 10 results; each further 10 results add 1 credit (limit max 30; trial keys max 10). A cursor page is a NEW call priced the same way by its own limit, so one limit=30 call is much cheaper than three limit=10 pages; prefer a larger limit over paginating. Do NOT combine a company NAME filter with limit=30: name resolution spends one of the call's three internal fetches, so that combination is rejected. With a company name keep limit<=20; for limit=30 pass the company's numeric id or URN (get_company returns both). Returns name, position, location, urn, public_identifier per result, a cursor for the next page, and total_matches. Results with is_anonymous=true are private profiles; do not pass them to get_profile. For one known person with a URL/slug, call get_profile directly instead.
Parameters
| Param | Required | Type | Description |
|---|---|---|---|
keywords | no | string | Free-text query: a name, a title, or both. |
first_name | no | string | |
last_name | no | string | |
title | no | string | Current job title filter. |
school | no | string | |
current_company | no | string | Company name, slug, numeric id, or urn:li:fsd_company URN. |
past_company | no | string | Same accepted forms as current_company. |
limit | no | integer | How many results to return. |
cursor | no | string | Cursor from a previous page. |
freshness | no | string | recent (default) serves cached data from the last few hours when available; realtime forces a live fetch for +2 credits (refunded if we fall back to cached data). |
max_credits | no | integer | Spend ceiling for this one call. The call is rejected (nothing charged) if its quote exceeds this. Only the quote is ever reserved, never this ceiling. |
REST
GET /v1/people · auth: required · metered: true
curl "https://api.veezee.io/v1/people?keywords=CTO¤t_company=anthropic" \
-H "Authorization: Bearer $VEEZEE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
MCP
{
"method": "tools/call",
"params": {
"name": "search_people",
"arguments": {
"keywords": "CTO",
"current_company": "anthropic"
}
}
}
Input examples
Role at a company
{
"keywords": "CTO",
"current_company": "anthropic"
}
Name search, more results
{
"keywords": "John Smith",
"title": "software engineer",
"limit": 30
}
Next page
{
"keywords": "CTO",
"current_company": "anthropic",
"cursor": "<cursor from previous response>"
}
Output
Returns a people_search envelope. Full field list: /docs/fields#people_search.
Errors
REST returns application/problem+json; MCP returns the same content as an error result. message is written as the next-turn instruction.
| Code | HTTP status | Retriable | Meaning |
|---|---|---|---|
INVALID_INPUT | 400 | no | A parameter failed validation. Check param and message for what to fix. |
NOT_FOUND | 404 | no | Nothing matches the given identifier or URL. |
UNAUTHORIZED | 401 | no | Missing, invalid, or revoked API key. |
PROVISION_REQUIRED | 401 | no | No key was sent and none is on file. Call provision first. |
INSUFFICIENT_CREDITS | 402 | no | Your balance can't cover this call's quote. Check get_usage or add credits. |
QUOTE_EXCEEDS_MAX_CREDITS | 402 | no | The call's quote is higher than the max_credits you set. Nothing was charged. |
IDEMPOTENCY_KEY_REQUIRED | 400 | no | This is a metered call; send an Idempotency-Key header. |
IDEMPOTENCY_KEY_REUSED | 409 | no | That Idempotency-Key was already used with different arguments. Use a new key for a new call. |
CONCURRENCY_LIMIT | 429 | yes | Too many calls in flight for this key's plan. Wait for one to finish. |
RATE_LIMITED | 429 | yes | Too many calls per minute for this key's plan. Back off and retry. |
TRIAL_CAP_EXCEEDED | 403 | no | A trial-only limit was hit (concurrency, rate, search size, or realtime fetches). |
BUDGET_EXHAUSTED | 503 | no | A configured spend budget has been used up. |
UPSTREAM_UNAVAILABLE | 502 | yes | LinkedIn data wasn't reachable. Safe to retry. |
PAYLOAD_TOO_LARGE | 413 | no | The request or response exceeded the size limit. |
ORIGIN_FORBIDDEN | 403 | no | This request's origin isn't allowed to call the API. |
INTERNAL | 500 | yes | Something failed on our side. Safe to retry. |