Up  //  Skills  //  linkedin-enrichment v0.1  ·  updated 2026-04-25 Free to use
Home Proof Process Testimonials FAQ Resources Book a call
Home / Resources / Skills / LinkedIn Enrichment

LinkedIn Enrichment Skill

Turn a LinkedIn profile URL plus optional company domain into a single structured dossier. 34 endpoints behind a 3-tier credit budget. Plugs into email-copywriting, ABM research, closed-lost revival. Anything that needs "everything a human researcher would pull about this prospect in 60 seconds."

View live API reference Jump to CLI
Version
0.1
Last updated
2026-04-25
Endpoints
34 live
Tiers
3 (2/4/6cr)

Overview

Enriches a LinkedIn profile plus company context into a single structured dossier. Built on top of the Professional Network Data RapidAPI (34 live endpoints). Designed to plug into the email-copywriting skill, ABM research, closed-lost revival, and any other workflow that needs "everything a human researcher would pull about this prospect in 60 seconds."

Published endpoint reference (public): professional-network-data-docs.netlify.app

Mental model

Downstream skills (email copywriting, call prep, ABM briefs) all want the same thing: a consolidated "who is this person, what matters to them, what is their company doing." They should not have to reason about 34 endpoints.

This skill's job: pick the right endpoints, run them in the right order, return a uniform dossier.

★ Design principle

If you find yourself asking "which endpoint should I call?", that's the wrong level. Ask for a depth tier instead (lite / standard / deep). The tier picks the endpoints.

Inputs

Required

  • profile_url: full LinkedIn profile URL, e.g. https://www.linkedin.com/in/adamselipsky/

Optional (strongly recommended, one of)

  • company_domain: bare domain, e.g. anthropic.com. Strongest lookup path for company data.
  • company_linkedin_url: full LinkedIn company URL, e.g. https://www.linkedin.com/company/anthropicresearch/. Use when domain is unknown.

Optional

  • depth: one of lite (default), standard, deep. Pick based on campaign value (see tiers below).
  • task: free-text description of what you're writing. Used by downstream skills to decide which dossier fields matter most.

Credit economics

The API charges 1 credit per call that returns data. If the response body contains "You will not be charged for this request", no credit was deducted even though HTTP was 200.

TierCreditsUse for
LITE 2 Bulk cold email, 50+ prospects, one personalization line is enough
STANDARD 4 Targeted campaigns where reply rate matters more than volume
DEEP 6 to 8 ABM / strategic accounts, 1-to-1 outreach worth $10K+ per reply

The pre-flight freshness check (below) costs 1 credit but saves 1 if the prospect is dormant. Net zero on active prospects, net positive on dormant ones.

Pre-flight check (always, before Tier 2 or 3)

Check the prospect's last LinkedIn activity timestamp. If older than 28 days, skip the post / comment feed endpoints entirely and fall back to headline + summary for the personalization hook.

curl -G 'https://professional-network-data.p.rapidapi.com/get-profile-recent-activity-time' \
  --data-urlencode "username=$SLUG" \
  -H 'x-rapidapi-host: professional-network-data.p.rapidapi.com' \
  -H "x-rapidapi-key: $PND_API_KEY"
! Decision logic

days_since_last_activity > 28 → downgrade the run (skip posts / comments, still pull profile + company).

The 3 depth tiers

Tier 1: LITE (default, 2 credits)

Minimum dossier for cold-email personalization. Enough signal for ONE good hook line.

  1. /profile-data-connection-count-posts?username=SLUG  (1 credit, combo: profile + connection count + recent posts in one call)
  2. Company call, pick one:
    • If company_domain: /get-company-by-domain?domain=DOMAIN
    • Else if company_linkedin_url: /get-company-details?username=COMPANY_SLUG

Why this works: the combo endpoint replaces three separate calls (profile + connection-count + posts) with one. That is the entire reason it exists. For bulk enrichment, ALWAYS use the combo, not the individual endpoints.

Tier 2: STANDARD (4 credits)

For targeted outreach. Adds social proof quotes and recent company activity for a warmer angle.

Lite, plus:

  1. /get-received-recommendations?username=SLUG  (quotes written about the prospect)
  2. /get-company-posts?username=COMPANY_SLUG&start=0  (what the company is publicly saying: launches, hiring, milestones)

Tier 3: DEEP (6 to 8 credits)

For ABM, strategic accounts, or any outreach where a single reply is worth four figures.

Standard, plus:

  1. /get-profile-comments?username=SLUG&start=0  (what the prospect engages with; often higher signal than their own posts)
  2. /get-company-insights?username=COMPANY_SLUG  (headcount trends, growth rate, function distribution)
  3. /get-user-articles?username=SLUG  (long-form publications catalog, great for "I read your piece on X" hooks)
  4. Optional: /similar-profiles?url=PROFILE_URL  (peers at the same account, for multi-threading)

Input parsing (how to resolve slugs)

From a profile URL

https://www.linkedin.com/in/adamselipsky/  →  slug: adamselipsky

Take the segment after /in/, strip trailing slash. Case-sensitive, preserve as-is.

From a company LinkedIn URL

https://www.linkedin.com/company/anthropicresearch/  →  slug: anthropicresearch

Take the segment after /company/, strip trailing slash.

From a company domain

Pass the bare domain to /get-company-by-domain. No protocol, no www., no path.

https://www.anthropic.com/about  →  anthropic.com

Dossier output format

The skill returns ONE markdown block. Downstream skills (email-copywriting) consume this directly as context for drafting. Stable field order, every section present even if empty (write unknown or none in last 28 days instead of omitting the line).

## LinkedIn Enrichment Dossier
Generated 2026-04-25 14:22 IST, tier STANDARD (4 credits)

### Prospect
- **Name:** Adam Selipsky
- **Headline:** Board Director, ex-CEO AWS
- **Current role:** Board Director at Anthropic (tenure: 8 months)
- **Location:** Seattle, WA, USA
- **Connections:** 5,234  |  Followers: 87,112
- **Creator mode:** yes  |  Premium: yes
- **Last active:** 2026-04-22 (3 days ago)

### Prior roles (most recent first)
- CEO, Amazon Web Services (2021 to 2024, 3y)
- CEO, Tableau Software (2016 to 2021, 5y)
- VP, AWS (2005 to 2016, 11y)

### Education
- Harvard Business School, MBA
- Harvard College, BA Government

### Summary (verbatim, for tone matching)
> "Building what's next in AI. Previously led AWS through a decade of hyperscale growth..."

### Recent posts (last 7 days, most recent first)
1. 2026-04-22: "Thoughts on the state of AI infra..." (128 reactions, 14 comments)
2. 2026-04-19: "..." (...)

### Recommendations received (quotes, if pulled)
> "Adam built AWS from $3B to $90B while keeping the culture of 'disagree and commit' alive..."
> -- Andy Jassy, CEO Amazon

### Company
- **Name:** Anthropic
- **Domain:** anthropic.com
- **Headcount:** 512 (band: 501 to 1,000)
- **HQ:** San Francisco, CA
- **Industry:** Research Services
- **Founded:** 2021
- **Followers:** 412,000
- **Funding:** Series E, $2B, led by Google (2024-10)

### Signal summary (3 strongest hooks for personalization)
1. Posted 3 days ago about AI infra (recent + public + strong opinion)
2. Just got $2B Series E (company milestone, fresh)
3. Built AWS from $3B to $90B (prior credibility quote from recommendation)
! Anti-hallucination rule

Do not invent fields. If an API call failed or returned empty, write unknown or none. Downstream skills must be able to trust every line.

Endpoint cheat sheet

All 34 endpoints. Bolded ones are the most useful for email copywriting. Full docs at professional-network-data-docs.netlify.app.

Profile (15)

#EndpointParamReturns
1/usernameCore profile (name, headline, summary, education, locations)
2/get-profile-data-by-urlurlSame as #1 but accepts full URL
3/all-profile-datausernameFull dump (positions, skills, languages, certifications). 5x larger body than #1
4/connection-countusernameJust connections + followers
5/data-connection-countusernameProfile + connection count (combo)
6/profile-data-connection-count-postsusernameProfile + connections + recent posts, 3-in-1. DEFAULT for bulk.
7/similar-profilesurl"People also viewed" list for multi-threading
8/get-profile-postsusername, postedAt, startPost feed. postedAt=YYYY-MM-DD filters newer-than
9/get-profile-commentsusername, startComments the user left elsewhere. High signal for "what topics engage them"
10/get-profile-likesusername, startPosts the user reacted to
11/get-profile-posts-commentsusername, startPosts + comments interleaved
12/get-profile-post-and-commentsurlONE post + its comment thread
13/get-profile-recent-activity-timeusernameLast activity timestamp. PRE-FLIGHT CHECK.
14/get-given-recommendationsusernameRecommendations the user wrote (their network of trust)
15/get-received-recommendationsusernameQuotes written about the user. Gold for social proof.

Articles (4)

#EndpointParamReturns
16/get-articleurlFull article body
17/get-article-commentsurlComment thread
18/get-article-reactionsurlWho reacted
19/get-user-articlesusername or urlAll articles by a user

Posts (1)

#EndpointParamReturns
20/get-posturlSingle post details

Company (10)

#EndpointParamReturns
21/get-company-by-domaindomainWorkhorse. Bare domain in, full company data out.
22/get-company-detailsusernameCompany by LinkedIn slug
23/get-company-details-by-ididCompany by numeric LinkedIn ID (stable across rebrands)
24/get-company-insightsusernameHeadcount trends, function distribution, growth
25/get-company-jobs-countusernameOpen jobs count. Hiring signal.
26/get-company-pages-people-also-viewedusernamePeer / competitor companies
27/get-company-post-commentsurlCommenters on a company post (warm leads)
28/get-company-postsusername, startRecent company posts. Launches, hiring, milestones.
29/get-hiring-teamjobId or jobUrlRecruiters on a job
30/get-job-detailsjobIdFull job posting
#EndpointParamReturns
31/search-peoplekeywords, startKeyword search, paginated
32/search-people-by-url (POST)url in JSON bodyReplay a LinkedIn search URL. ONLY POST ENDPOINT.
33/search-jobskeywords, location, startJob board search
34/search-locationskeyword (singular!)Place name → LinkedIn geoUrn

Ghosts (in sidebar but return 404, do not use)

/get-post-reactions, /get-company-employees-count, /affiliated-pages, /groups, /schools, /newsletters, /position-skills, /top-voices, /search-companies, /search-posts, /search-posts-by-hashtag, /search-jobs-v, /posted-jobs, /get-post-reposts.

Error handling

The API's 200 response is overloaded. Three cases:

  1. HTTP 200, "success": true, data present → real result, 1 credit deducted.
  2. HTTP 200, "success": false, message contains "You will not be charged" → call rejected (bad param), no credit deducted. Fix params and retry.
  3. HTTP 200, "success": false, message does NOT contain "You will not be charged" → call ran but returned nothing (e.g. no posts in window). 1 credit deducted. Accept and move on, do not retry.
  4. HTTP 404, "message": "Endpoint '/X' does not exist" → you typed the path wrong, or it's a ghost endpoint. Do not retry.

In the script (enrich.py), these four cases are collapsed into: credit_spent: bool and data: dict | None. Check both.

Auth

API key lives in your secrets manager. For scripts, export it:

export PND_API_KEY='yourapikeygoeshere'

Or create a .env in this folder and source .env (see .env.example).

The host header is constant:

x-rapidapi-host: professional-network-data.p.rapidapi.com

Execution

Option A: Python CLI (recommended)

From this folder:

export PND_API_KEY='your_key'

# Lite (default, 2 credits)
python enrich.py \
  --profile https://www.linkedin.com/in/adamselipsky/ \
  --domain anthropic.com

# Standard (4 credits)
python enrich.py \
  --profile https://www.linkedin.com/in/adamselipsky/ \
  --domain anthropic.com \
  --depth standard

# Deep with company LinkedIn URL instead of domain
python enrich.py \
  --profile https://www.linkedin.com/in/adamselipsky/ \
  --company-url https://www.linkedin.com/company/anthropicresearch/ \
  --depth deep

# JSON output (for programmatic chaining)
python enrich.py --profile ... --format json

# Save to file
python enrich.py --profile ... --out dossier.md

Option B: Claude-driven via Bash tool

When running from a Claude session, invoke enrich.py via the Bash tool. The script prints the dossier to stdout, which becomes the context for the next LLM step.

Option C: Raw curls

For one-off experiments or integration with n8n / Clay / Zapier. Every endpoint has its own curl block at professional-network-data-docs.netlify.app. Copy, replace yourapikeygoeshere, send.

Integration with email-copywriting

The existing email-copywriting skill has a "Research Tool: LinkedIn Scraper" section that lists 3 endpoints. This skill is a strict superset (35 endpoints + credit tiers + dossier format).

Recommended integration pattern

  1. Email-copywriting's "Enrichment Pipeline" step calls enrich.py --profile URL --domain DOMAIN --depth lite.
  2. The returned dossier is fed as context to the copy-generation step.
  3. The copy-generation step references specific dossier fields (recent post line, headcount, prior role) in the personalization line.

What changes for the email-copywriting skill

  • Replace the 3-endpoint section with a one-paragraph pointer to this skill: "For LinkedIn + company enrichment, call the linkedin-enrichment skill's enrich.py with the profile URL and domain. It returns a dossier; use that as the sole source of truth for personalization facts. Do not re-invent lookups."
  • Keep email-copywriting's anti-hallucination rule: never use a fact that isn't in the dossier. If a field is unknown, pick a different angle.

Changelog

Want this wired in?

Skill is free. Plugging it into your stack is the work.

If you'd rather have us run the enrichment, write the copy, and ship the campaign, that's our day job. Book a call, we'll see if it's a fit.