ravn
Claude skill

LinkedIn profile URLs to verified emails

Turn a list of LinkedIn profile URLs into verified email addresses. Ravn matches each URL against your own data provider (it never scrapes LinkedIn) and returns only addresses that passed its own check.

Download SKILL.md Start free

Install

One command.

Installs into ~/.claude/skills for Claude Code. In Claude, upload the downloaded file under Settings → Capabilities → Skills.

npx ravn skill install linkedin-to-email

When to use

  • The user has saved profile URLs from a search, a spreadsheet or a CRM field and wants emails.
  • One URL or a list of hundreds.
  • Use linkedin_to_business_email when only work emails are acceptable (B2B outreach). Use linkedin_to_best_email when a personal address is an acceptable fallback.

Before you start

  1. Check the connection: call get_account with {} or run npx ravn whoami.
  2. linkedin_to_business_email and linkedin_to_best_email need your own provider key connected — run ravn keys add pdl first; these tools run on your own provider account. If a tool returns 403 provider_key_required, stop and tell the human to add their key. Every call is one lookup; misses are free.
  3. Ask the user which tool fits: work only, or best available. If unsure, default to linkedin_to_business_email.
  4. Check the URLs look like profiles. The tools accept linkedin.com/in/..., linkedin.com/pub/... and linkedin.com/company/... URLs; anything else is rejected as invalid_input.

Steps

  1. Clean the URLs locally: trim spaces, remove tracking query strings, and drop duplicates.
  2. One person over MCP:
{ "linkedin_url": "https://www.linkedin.com/in/janedoe" }
  1. Up to 100 at once over MCP:
{ "linkedin_urls": ["https://www.linkedin.com/in/janedoe", "https://www.linkedin.com/in/samlee"] }

The response is one item per URL with its own status (ok or not_found) and result. 4. A CSV with the CLI: dry run, sample, full. The --column fills the linkedin_url field.

npx ravn enrich profiles.csv --tool linkedin_to_business_email --column LinkedIn --dry-run
npx ravn enrich profiles.csv --tool linkedin_to_business_email --column LinkedIn --limit 10 --out sample.csv
npx ravn enrich profiles.csv --tool linkedin_to_business_email --column LinkedIn --out with-emails.csv

The dry run shows how many lookups the run will use. 5. Read each hit: email, status (the email verdict), risk_score, validated_at and type (business or personal). Invalid addresses are never returned. 6. For risky results (catch-all domains), tell the user they are lower confidence. 7. For misses, if the CSV has the person's name and company domain, you can try search_business_email_by_name instead. That is ours, 1 lookup, and needs no provider key.

Output

The CSV keeps every original column and adds:

  • rw_status: ok, not_found, error or dropped.
  • rw_email, rw_verdict (valid, risky or unknown), rw_risk_score, rw_validated_at, rw_type.
  • rw_full_name and rw_linkedin_url to confirm the match.

Summary: URLs in, emails found, split by business and personal, verdict counts, and lookups used.

Rules

  • Only use personal emails where the user has a lawful reason to contact someone at a personal address; for cold B2B outreach prefer linkedin_to_business_email.
  • People who opted out are removed from the data and will not be returned. Do not try other routes to reach them. See /privacy#optout.
  • Leave risky and unknown results out of any automated send.
  • No FCRA uses: never look up candidates, tenants or applicants to decide credit, employment, insurance or housing.
  • On a 429 fair_use_exhausted or a 403 provider_key_required, stop and tell the human.

Example prompt

I've got 150 LinkedIn URLs in a sheet (column "Profile") of people I met at events. Get me their work emails, and only ones you're confident in.