PeopleSearch.im Search API
The Search API from PeopleSearch.im — 1 operation(s) for search.
The Search API from PeopleSearch.im — 1 operation(s) for search.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/peoplesearch-im:peoplesearch-im-search-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: PeopleSearch.im Search API
version: 1.0.0
description: 'The same people-search backend as PeopleSearch.im, over HTTP. Search a global professional database in plain English, reveal full profiles, and fetch verified professional emails. Pay-as-you-go: 1 credit per profile, credits refunded when a lookup finds nothing. The same tools are also available to AI agents as a Model Context Protocol (MCP) server at https://peoplesearch.im/api/mcp.'
termsOfService: https://peoplesearch.im/legal/terms
servers:
- url: https://peoplesearch.im
security:
- bearerAuth: []
- apiKeyHeader: []
tags:
- name: Search
paths:
/api/v1/search:
post:
operationId: searchPeople
summary: Search people (free)
description: 'Find people by exact `filters` (job titles, companies, locations, industries, schools, skills and more) or by a plain-English `query`, and get masked previews plus the true total. One of the two is required; with `filters` the query is only a label. Free; spends no credits. This is the one operation that also works with no API key, for trying the API: up to 3 results per search and 10 searches a day per IP address, within a daily limit that all callers without a key share (the response then carries `keyless`), and no paging. A key that is sent and not accepted is still a 401.'
security:
- {}
- bearerAuth: []
- apiKeyHeader: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
query:
type: string
example: Heads of Marketing at Series B SaaS in New York
filters:
$ref: '#/components/schemas/PeopleFilters'
limit:
type: integer
minimum: 1
maximum: 25
default: 10
page:
type: string
description: Next-page token from a prior response.
drop:
type: array
items:
type: string
description: Interpreted filter fields to remove and broaden the search.
responses:
'200':
description: Masked previews and the true total.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
total:
type: integer
results:
type: array
items:
type: object
properties:
key:
type: string
description: Opaque id for this person, stable across searches. Not their LinkedIn URL or name.
token:
type: string
description: Pass to /api/v1/reveal to unlock this person.
maskedName:
type: string
title:
type: string
industry:
type: string
nullable: true
companySize:
type: integer
nullable: true
location:
type: string
nullable: true
token:
type: string
nullable: true
description: Next-page token.
balance:
type: integer
nullable: true
relaxed:
type: array
items:
type: string
description: Filter fields dropped automatically because the query had no exact matches, least essential first. Empty when the query matched as written.
broadened:
type: object
nullable: true
description: 'Present when nobody held the job title as asked and a broader reading of it found people: `from` is the title as asked, `to` as searched (for example Consumer Investigative Reporter -> Investigative Reporter). Tried before any filter is dropped.'
properties:
from:
type: array
items:
type: string
to:
type: array
items:
type: string
suggestEntity:
type: string
enum:
- company
description: 'Present when the words asked for companies rather than people ("software companies in Berlin"): the results are people at such companies; search companies for the companies themselves.'
ignored:
type: array
items:
type: string
description: Parts of `filters` that could not be applied (an unknown industry name, an unknown field), in plain words. Absent when everything applied.
keyless:
type: object
description: 'Present only when the search was made with no API key: what such a search includes and how many are left today.'
properties:
remaining:
type: integer
description: Keyless searches left today for this caller.
perDay:
type: integer
note:
type: string
'401':
description: The API key that was sent is not valid.
'429':
description: 'No API key was sent and no free keyless search is available right now (`keyless_limit`): this caller has used its searches for today, or the daily limit all keyless callers share is reached. Create a free key to keep searching.'
tags:
- Search
components:
schemas:
PeopleFilters:
type: object
description: 'Exact filters, recommended for AI agents and programs: state each part of the request instead of a sentence. Values inside one list are alternatives (OR); different fields must all match (AND). Give a few variants where people word things differently (titles: ["M&A Associate", "Investment Banking Associate"]). When filters are given, `query` is only a label and is not parsed.'
properties:
first_name:
type: array
items:
type: string
description: 'To find one named person: their first name, with the variants they may use, e.g. ["Timothy", "Tim"]. Use with last_name, and add companies or company_domains when known ("Anqi Dai at Memorial Sloan Kettering" finds the one person).'
last_name:
type: array
items:
type: string
description: 'To find one named person: their last name, e.g. ["Dai"]. If the name with the employer finds nobody, the search tries the last name at the employer, then the full name anywhere.'
job_titles:
type: array
items:
type: string
description: 'Current job titles, matched as case-insensitive substrings ("Account Executive" also finds "Senior Account Executive"). Include the variants people use: ["VP Sales", "Vice President of Sales", "Head of Sales"].'
exclude_job_titles:
type: array
items:
type: string
description: Titles to leave out, e.g. ["Intern", "Recruiter"].
past_job_titles:
type: array
items:
type: string
description: Titles the person held before their current job.
companies:
type: array
items:
type: string
description: Current employers by name, e.g. ["Stripe"].
company_domains:
type: array
items:
type: string
description: Current employers by website domain, the most exact way to name a company, e.g. ["stripe.com"].
past_companies:
type: array
items:
type: string
description: Former employers by name, e.g. ["McKinsey"] for ex-McKinsey people.
locations:
type: array
items:
type: string
description: 'Where the person lives or works: cities, states, countries or regions, e.g. ["Frankfurt", "Munich"], ["Germany"], ["DACH"], ["Texas"]. Use "City, Country" to tell same-named places apart ("Paris, France"). Country names are safest; ISO codes are converted.'
industries:
type: array
items:
type: string
description: Industry of the current employer, as LinkedIn names it, e.g. ["Investment Banking"], ["Software Development"], ["Hospitals and Health Care"], ["Venture Capital and Private Equity Principals"], ["Staffing and Recruiting"]. Common older names are mapped; a name that is not an industry is reported in `ignored` and not applied.
schools:
type: array
items:
type: string
description: Schools the person attended, matched as substrings; add the local-language name too, e.g. ["University of Mannheim", "Universität Mannheim"].
skills:
type: array
items:
type: string
description: Skills listed on the profile, e.g. ["Python", "Kubernetes"].
languages:
type: array
items:
type: string
description: Languages the person speaks, e.g. ["German"] or ["DE"].
keywords:
type: array
items:
type: string
description: Words to find anywhere on the profile (headline, descriptions, past roles), for what no other field covers.
company_keywords:
type: array
items:
type: string
description: Words the current employer's own description should contain, for a KIND of employer no industry names exactly, e.g. ["hostel"], ["coffee"] (founders of coffee roasteries), ["SEO"] (with industries ["Marketing Services"] for SEO agencies), ["community college"].
company_size_min:
type: integer
minimum: 1
description: Minimum employees at the current employer.
company_size_max:
type: integer
minimum: 1
description: Maximum employees at the current employer.
years_experience_min:
type: integer
minimum: 0
description: Minimum total years of professional experience.
years_experience_max:
type: integer
minimum: 0
description: Maximum total years of professional experience.
additionalProperties: false
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: sk_sift_…
description: A PeopleSearch.im API key, created at /developers.
apiKeyHeader:
type: apiKey
in: header
name: X-API-Key
description: The same PeopleSearch.im API key (sk_sift_…), sent as a header.
x-mcp:
endpoint: https://peoplesearch.im/api/mcp
transport: streamable-http
description: Remote MCP server exposing the same operations as agent tools. Authenticate with OAuth 2.1 (the MCP authorization spec; the server's 401 points at its protected resource metadata) or with the same API key as this REST API (Bearer token or X-API-Key header).
authorization:
protectedResourceMetadata: https://peoplesearch.im/.well-known/oauth-protected-resource/api/mcp
authorizationServerMetadata: https://peoplesearch.im/.well-known/oauth-authorization-server
tools:
- name: people_search
title: Search people
credits: 0
- name: reveal_profile
title: Reveal a person
credits: 1
- name: find_people
title: Find & unlock a batch of people
credits: 1
- name: fetch_email
title: Fetch a verified work email
credits: 1
- name: find_work_email
title: Find a person's work email
credits: 2
- name: verify_email
title: Verify an email address
credits: 1
- name: find_company_emails
title: Find a company's emails
credits: 2
- name: reverse_email_lookup
title: Reverse email lookup
credits: 13
- name: find_linkedin_profile
title: Find a LinkedIn profile
credits: 2
- name: lookup_linkedin_profile
title: Look up a LinkedIn profile
credits: 2
- name: lookup_company
title: Look up a company
credits: 1
- name: company_search
title: Search companies
credits: 0
- name: check_credits
title: Check credit balance
credits: 0