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.
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 oflite(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.
| Tier | Credits | Use 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"
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.
/profile-data-connection-count-posts?username=SLUG(1 credit, combo: profile + connection count + recent posts in one call)- Company call, pick one:
- If
company_domain:/get-company-by-domain?domain=DOMAIN - Else if
company_linkedin_url:/get-company-details?username=COMPANY_SLUG
- If
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:
/get-received-recommendations?username=SLUG(quotes written about the prospect)/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:
/get-profile-comments?username=SLUG&start=0(what the prospect engages with; often higher signal than their own posts)/get-company-insights?username=COMPANY_SLUG(headcount trends, growth rate, function distribution)/get-user-articles?username=SLUG(long-form publications catalog, great for "I read your piece on X" hooks)- 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)
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)
| # | Endpoint | Param | Returns |
|---|---|---|---|
| 1 | / | username | Core profile (name, headline, summary, education, locations) |
| 2 | /get-profile-data-by-url | url | Same as #1 but accepts full URL |
| 3 | /all-profile-data | username | Full dump (positions, skills, languages, certifications). 5x larger body than #1 |
| 4 | /connection-count | username | Just connections + followers |
| 5 | /data-connection-count | username | Profile + connection count (combo) |
| 6 | /profile-data-connection-count-posts | username | Profile + connections + recent posts, 3-in-1. DEFAULT for bulk. |
| 7 | /similar-profiles | url | "People also viewed" list for multi-threading |
| 8 | /get-profile-posts | username, postedAt, start | Post feed. postedAt=YYYY-MM-DD filters newer-than |
| 9 | /get-profile-comments | username, start | Comments the user left elsewhere. High signal for "what topics engage them" |
| 10 | /get-profile-likes | username, start | Posts the user reacted to |
| 11 | /get-profile-posts-comments | username, start | Posts + comments interleaved |
| 12 | /get-profile-post-and-comments | url | ONE post + its comment thread |
| 13 | /get-profile-recent-activity-time | username | Last activity timestamp. PRE-FLIGHT CHECK. |
| 14 | /get-given-recommendations | username | Recommendations the user wrote (their network of trust) |
| 15 | /get-received-recommendations | username | Quotes written about the user. Gold for social proof. |
Articles (4)
| # | Endpoint | Param | Returns |
|---|---|---|---|
| 16 | /get-article | url | Full article body |
| 17 | /get-article-comments | url | Comment thread |
| 18 | /get-article-reactions | url | Who reacted |
| 19 | /get-user-articles | username or url | All articles by a user |
Posts (1)
| # | Endpoint | Param | Returns |
|---|---|---|---|
| 20 | /get-post | url | Single post details |
Company (10)
| # | Endpoint | Param | Returns |
|---|---|---|---|
| 21 | /get-company-by-domain | domain | Workhorse. Bare domain in, full company data out. |
| 22 | /get-company-details | username | Company by LinkedIn slug |
| 23 | /get-company-details-by-id | id | Company by numeric LinkedIn ID (stable across rebrands) |
| 24 | /get-company-insights | username | Headcount trends, function distribution, growth |
| 25 | /get-company-jobs-count | username | Open jobs count. Hiring signal. |
| 26 | /get-company-pages-people-also-viewed | username | Peer / competitor companies |
| 27 | /get-company-post-comments | url | Commenters on a company post (warm leads) |
| 28 | /get-company-posts | username, start | Recent company posts. Launches, hiring, milestones. |
| 29 | /get-hiring-team | jobId or jobUrl | Recruiters on a job |
| 30 | /get-job-details | jobId | Full job posting |
Search (4)
| # | Endpoint | Param | Returns |
|---|---|---|---|
| 31 | /search-people | keywords, start | Keyword search, paginated |
| 32 | /search-people-by-url (POST) | url in JSON body | Replay a LinkedIn search URL. ONLY POST ENDPOINT. |
| 33 | /search-jobs | keywords, location, start | Job board search |
| 34 | /search-locations | keyword (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:
- HTTP 200,
"success": true, data present → real result, 1 credit deducted. - HTTP 200,
"success": false, message contains"You will not be charged"→ call rejected (bad param), no credit deducted. Fix params and retry. - 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. - 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
- Email-copywriting's "Enrichment Pipeline" step calls
enrich.py --profile URL --domain DOMAIN --depth lite. - The returned dossier is fed as context to the copy-generation step.
- 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-enrichmentskill'senrich.pywith 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
- v0.1 (2026-04-25): Initial skill. 34 endpoints mapped, 3 depth tiers defined,
enrich.pyCLI shipping with lite/standard/deep recipes. Reference HTML published at professional-network-data-docs.netlify.app.