# People Search API - Work Email, Mobile and Company Data (`nabeelbaghoor/people-contact-data-api`) Actor

Search a people and company index by role, skills, employer, industry, headcount, revenue, funding and detected web technologies, then pull work emails, personal emails and phone numbers for the people worth reaching. Also job post search and reverse lookup. Pay per result.

- **URL**: https://apify.com/nabeelbaghoor/people-contact-data-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Business, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$12.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## People Search API - Work Email, Mobile and Company Data

Find the people worth reaching, then find how to reach them. Search by what someone does, who they do it for and what that company runs, and pull contact details only for the rows you keep. One flat row per record.

### What this actor does

- **Searches roles, not just people.** A person and an employer are one record here, which means you can search work history as well as current jobs. Leave the current-roles switch off and you find everyone who used to run that function somewhere, which no snapshot of current titles can answer.
- **Filters on what the company runs.** Detected web technologies are a first-class filter, so you can search for companies using a particular platform, analytics stack or payment provider and get the people at them in the same query. That is technographic prospecting rather than firmographic.
- **Takes ordinary names, not internal ids.** This provider filters locations, industries, skills, company keywords, web technologies and named companies by numeric id. Type the names; the actor resolves each one once against the provider's own index before the search runs. A name it cannot match is named in the log and left out, rather than silently disappearing and quietly widening your search.
- **Reads boolean queries in the text fields.** Job title, role description, person headline, company description and job post fields all accept the provider's own query language, so `("head of sales" OR "vp sales") NOT interim` works and is passed through exactly as typed.
- **Searches hiring signals alongside firmographics.** Job post title, description, location, remote flag and posting date can be part of a people or company search, not only of a job search. That turns "companies hiring for data engineers in Berlin this quarter" into one query rather than three.
- **Keeps searching and reaching separate.** The search returns profiles without contact details, because at this provider the contact details are a separate call with their own credit price. A browse is never billed as an enrichment. When you want the addresses, run the contact mode over the rows you kept.
- **Charges nothing for a contact miss.** The provider answers an empty result for a person it has no details for, and states that this costs no credit. Those rows are marked as misses here and are never billed either.
- **Knows the difference between a work and a personal address.** They are separate lookups at separate prices. Personal addresses are restricted by the provider to consumer webmail, deliberately, so what comes back is reachable rather than merely present.
- **Turns an address or a number back into a person.** Two reverse lookups, for when a signup list has nothing in it but contact details.
- **Resolves your account for you.** Almost every path at this provider carries an internal account id. The actor reads it from your key rather than making you find it, and says which account it used.
- **Never charges for a miss.** Only rows carrying a resolved record are billed.

### Input

| Field | What it does |
| --- | --- |
| `mode` | Search people, companies or job posts; profile, contacts, reverse lookup or website. |
| `personIdentifiers` | Profile URLs, slugs or ids for the profile and contact modes. |
| `contactKinds` | Work emails, personal emails, phone numbers. |
| `emails` / `phoneNumbers` | Values for the two reverse lookups. |
| `domains` | Domains for the website mode. |
| `roleTitle` | Job title, with boolean operators. |
| `roleDescription` | Words in the role description. |
| `personName` | First, last or full name. |
| `personHeadline` | The one-line self-description. |
| `personDescription` | Words in the longer profile summary. |
| `companyDescription` | Words in the company description. |
| `jobPostTitle` | Title on a job posting. |
| `jobPostDescription` | Words in a job posting body. |
| `personLocations` | Where the person is. |
| `personIndustries` | Industry on the person profile. |
| `personIndustriesExclude` | Person industries to leave out. |
| `personSkills` | Skills listed on the profile. |
| `companyNames` | Named companies to restrict to. |
| `companyLocations` | Where the company is. |
| `companyIndustries` | Company industry. |
| `companyIndustriesExclude` | Company industries to leave out. |
| `companyKeywords` | Provider keywords on the company. |
| `companyTechnologies` | Technologies detected on the company site. |
| `jobPostLocations` | Where a posting is. |
| `jobPostLocationsExclude` | Posting locations to leave out. |
| `personLinkedinSlugs` | Specific people by profile URL or slug. |
| `companyDomains` | Companies by website domain. |
| `companyLinkedinSlugs` | Companies by profile URL or slug. |
| `fundingTypes` | Round types the company has raised. |
| `jobSource` | Which job board, in job search. |
| `currentRolesOnly` | Current roles rather than work history. |
| `jobPostIsRemote` | Remote postings only. |
| `jobPostIsActive` | Open postings only. |
| `yearsInRoleMin` / `Max` | Time in the current role. |
| `headcountMin` / `Max` | Employee count range. |
| `revenueMin` / `Max` | Annual revenue range. |
| `domainRankMin` / `Max` | Website traffic rank range. |
| `domainTrafficMin` / `Max` | Monthly visits range. |
| `fundingTotalMin` / `Max` | Total raised range. |
| `roleStartedFrom` / `To` | When the role started. |
| `foundedFrom` / `To` | When the company was founded. |
| `fundedFrom` / `To` | When it last raised. |
| `jobPostedFrom` / `To` | When the posting appeared. |
| `requireLinkedinProfile` | Keep only rows with a profile URL. |
| `requireCompanyDomain` | Keep only rows with a company domain. |
| `emailStatuses` | Keep only these address validation statuses. |
| `minCompanyHeadcount` | Drop rows whose company is smaller than this. |
| `accountId` | Which of your accounts to use. Resolved for you if left at zero. |
| `requestsPerMinute` | Pace the run under your plan's rate limit. |
| `skipNotFound` | Leave misses and refusals out of the dataset. |
| `maxResults` | Hard cap on rows, and therefore on spend. |
| `apiKey` | Your own API key. Stored as a secret. |

### Example output

```json
{
  "found": true,
  "mode": "searchPeople",
  "roleId": 88213344,
  "personId": 41220931,
  "fullName": "Alex Moreau",
  "firstName": "Alex",
  "lastName": "Moreau",
  "headline": "Data platform lead. Building the pipeline nobody has to think about.",
  "personLocation": "Berlin, Germany",
  "personLinkedinUrl": "https://www.linkedin.com/in/example",
  "personLinkedinSlug": "example",
  "personIndustry": "Software Development",
  "skills": ["Airflow", "dbt", "Kubernetes"],
  "jobTitle": "Head of Data Platform",
  "isCurrentRole": true,
  "roleStartDate": "2023-02-01",
  "roleDuration": "2 years 6 months",
  "companyId": 552310,
  "companyName": "Example GmbH",
  "companyDomain": "example.com",
  "companyWebsite": "https://www.example.com",
  "companyFoundedDate": "2014-01-01",
  "companyOperatingStatus": "active",
  "companyHeadcount": 320,
  "companyHeadcountRange": "201-500",
  "companyRevenue": 48000000,
  "companyDomainRank": 184203,
  "companyLocation": "Berlin, Germany",
  "companyIndustry": "Software Development",
  "companyLinkedinUrl": "https://www.linkedin.com/company/example",
  "workEmail": null,
  "phone": null,
  "dateUpdated": "2026-08-11",
  "error": null,
  "raw": { }
}
```

### Frequently asked questions

#### Why does a people search return no email addresses?

Because at this provider searching and reaching are separate purchases, and this actor keeps them separate for the same reason. A search that quietly fetched contact details for every row would bill you for reaching people you were only looking at. Run the search, keep the rows you want, then run the same actor in person contacts mode over those rows. The contact columns are present and empty in search output so both datasets have the same shape.

#### What is the difference between the profile mode and the contacts mode?

Profile mode returns who somebody is: headline, summary, skills, full role history, education, certifications, languages, patents, publications and projects. Contacts mode returns how to reach them: work addresses with a validation status on each, personal addresses, and phone numbers. Different data, different prices, and you often want one without the other.

#### How do the name filters work?

This provider filters locations, industries, skills, company keywords, web technologies and named companies by internal numeric id, not by text. Typing an ID into a form would be miserable, so the actor takes the name, looks it up against the provider's own index once, caches the answer, and sends the id. If a name matches nothing, the log names it and the filter is left out. That warning matters: an unmatched filter that vanished silently would widen your search and you would pay for the extra rows without knowing why.

#### Can I search work history rather than current jobs?

Yes, and it is one of the better reasons to use this provider. Leave the current-roles switch off and the search covers every role a person has held, so you can find people who ran a function at a particular company at some point, or who did a job before moving on. Because a person and a role are one record, someone with two matching roles legitimately appears twice, keyed on the role rather than the person.

#### What is a technographic filter and why is it here?

It is a filter on what a company's website is built with: the ecommerce platform, the analytics, the payment provider, the support tool. This provider detects those and lets you filter on them alongside ordinary firmographics, so "companies on this platform, over two hundred people, in these three countries, and the person who runs data there" is one query. Nothing about industry codes or headcount will tell you what a team actually runs.

#### How do I find companies that are hiring for something?

Put a title or a phrase in the job post filters while searching people or companies. The job post part of the search is not limited to the job search mode: it filters organisations by what they have posted. Combine it with the posting date range for hiring in a given quarter, and leave the active switch off when you want historical postings, which is what tells you what a team has been building towards rather than what it needs today.

#### What do the address validation statuses mean?

Every work address comes back with the provider's own verdict: valid, risky, invalid or unknown. The actor picks the first valid one as the best address for the row, and keeps the rest alongside it. Filter on the status if you are sending mail, because risky and unknown are exactly the ones that bounce.

#### Why are personal emails only from consumer providers?

That is the provider's own rule, and a deliberate one. Addresses on company and university domains are excluded from the personal email lookup even when someone uses them personally, because the point of a personal address is that it survives a job change. What comes back is a consumer mailbox or nothing.

#### Do I need to know my account id?

No. Almost every path at this provider carries one, but the actor reads it from your key and logs which one it used. Set it explicitly only when your key reaches more than one account and you want a specific one.

#### Do I need my own API key?

Yes. This actor does not include data access. You use your own key from Forager.ai, the provider whose people and company data API this actor calls, created in your provider account and pasted into the `apiKey` field, where it is stored as an Apify secret. It travels in a request header and is never written to the log. Your own plan, credits and terms apply.

#### How much does a run cost?

Pricing is pay per result: you are charged for each record resolved into the dataset, and never for lookups the provider returned nothing for, for inputs refused before they were sent, for rows dropped by the filters, or for duplicates. Apify platform usage is included in the per-result price. Your own provider credits are separate and billed by them.

### Keyword map

people search API, B2B contact data API, work email finder, personal email finder, phone number lookup, contact enrichment API, company search API, firmographic data API, technographic data API, web technology detection, company technology stack search, employee headcount data, company revenue data, funding round data, job postings API, hiring intent data, job change tracking, work history search, alumni search, skills search, reverse email lookup, reverse phone lookup, website traffic rank, prospect list building, sales intelligence API

# Actor input Schema

## `mode` (type: `string`):

The three searches find records from filters. The person modes take somebody you have already identified and return either their full profile or their contact details, which are separate purchases at this provider. The reverse modes turn an address or a number back into a person, and the website mode returns traffic rank and detected technologies for a domain.

## `personIdentifiers` (type: `array`):

For the profile and contact modes: a professional network profile URL, a bare profile slug, or the provider own numeric person id, one per line. A whole URL is reduced to its slug for you.

## `contactKinds` (type: `array`):

In person contacts mode, which of the three lookups to run for each person. Each is a separate call with its own credit price on your own plan, so asking for all three costs three times as much as asking for one. Personal emails are limited to consumer webmail providers by the provider itself, and a lookup that finds nothing costs no credit.

## `emails` (type: `array`):

In reverse email mode, the addresses to identify, one per line.

## `phoneNumbers` (type: `array`):

In reverse phone mode, the numbers to identify, one per line. Include the country code.

## `domains` (type: `array`):

In website details mode, the domains to look up, one per line. A full URL or an email address is reduced to its domain for you.

## `roleTitle` (type: `string`):

People search. The title held at the employer, for example Head of Sales. This field takes the provider own boolean query language, so AND, OR, NOT and quoted phrases work and are passed through exactly as typed.

## `roleDescription` (type: `string`):

People search. Words in the description of what the person does in the role. This field takes the provider own boolean query language, so AND, OR, NOT and quoted phrases work and are passed through exactly as typed.

## `personName` (type: `string`):

People search. A first name, last name or full name. This field takes the provider own boolean query language, so AND, OR, NOT and quoted phrases work and are passed through exactly as typed.

## `personHeadline` (type: `string`):

People search. The one-line summary a person writes about themselves, which is often more specific than their formal title. This field takes the provider own boolean query language, so AND, OR, NOT and quoted phrases work and are passed through exactly as typed.

## `personDescription` (type: `string`):

People search. Words in the longer profile summary. This field takes the provider own boolean query language, so AND, OR, NOT and quoted phrases work and are passed through exactly as typed.

## `companyDescription` (type: `string`):

People and company search. Words in the description of the company itself. This is the filter that finds companies doing a thing rather than companies filed under a category. This field takes the provider own boolean query language, so AND, OR, NOT and quoted phrases work and are passed through exactly as typed.

## `jobPostTitle` (type: `string`):

All three searches. The title on a job posting. In people and company search this finds organisations that are hiring for the role, which is a hiring-intent signal rather than a firmographic one. This field takes the provider own boolean query language, so AND, OR, NOT and quoted phrases work and are passed through exactly as typed.

## `jobPostDescription` (type: `string`):

All three searches. Words in the body of a job posting, which is where the tools a team actually uses tend to be named. This field takes the provider own boolean query language, so AND, OR, NOT and quoted phrases work and are passed through exactly as typed.

## `personLocations` (type: `array`):

Where the person is, as a city, region or country. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `personIndustries` (type: `array`):

The industry recorded against the person profile, which can differ from their employer industry. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `personIndustriesExclude` (type: `array`):

Industries to leave out of a people search. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `personSkills` (type: `array`):

Skills listed on the profile, for example Kubernetes or Contract Negotiation. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `companyNames` (type: `array`):

Named companies to restrict a people search to. Resolved against the provider own company index rather than matched as text. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `companyLocations` (type: `array`):

Where the company is, as a city, region or country. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `companyIndustries` (type: `array`):

The industry the company is filed under. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `companyIndustriesExclude` (type: `array`):

Industries to leave out. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `companyKeywords` (type: `array`):

Keywords attached to the company by the provider, which are broader than its own description. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `companyTechnologies` (type: `array`):

Technologies detected on the company website, for example Shopify, Segment or Salesforce. This is the technographic filter. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `jobPostLocations` (type: `array`):

Where a job posting is located. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `jobPostLocationsExclude` (type: `array`):

Job posting locations to leave out. Type the name and the actor resolves it to the internal id this provider filters on, once per name. A name it cannot match is reported in the log and left out rather than silently ignored.

## `personLinkedinSlugs` (type: `array`):

People search. Restrict to specific people by professional network profile URL or slug. A whole URL is reduced to its slug for you.

## `companyDomains` (type: `array`):

People and company search. Restrict to companies at these website domains, one per line.

## `companyLinkedinSlugs` (type: `array`):

People and company search. Restrict to specific companies by professional network URL or slug.

## `fundingTypes` (type: `array`):

People and company search. Restrict to companies that have raised one of these round types. Pair it with the funding total and funding date ranges to find companies that recently raised at a particular stage.

## `jobSource` (type: `string`):

Job post search only. Restrict to postings from one board. Leave empty for all of them.

## `currentRolesOnly` (type: `boolean`):

People search. Keep only roles the person still holds. Leave this off to search work history, which is how you find people who used to do a job somewhere.

## `jobPostIsRemote` (type: `boolean`):

Restrict the job post part of the search to remote postings.

## `jobPostIsActive` (type: `boolean`):

Restrict the job post part of the search to postings that are still open. Leave off to include historical ones, which is what you want when measuring what a company has been hiring for over time.

## `yearsInRoleMin` (type: `integer`):

People search only. Lower bound on years in the current role. Leave at zero for no lower bound.

## `yearsInRoleMax` (type: `integer`):

People search only. Upper bound on years in the current role. Leave at zero for no upper bound.

## `headcountMin` (type: `integer`):

People and company search. Lower bound on employee count. Leave at zero for no lower bound.

## `headcountMax` (type: `integer`):

People and company search. Upper bound on employee count. Leave at zero for no upper bound.

## `revenueMin` (type: `integer`):

People and company search. Lower bound on annual revenue in dollars. Leave at zero for no lower bound.

## `revenueMax` (type: `integer`):

People and company search. Upper bound on annual revenue in dollars. Leave at zero for no upper bound.

## `domainRankMin` (type: `integer`):

People and company search. A lower number is a busier site, so a maximum here is a floor on popularity. Lower bound on website traffic rank. Leave at zero for no lower bound.

## `domainRankMax` (type: `integer`):

People and company search. A lower number is a busier site, so a maximum here is a floor on popularity. Upper bound on website traffic rank. Leave at zero for no upper bound.

## `domainTrafficMin` (type: `integer`):

Company search only. Lower bound on monthly website visits. Leave at zero for no lower bound.

## `domainTrafficMax` (type: `integer`):

Company search only. Upper bound on monthly website visits. Leave at zero for no upper bound.

## `fundingTotalMin` (type: `integer`):

People and company search. Lower bound on total raised in dollars. Leave at zero for no lower bound.

## `fundingTotalMax` (type: `integer`):

People and company search. Upper bound on total raised in dollars. Leave at zero for no upper bound.

## `roleStartedFrom` (type: `string`):

People search only. Narrow to people who started their current role in a window, which is how you reach somebody in their first months in a job. Earliest the role start date, as YYYY-MM-DD. Leave empty for no lower bound.

## `roleStartedTo` (type: `string`):

People search only. Narrow to people who started their current role in a window, which is how you reach somebody in their first months in a job. Latest the role start date, as YYYY-MM-DD. Leave empty for no upper bound.

## `foundedFrom` (type: `string`):

People and company search. Earliest the company founding date, as YYYY-MM-DD. Leave empty for no lower bound.

## `foundedTo` (type: `string`):

People and company search. Latest the company founding date, as YYYY-MM-DD. Leave empty for no upper bound.

## `fundedFrom` (type: `string`):

People and company search. Pair with the round types to find companies that raised recently. Earliest the funding round date, as YYYY-MM-DD. Leave empty for no lower bound.

## `fundedTo` (type: `string`):

People and company search. Pair with the round types to find companies that raised recently. Latest the funding round date, as YYYY-MM-DD. Leave empty for no upper bound.

## `jobPostedFrom` (type: `string`):

All three searches. Earliest the job posting date, as YYYY-MM-DD. Leave empty for no lower bound.

## `jobPostedTo` (type: `string`):

All three searches. Latest the job posting date, as YYYY-MM-DD. Leave empty for no upper bound.

## `requireLinkedinProfile` (type: `boolean`):

Drop rows carrying no professional network profile for the person or the company. Useful when the output feeds something that needs a profile to work from.

## `requireCompanyDomain` (type: `boolean`):

Drop rows where the company website domain is unknown. A domain is what most downstream enrichment needs.

## `emailStatuses` (type: `array`):

In person contacts mode, keep only rows whose best address carries one of these validation statuses. Leave empty to keep every status.

## `minCompanyHeadcount` (type: `integer`):

Drop rows whose company is smaller than this, after the fact. Different from the headcount range above, which is asked of the provider: this one also applies to the lookup modes, where there is no search filter to use.

## `accountId` (type: `integer`):

Which of your provider accounts to run against. Leave at zero and the actor reads it from your key, which is right unless your key reaches more than one account.

## `requestsPerMinute` (type: `integer`):

Pace the run so it stays under whatever rate your plan allows.

## `skipNotFound` (type: `boolean`):

Leave values the provider returned nothing for, and inputs refused before they were sent, out of the dataset. Off by default, because knowing which of your inputs could not be resolved is usually the point. Misses are never charged for either way.

## `maxResults` (type: `integer`):

Stop after this many rows. This is the cap on both spend and run time.

## `apiKey` (type: `string`):

Your own API key for the people and company data API, created in your provider account. Sent in a header and never written to the log. Stored as a secret.

## Actor input object example

```json
{
  "mode": "searchPeople",
  "personIdentifiers": [],
  "contactKinds": [
    "workEmails"
  ],
  "emails": [],
  "phoneNumbers": [],
  "domains": [],
  "personLocations": [],
  "personIndustries": [],
  "personIndustriesExclude": [],
  "personSkills": [],
  "companyNames": [],
  "companyLocations": [],
  "companyIndustries": [],
  "companyIndustriesExclude": [],
  "companyKeywords": [],
  "companyTechnologies": [],
  "jobPostLocations": [],
  "jobPostLocationsExclude": [],
  "personLinkedinSlugs": [],
  "companyDomains": [],
  "companyLinkedinSlugs": [],
  "fundingTypes": [],
  "jobSource": "",
  "currentRolesOnly": false,
  "jobPostIsRemote": false,
  "jobPostIsActive": false,
  "yearsInRoleMin": 0,
  "yearsInRoleMax": 0,
  "headcountMin": 0,
  "headcountMax": 0,
  "revenueMin": 0,
  "revenueMax": 0,
  "domainRankMin": 0,
  "domainRankMax": 0,
  "domainTrafficMin": 0,
  "domainTrafficMax": 0,
  "fundingTotalMin": 0,
  "fundingTotalMax": 0,
  "requireLinkedinProfile": false,
  "requireCompanyDomain": false,
  "emailStatuses": [],
  "minCompanyHeadcount": 0,
  "accountId": 0,
  "requestsPerMinute": 120,
  "skipNotFound": false,
  "maxResults": 100
}
```

# Actor output Schema

## `results` (type: `string`):

One row per record, carrying the person name, headline, skills, location and profile URL, the role title, dates and duration, the employer name, domain, headcount, revenue, industry, funding events and traffic rank, and, in contact mode, the work and personal addresses and phone numbers with a validation status on each.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "personIdentifiers": [],
    "emails": [],
    "phoneNumbers": [],
    "domains": [],
    "personLocations": [],
    "personIndustries": [],
    "personIndustriesExclude": [],
    "personSkills": [],
    "companyNames": [],
    "companyLocations": [],
    "companyIndustries": [],
    "companyIndustriesExclude": [],
    "companyKeywords": [],
    "companyTechnologies": [],
    "jobPostLocations": [],
    "jobPostLocationsExclude": [],
    "personLinkedinSlugs": [],
    "companyDomains": [],
    "companyLinkedinSlugs": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/people-contact-data-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "personIdentifiers": [],
    "emails": [],
    "phoneNumbers": [],
    "domains": [],
    "personLocations": [],
    "personIndustries": [],
    "personIndustriesExclude": [],
    "personSkills": [],
    "companyNames": [],
    "companyLocations": [],
    "companyIndustries": [],
    "companyIndustriesExclude": [],
    "companyKeywords": [],
    "companyTechnologies": [],
    "jobPostLocations": [],
    "jobPostLocationsExclude": [],
    "personLinkedinSlugs": [],
    "companyDomains": [],
    "companyLinkedinSlugs": [],
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/people-contact-data-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "personIdentifiers": [],
  "emails": [],
  "phoneNumbers": [],
  "domains": [],
  "personLocations": [],
  "personIndustries": [],
  "personIndustriesExclude": [],
  "personSkills": [],
  "companyNames": [],
  "companyLocations": [],
  "companyIndustries": [],
  "companyIndustriesExclude": [],
  "companyKeywords": [],
  "companyTechnologies": [],
  "jobPostLocations": [],
  "jobPostLocationsExclude": [],
  "personLinkedinSlugs": [],
  "companyDomains": [],
  "companyLinkedinSlugs": []
}' |
apify call nabeelbaghoor/people-contact-data-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/people-contact-data-api"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/NHU1ngmWCpVT8SsPd/builds/0ckicFaqg0R8CPVT7/openapi.json
