Harmonic can enrich people with verified email addresses. Request emails from anywhere in console, or via the API. Each account gets 5,000 email requests per month, with the counter resetting on the first of each month.
A person is eligible for an email request when:
They don't already have an email recorded
They haven't been attempted in the last 30 days
In Console
You can request emails from any company or people search or list. Select the records you want (max 1,000 at a time), click the email icon, and confirm. Selections respect any filters applied.
The confirmation popup shows:
How many people are eligible
How many will be dropped, and why
How much of your monthly quota the request will use
Once submitted, emails appear on each person's profile as they come back.
Why some people get dropped
Reason | What it means |
Already has an email | We already have an email on file for this person |
Recently attempted | We tried to find an email for this person in the last 30 days. Retry after the cooldown |
Not found | The LinkedIn URL didn't resolve to a person in Harmonic |
Invalid URL | The input wasn't a recognizable LinkedIn profile URL |
If every person you selected gets dropped, the request won't be submitted and nothing counts against your quota.
Monthly quota
Each customer account gets 5,000 pooled email requests per month, with the counter resetting on the first of each month
If a bulk request would exceed your remaining quota, you'll get an error telling you how many credits you need versus how many remain. Submit a smaller batch or wait for the reset.
Via API
The same workflow is available via the API for teams that want to run enrichment from their own systems.
Submit a bulk job
Submit up to 5,000 people in a single call. Provide exactly one of these arrays:
person_linkedin_urls— raw LinkedIn profile URLsperson_urns— Harmonic person URNs
Inputs that resolve to the same internal person are silently deduplicated. The endpoint canonicalizes URLs, resolves identifiers, filters eligibility, reserves quota, and returns a job_id.
Example response (200)
json
{ "job_id": "0d9aa949-235c-4d48-bb90-8cf716db0556", "status": "PENDING", "accepted_count": 1, "dropped": [ ... ], "monthly_remaining": 4999, "created_at": "2026-05-07T15:30:00Z" }
Poll the job
The response always includes per-status counts. The results array is null until the job reaches a terminal status (COMPLETED or FAILED), at which point all per-person results are returned in a single response.
Job statuses
Status | Meaning |
| Queued, waiting to start |
| Enrichment is running. Poll again in a few seconds |
| Job finished. |
| Fatal error. |
Per-item statuses
Status | Meaning |
| Not yet processed |
| An email was found and is now available on the person's profile |
| No email could be found |
| Enrichment errored for this person |
| The person became ineligible after submit (rare, typically race conditions) |
To fetch the resolved emails once a job is COMPLETED, call the enrich a person endpoint with each returned person_urn.
Check your monthly usage
Returns your team's current quota state. Use this before submitting a large batch to avoid 429s.
Response fields:
monthly_usage— emails enriched so far this monthmonthly_limit— total emails your team can enrich each monthmonthly_remaining—monthly_limit - monthly_usage
Counters reset at the start of each calendar month.
Errors
Code | Meaning |
| Every submitted person was dropped. Check the |
| The request needs more credits than remain. Response includes |
Drop reasons
NOT_FOUND— LinkedIn URL didn't resolve to a known personINVALID_URL— input wasn't a recognizable LinkedIn profile URLALREADY_HAS_EMAIL— person already has an email recordedRECENTLY_ATTEMPTED— person was attempted within the 30-day cooldown. Retry after expiry
Full API reference: Bulk email enrichment endpoints
Questions? Email support@harmonic.ai

