---
title: "Find a work email from a LinkedIn profile"
method: POST
path: "/linkedin-email-finder"
tags: ["Enrichment"]
---

# Find a work email from a LinkedIn profile

`POST /linkedin-email-finder`

## Request

- Base URL: `https://app.1lookup.io/api/v1`
- URL: `https://app.1lookup.io/api/v1/linkedin-email-finder`
- Auth: HTTP bearer

Takes a public LinkedIn profile URL and returns that person's verified work email, with name, job title, company, company domain and location. Costs 30 credits, and nothing when no verified email is found.

## Request body

- object
  - `profile_url` string, required: Public LinkedIn profile URL (https://www.linkedin.com/in/...) or its bare username. Also accepted as `profileUrl`, `linkedin_url`, `linkedinUrl`, `url`, `username` or `vanity`.
  - `bypass_cache` boolean: Skip the 7-day result cache and run a fresh lookup. Also accepted as `bypassCache` or `forceFresh`, in the body or the query string. A cached result you ran yourself is free; a fresh lookup is charged as usual.

## Response `200`

Lookup completed. `metadata.credits_used` says what it cost.

- object
  - `success` true, required
  - `data` LinkedinEmailFinderResult, required: Work email found from a LinkedIn profile. `matched` is false when no verified email was found, and then nothing is charged.
    - `request` LookupRequest, required
      - `id` string, uuid, required: Id of this lookup.
      - `type` string, required: Lookup type, such as `phone`, `email` or `hlr_lookup`.
      - `input` string, required: The input as it was looked up, after normalization.
      - `timestamp` string, date-time, required: When the lookup ran.
      - `processing_time_ms` integer, required: Server-side processing time, in milliseconds.
    - `risk_assessment` RiskAssessment
      - `fraud_score` number: 0 to 100, higher is riskier. Not returned by every product (phone validation has none).
      - `risk_level` 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL', required
      - `risk_factors` string[], required: Codes for what raised the risk, such as `NOT_REACHABLE`, `DISPOSABLE_EMAIL` or `NO_MATCH_FOUND`.
      - `confidence_level` number, required: 0 to 100.
    - `classification` object, required
      - `matched` boolean, required
      - `work_email` string, nullable, required
      - `full_name` string, nullable
      - `job_title` string, nullable
      - `company` string, nullable
      - `company_domain` string, nullable
      - `city` string, nullable
      - `region` string, nullable
      - `country` string, nullable
      - `profile_url` string, nullable
      - `query` string, nullable: The profile looked up. Only on a no-match.
    - `insights` object, required
      - `linkedin_email_finder` object, nullable: null on a no-match.
        - `work_email` string
        - `full_name` string, nullable
        - `first_name` string, nullable
        - `job_title` string, nullable
        - `profile_url` string, nullable
        - `company` string, nullable
        - `company_domain` string, nullable
        - `company_city` string, nullable
        - `company_region` string, nullable
        - `company_country` string, nullable
        - `city` string, nullable
        - `region` string, nullable
        - `country` string, nullable
    - `recommendations` Recommendations, required
      - `primary_action` 'APPROVE' | 'VERIFY' | 'REVIEW' | 'BLOCK', required
      - `secondary_actions` string[], required
      - `user_message` string, required: One plain sentence describing the result.
      - `business_rules` object, required: Product-specific yes/no rules, such as `sms_allowed` and `voice_allowed` for a phone number.
    - `metadata` LookupMetadata, required
      - `api_version` string, required
      - `schema_version` string, required
      - `credits_used` integer: Credits this call cost. 0 for a no-match on success-billed products, and for a cached result you ran yourself.
      - `credits_remaining` integer: Credits left on the account after this call.
      - `cache_hit` boolean, required: True when the result came from the 7-day cache.
      - `cached_at` string, date-time: When the cached result was first looked up. Only on cache hits.
      - `data_sources` string[], required: Generic labels for the kinds of data consulted.
      - `fallback_used` boolean: Email verification only: a second verification ran.
      - `lookup_source` 'standard' | 'premium': Reverse phone lookup only: which record was read.

## Other responses

- `400`: `INVALID_REQUEST`: The body is not valid JSON; `MISSING_PROFILE_URL`: No profile URL was sent; `INVALID_PROFILE_URL`: The value is not a public LinkedIn profile URL; `VALIDATION_FAILED`: The lookup could not be completed for this input. Nothing was charged; `UPSTREAM_ERROR`: The source could not answer for this input. Nothing was charged
- `401`: `UNAUTHORIZED`: Invalid or missing API key
- `402`: `INSUFFICIENT_CREDITS`: Not enough credits for the request
- `403`: `UPGRADE_REQUIRED`: The account has no paid plan, and API access needs one. Upgrade at https://app.1lookup.io/billing?tab=plan; `INSUFFICIENT_SCOPE`: The call was signed with an AI connector (MCP) sign-in, which can only reach /phone, /email, /ip and /account. Use an API key
- `429`: `RATE_LIMIT_EXCEEDED`: Too many requests
- `500`: `INTERNAL_ERROR`: Internal server error
- `503`: `SERVICE_UNAVAILABLE`: The lookup service, or the API key check, is temporarily unavailable. Nothing was charged; retry after `Retry-After` seconds; `SERVICE_BUSY`: The service is busy. Nothing was reserved or charged; retry after `Retry-After` seconds; `UPSTREAM_QUOTA_EXHAUSTED`: The lookup is temporarily unavailable on our side. Nothing was charged; retry after `Retry-After` seconds; `UPSTREAM_TIMEOUT`: The source took too long to answer. Nothing was charged; retry after `Retry-After` seconds

---

[API](https://skmtc.dev/1lookup/apis/1lookup-api.md) · [All operations](https://skmtc.dev/1lookup/apis/1lookup-api/llms.txt) · [OpenAPI document](https://skmtc.dev/1lookup/apis/1lookup-api/revisions/57b6d8ba04ac?raw)
