Contact Enrichment API - Emails and Phones by Profile avatar

Contact Enrichment API - Emails and Phones by Profile

Pricing

$15.00 / 1,000 results

Go to Apify Store
Contact Enrichment API - Emails and Phones by Profile

Contact Enrichment API - Emails and Phones by Profile

Turn LinkedIn profile URLs, email addresses, phone numbers or profile ids into full people records with work emails, personal emails, direct phone numbers, job history, education, skills and social profiles. Or search for people by title, company, location and seniority. Pay per result.

Pricing

$15.00 / 1,000 results

Rating

0.0

(0)

Developer

Nabeel Hassan

Nabeel Hassan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Give it a list of LinkedIn profile URLs and get back work emails, personal emails and direct phone numbers, with the job history, education, skills and social profiles behind each person. Or search for the people first, by title, company, location and seniority, then enrich only the ones worth the credit. One flat row per person.

What this actor does

  • Takes four kinds of identifier, mixed freely. LinkedIn profile URLs, email addresses, phone numbers and provider profile ids can all be in the same list. Each line is classified before the request, and profile URLs are reduced to their canonical form first, so tracking parameters, locale prefixes and trailing slashes do not break a match.
  • Runs without a webhook. This provider delivers enrichment to a callback URL by default, which an actor has no way to host. Every request here uses the provider's own synchronous mode instead, which returns the answers in the response body. That is the documented way to use this API from somewhere that cannot receive a callback.
  • Separates work addresses from personal ones. The provider returns contacts as a typed list rather than as columns. The actor splits them into a first email, a work email, a personal email and a first phone number, and keeps the complete lists alongside with each entry's subtype and confidence rating. Require a work address and a mixed list becomes one you can actually run a B2B sequence against.
  • Returns the whole person, not just the contact. Job title, employer, company website, industry, company size and staff count, start date, total years of experience, every past role, education with degrees and years, skills, headline, summary, photo and every social profile the provider holds.
  • Searches for people you do not know yet. Filter by job title, employer, location, industry, department, seniority band, education, years of experience and free text keywords, with boolean syntax on the text fields. Search returns overviews without contact details, which is the point: it is for deciding who is worth spending a credit on.
  • Handles a scroll token that expires in fifteen seconds. Search paging uses a token with a very short life. The actor requests the next page before writing the current one to the dataset, because writing first can take longer than the token lives, and it exempts paging from the ordinary request spacing.
  • Batches up to one hundred identifiers per request. Results are matched back to your input by the identifier the provider echoes rather than by position, because it drops duplicates and failures from the array and every later index would otherwise land on the wrong input.
  • Never charges for a miss. Only rows carrying a resolved person are billed.

Input

FieldWhat it does
modeEnrich identifiers, or search for people.
itemsLinkedIn URLs, emails, phones or profile ids to enrich.
currentTitleJob title to search for. Boolean syntax supported.
includePastTitlesMatch the title across a whole career.
currentCompanyEmployer to search for. Boolean syntax supported.
includePastCompaniesMatch the company across a whole career, to find alumni.
locationsCities, states or countries.
industriesIndustry names as the provider spells them.
departmentsRestrict to these functions.
levelsRestrict to these seniority bands.
keywordsFree text across skills, education and the profile.
fullNameSearch by name.
educationUniversity, faculty or degree to match.
yearsOfExperienceFrom / yearsOfExperienceToCareer length bounds.
openToWorkOnly people flagged as open to new roles.
requireEmailKeep only people with an email address.
requireWorkEmailKeep only people with a work address.
requirePhoneKeep only people with a phone number.
batchSizeIdentifiers per request, up to one hundred.
pageSizeProfiles per search page, up to one hundred.
requestsPerMinutePace the run under your plan's rate limit.
skipNotFoundLeave unresolved identifiers out of the dataset.
maxResultsHard cap on rows, and therefore on spend and run time.
apiKeyYour own API key. Stored as a secret.

Example output

{
"found": true,
"mode": "enrich",
"query": "https://www.linkedin.com/in/janedoe",
"queryType": "linkedinUrl",
"status": "success",
"uid": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6",
"fullName": "Jane Doe",
"headline": "VP of Engineering at Example",
"location": "London, United Kingdom",
"email": "jane.doe@example.com",
"workEmail": "jane.doe@example.com",
"personalEmail": "jane@personalmail.example",
"emails": [
{ "value": "jane.doe@example.com", "subType": "work", "rating": 100, "info": null }
],
"phone": "+442071234567",
"phones": [
{ "value": "+442071234567", "subType": "work_phone", "rating": 100, "info": null }
],
"jobTitle": "VP of Engineering",
"organization": "Example",
"companyWebsite": "https://example.com",
"companyIndustry": "Computer Software",
"companyStaffCount": 480,
"experienceYears": 14,
"skills": ["Kubernetes", "Distributed Systems"],
"linkedinUrl": "https://www.linkedin.com/in/janedoe",
"error": null,
"raw": { }
}

Frequently asked questions

What can I use as an input identifier?

A LinkedIn profile URL, an email address, a phone number, or a profile id from the provider's own database. All four can be mixed in one list and the actor sorts them out before the request. The LinkedIn URL is the most common starting point because it is the identifier people already have: exported from a saved search, a Sales Navigator list or a set of connections. The provider matches on the canonical form of the URL, so the actor strips tracking parameters and locale prefixes before sending it.

Enrichment starts from someone you can already point at and returns everything about them, including contact details, and it costs a credit per person. Search starts from a description of the people you want, returns profile overviews without contact details, and counts against a daily search quota rather than your credits. The usual sequence is search first to build a shortlist, review it, then enrich only the profile ids that are worth paying for.

Does this need a webhook or a callback server?

No. This provider's enrichment route delivers to a callback URL by default, which is fine for a server you control and impossible for an actor. Every request here sets the provider's own synchronous flag, which returns the answers in the response body instead. The tradeoff the provider documents is that synchronous mode uses its internal data only, so contact coverage is somewhat lower than the callback route achieves, in exchange for needing no infrastructure at all.

How do I get only work email addresses?

Turn on require a work email address. The provider tags every contact with a subtype, and the actor lifts the first address tagged as a work address into its own column and drops rows that have none. That matters more than it sounds: a personal address on a B2B sequence is both a worse response rate and, in several jurisdictions, a different legal footing than a business address.

What does the rating on a contact mean?

It is the provider's confidence in that specific contact detail, and it comes back as either seventy or one hundred. One hundred means the detail is verified. Seventy means it is inferred and worth treating as a best guess. The actor keeps the rating on every entry in the emails and phones lists rather than flattening it away, so you can decide per address rather than per person.

How does the search paging work?

The first search returns a page of profiles plus a scroll token and a request id. Each following page is fetched by posting that token back. The token expires fifteen seconds after it is issued, which is short, so the actor requests the next page before writing the current one to the dataset, and it exempts paging from the ordinary pacing between requests. If a session does expire, the run stops cleanly with everything collected so far rather than failing.

How large can one enrichment request be?

One hundred identifiers, which is the provider's own ceiling. The actor defaults to the full hundred. Throughput beyond that is limited per minute rather than per request, and trial accounts are limited far more tightly than paid ones, so lower the requests per minute setting if you are testing on a trial key.

Do I need my own API key?

Yes. This actor does not include data access. You use your own API key from SignalHire, which is the provider whose contact data API this actor calls, created on their dashboard. Your own plan, credit balance and terms apply. Paste the key into the apiKey field, where it is stored as an Apify secret. The key travels in a request header rather than on the URL. Note that access to the search route is granted by the provider on request, so a new key may enrich before it can search.

What happens when an identifier resolves to nobody?

The provider answers with a per item status inside an otherwise successful response, so a miss is a real answer rather than an error. The row is written with found: false, the provider's own status and an error explaining it, and the run continues. Misses are not charged for. If the provider reports the credit balance is used up, the run stops with everything collected so far rather than working through the rest of the list for nothing.

How much does a run cost?

Pricing is pay per result: you are charged for each person resolved into the dataset, and never for misses, for rows dropped by the filters, or for duplicates. Apify platform usage is included in the per-result price. Your own API provider's credit balance is separate and billed by them.

Keyword map

contact enrichment API, people enrichment API, LinkedIn email finder, LinkedIn profile to email, work email finder, direct dial phone numbers, mobile number finder, reverse email lookup, B2B contact data, people search API, prospect search, lead enrichment, CRM enrichment, sales prospecting data, recruiting sourcing API, candidate sourcing, boolean people search, seniority filter, department filter, open to work search, profile id enrichment