Skill: ethcipher/linkdapi-official (version 1.0.0)

--- name: linkdapi-openclaw description: Complete LinkdAPI integration OpenClaw skill. Includes all 50+ endpoints, Python/Node.js/Go SDKs, authentication, rate limits, and real-world examples. Use this skill whenever the user wants to look up LinkedIn profiles, search LinkedIn people or companies, enrich leads, research LinkedIn jobs, scrape LinkedIn posts or articles, do B2B prospecting, get LinkedIn company data, or call any LinkedIn data API. Always use this skill for ANY LinkedIn data task, even if the user just says "find me on LinkedIn" or "look up this company" or "search LinkedIn for engineers in Berlin". version: 1.0.0 author: LinkdAPI Team --- # LinkdAPI Skill — LinkedIn Data API Use this skill to access **LinkedIn** professional data via the LinkdAPI REST API. > Full endpoint reference with params, enums, and response schemas → `references/api-ref.md` > Structured endpoint manifest (JSON) → `references/skills.json` --- ## ⚠️ Authentication — READ FIRST | | Value | |---|---| | **Auth header** | `X-linkdapi-apikey` | | **Base URL** | `https://linkdapi.com` | | **Env var** | `LINKDAPI_KEY` | ```bash curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/profile/overview?username=ryanroslansky" | jq . ``` ⛔ **NEVER use `x-api-key` or `Authorization: Bearer` — they will return 401. The only correct header is `X-linkdapi-apikey`.** --- ## Core Concepts | Term | Meaning | How to Get | |---|---|---| | `username` | LinkedIn vanity slug (`linkedin.com/in/USERNAME`) | From the URL | | `urn` | Internal LinkedIn ID (`ACoAAAA...`) | From `profile/overview` response | | `id` (company) | Numeric LinkedIn company ID | From `companies/company/info` or `companies/name-lookup` | | `jobId` | Numeric LinkedIn job ID | From job search results | | `geoUrn` | Location filter ID | From `geos/name-lookup` | | `cursor` | Pagination token | From previous response | **Always get URN first** when working with profile endpoints that require it. --- ## Endpoint Quick Reference ### Profile — `/api/v1/profile/` | Endpoint | Params | Use | |---|---|---| | `overview` | `username` | Basic info + URN ← **start here** | | `details` | `urn` | Positions, education, languages | | `contact-info` | `username` | Email, phone, websites | | `about` | `urn` | About section | | `full` | `username` or `urn` | Everything in 1 request | | `full-experience` | `urn` | Complete work history | | `certifications` | `urn` | Certifications | | `education` | `urn` | Education history | | `skills` | `urn` | Skills + endorsements | | `social-matrix` | `username` | Followers + connections | | `recommendations` | `urn` | Given + received | | `similar` | `urn` | Similar profiles | | `reactions` | `urn`, `cursor` | Profile reactions | | `interests` | `urn` | Interests | | `services` | `urn` | Services offered | | `username-to-urn` | `username` | Username → URN | ### Companies — `/api/v1/companies/` | Endpoint | Params | Use | |---|---|---| | `name-lookup` | `query` | Search by name | | `company/info` | `id` or `name` | Company details | | `company/info-v2` | `id` | Extended info | | `company/similar` | `id` | Similar companies | | `company/employees-data` | `id` | Headcount + distribution | | `company/affiliated-pages` | `id` | Subsidiaries | | `company/posts` | `id`, `start` | Company posts | | `company/universal-name-to-id` | `universalName` | Universal name → ID | | `jobs` | `companyIDs`, `start` | Job listings | ### Jobs — `/api/v1/jobs/` | Endpoint | Params | Use | |---|---|---| | `search` | `keyword`, `location`, `timePosted`, `workArrangement`, `geoId`, `companyIds`, `jobTypes`, `experience`, `salary`, `start` | V1 job search | | `job/details` | `jobId` | Job info (open only) | | `job/details-v2` | `jobId` | Job info (all statuses) | | `job/similar` | `jobId` | Similar jobs | | `job/people-also-viewed` | `jobId` | Related jobs | | `job/hiring-team` | `jobId`, `start` | Hiring team | | `posted-by-profile` | `profileUrn`, `start`, `count` | Jobs by a person | ### Search — `/api/v1/search/` | Endpoint | Key Params | Use | |---|---|---| | `people` | `keyword`, `title`, `currentCompany`, `geoUrn`, `industry`, `firstName`, `lastName`, `start`, `count` | Find professionals | | `companies` | `keyword`, `geoUrn`, `companySize`, `hasJobs`, `industry`, `start`, `count` | Find companies | | `posts` | `keyword`, `sortBy`, `datePosted`, `authorJobTitle`, `fromOrganization`, `contentType`, `start` | Find posts | | `jobs` | `keyword`, `workplaceTypes`, `datePosted`, `easyApply`, `companies`, `locations`, `experience`, `salary`, `under10Applicants`, `start`, `count` | V2 job search | | `services` | `keyword`, `geoUrn`, `serviceCategory`, `profileLanguage`, `start`, `count` | Service providers | | `schools` | `keyword`, `start`, `count` | Schools | ### Posts — `/api/v1/posts/` | Endpoint | Params | Use | |---|---|---| | `featured` | `urn` | Featured posts | | `all` | `urn`, `cursor`, `start` | All posts paginated | | `info` | `urn` | Single post | | `comments` | `urn`, `start`, `count`, `cursor` | Comments | | `likes` | `urn`, `start` | Likes | ### Comments — `/api/v1/comments/` | Endpoint | Params | Use | |---|---|---| | `all` | `urn`, `cursor` | All comments | | `likes` | `urn`, `start` | Comment likes | ### Articles — `/api/v1/articles/` | Endpoint | Params | Use | |---|---|---| | `all` | `urn`, `start` | All articles | | `article/info` | `url` | Article details | | `article/reactions` | `urn`, `start` | Reactions | ### Lookups | Path | Params | Use | |---|---|---| | `/api/v1/geos/name-lookup` | `query` | → geoUrn for location filters | | `/api/v1/g/title-skills-lookup` | `query` | → skill/title IDs | | `/api/v1/g/services-lookup` | `query` | → service category IDs | ### Services — `/api/v1/services/` | Endpoint | Params | Use | |---|---|---| | `service/details` | `vanityname` | Service page | | `service/similar` | `vanityname` | Similar services | ### System | Path | Use | |---|---| | `status/` | Health check (no auth) | --- ## Common Workflows ### Lead Enrichment (Profile Research) ```bash # Step 1: Get URN PROFILE=$(curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/profile/overview?username=TARGET_USERNAME") URN=$(echo $PROFILE | jq -r '.data.urn') echo "$(echo $PROFILE | jq -r '.data.fullName') → $URN" # Step 2: Enrich in parallel curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/profile/full-experience?urn=$URN" | jq '.data.experience[0]' & curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/profile/skills?urn=$URN" | jq '.data.skills[:5]' & curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/profile/contact-info?username=TARGET_USERNAME" | jq '.data' & wait # Or use full endpoint (one request, more credits) curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/profile/full?username=TARGET_USERNAME" | jq .data ``` ### Company Research ```bash CO_ID=$(curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/companies/company/info?name=google" | jq -r '.data.id') curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/companies/company/employees-data?id=$CO_ID" | jq .data & curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/companies/company/similar?id=$CO_ID" | jq .data & curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/companies/jobs?companyIDs=$CO_ID&start=0" | jq .data & wait ``` ### ICP People Search ```bash GEO_URN=$(curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/geos/name-lookup?query=San+Francisco" | jq -r '.data[0].urn') curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/search/people?keyword=VP+Sales&title=VP+Sales&geoUrn=$GEO_URN&start=0" \ | jq '.data.items' ``` ### Job Market Intel ```bash # V2 (richest filters) curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/search/jobs?keyword=Software+Engineer&workplaceTypes=remote&datePosted=1week&easyApply=true" \ | jq .data # V1 (classic, location string) curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/jobs/search?keyword=Marketing+Manager&location=London&timePosted=1week&workArrangement=hybrid" \ | jq .data ``` ### Content Research ```bash # Posts by a profile curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/posts/all?urn=$URN&start=0" | jq .data # Search posts by keyword curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/search/posts?keyword=AI+marketing&sortBy=date_posted&datePosted=past-week" \ | jq .data # Articles curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/articles/all?urn=$URN&start=0" | jq .data ``` --- ## Error Handling All responses: `{ "success": bool, "statusCode": int, "message": string, "errors": null|string, "data": ... }` ```bash RESULT=$(curl -s -H "X-linkdapi-[REDACTED_SECRET]" \ "https://linkdapi.com/api/v1/profile/overview?username=someuser") if echo $RESULT | jq -e '.success == true' > /dev/null 2>&1; then echo "OK: $(echo $RESULT | jq -r '.data.fullName')" else CODE=$(echo $RESULT | jq -r '.statusCode') MSG=$(echo $RESULT | jq -r '.message') echo "Error $CODE: $MSG" # 401=invalid key | 404=not found | 429=rate limited (retry with backoff) | 500=server error [ "$CODE" = "429" ] && sleep 5 && echo "Retry after backoff" fi ``` --- ## B2B Marketing Playbook | Goal | Endpoints | |---|---| | Lead enrichment | `profile/overview` → `profile/full-experience` + `profile/skills` + `profile/contact-info` | | ICP targeting | `geos/name-lookup` → `search/people` with `title` + `currentCompany` + `geoUrn` | | Competitor intel | `companies/company/posts` or `search/posts?fromOrganization=ID` | | Hiring signals | `companies/jobs?companyIDs=ID` reveals growth areas | | Content inspiration | `posts/all` on top voices + `posts/info` for engagement stats | | Warm outreach prep | `profile/recommendations` + `posts/all` before messaging | | Job trigger events | `jobs/posted-by-profile` to find who is hiring actively | --- ## Reference Files - **`references/api-ref.md`** — Full parameter schemas, all enums, and response field descriptions for every endpoint. Read this when you need exact param names or response field shapes. - **`references/skills.json`** — Machine-readable manifest of all endpoints (for dynamic tooling or integrations).

path: references/api-ref.md
content: # LinkdAPI — Complete API Reference

> Source of truth: https://linkdapi.com/apispec.yml

**Base URL:** `https://linkdapi.com`  
**Auth Header:** `X-linkdapi-[REDACTED_SECRET]`  ← exact header name, case matters in some clients  
**Response envelope:** `{ success, statusCode, message, errors, data }`

Get API key: https://linkdapi.com/?p=signup (100 free credits)

---

## PROFILE ENDPOINTS

### GET `/api/v1/profile/overview`
Basic LinkedIn profile info by username. **Returns URN needed for all other profile endpoints.**

| Param | Type | Required |
|---|---|---|
| `username` | string | ✅ |

Returns: `firstName, lastName, fullName, headline, publicIdentifier, followerCount, connectionsCount, creator, qualityProfile, joined, profileID, urn, CurrentPositions[], isTopVoice, premium, influencer, location{countryCode,countryName,city,region,fullLocation}, backgroundImageURL, profilePictureURL, supportedLocales[]`

---

### GET `/api/v1/profile/details`
Detailed LinkedIn profile by URN.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `about, featuredPosts[]{postLink,postText}, positions[]{jobTitle,company,location,duration,companyLink,companyId,jobDescription}, education[]{duration,durationParsed{start,end},university,universityLink,degree}, languages{languages[]{Language,Level},deepLink}`

---

### GET `/api/v1/profile/contact-info`
LinkedIn contact details by username. Email/phone only if user made them public.

| Param | Type | Required |
|---|---|---|
| `username` | string | ✅ |

Returns: `emailAddress (null if private), phoneNumber (null if private), websites[]{url, category}`

---

### GET `/api/v1/profile/about`
About section and verification info by URN.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

---

### GET `/api/v1/profile/full`
Complete LinkedIn profile in one request. Higher credit cost, fewer round trips.

| Param | Type | Required |
|---|---|---|
| `username` | string | one of |
| `urn` | string | one of |

---

### GET `/api/v1/profile/full-experience`
Complete work history with parsed start/end dates.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `experience[]{companyName, companyId, companyLink, companyLogo, location, title, subTitle, description, duration, durationParsed{start{year,month,day}, end{year,month,day}, present, period}, positions[], isMultiPositions, totalDuration}`

---

### GET `/api/v1/profile/certifications`
Professional certifications by URN.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `certifications[]{issuedBy, certificationLink, certificationName, issuedDate, issuerId, issuerLink, issuedDateParsed{year,month,day}}`

---

### GET `/api/v1/profile/education`
Education history by URN.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `education[]{duration, durationParsed{start,end}, university, universityLink, degree, description, subDescription}`

---

### GET `/api/v1/profile/skills`
Skills and endorsement counts by URN.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `skills[]{skillName, endorsementsLink, textActionTarget, isPassedLinkedInSkillAssessment, endorsementsCount}`

---

### GET `/api/v1/profile/social-matrix`
Follower and connection counts by username.

| Param | Type | Required |
|---|---|---|
| `username` | string | ✅ |

Returns: `{ connectionsCount, followersCount }`

---

### GET `/api/v1/profile/recommendations`
Given and received recommendations by URN.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `Received[]{Text, Caption, Recommendee{name,headline,urn,url}}, Given[]{...}, Total, TotalGiven, TotalReceived`

---

### GET `/api/v1/profile/similar`
Similar profiles by URN.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `[]{id, urn, publicIdentifier, firstName, lastName, headline, creator, profilePictureURL}`

---

### GET `/api/v1/profile/reactions`
All profile reactions, paginated.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |
| `cursor` | string | ❌ |

---

### GET `/api/v1/profile/interests`
Profile interests by URN.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

---

### GET `/api/v1/profile/services`
Services offered by a profile.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `services{servicesProvided[], servicePageURL, serviceId, requestProposalURL}`

---

### GET `/api/v1/profile/username-to-urn`
Get profile URN from username directly.

| Param | Type | Required |
|---|---|---|
| `username` | string | ✅ |

---

## COMPANIES ENDPOINTS

> Note: base path is `/api/v1/companies/` (plural), and company ID param is `id=` not `company_id=`

### GET `/api/v1/companies/name-lookup`
Search LinkedIn companies by name.

| Param | Type | Required |
|---|---|---|
| `query` | string | ✅ |

---

### GET `/api/v1/companies/company/info`
LinkedIn company details by ID or name.

| Param | Type | Required |
|---|---|---|
| `id` | string | one of |
| `name` | string | one of |

Returns: `id, name, universalName, description, website, industry, companySize, followerCount, employeeCount, founded, logoURL, specialties[], linkedinURL, headquartersCity, headquartersCountry`

---

### GET `/api/v1/companies/company/info-v2`
Extended company info including `peopleAlsoFollow`, `affiliatedByJobs`, etc.

| Param | Type | Required |
|---|---|---|
| `id` | string | ✅ |

---

### GET `/api/v1/companies/company/similar`
Similar companies by ID.

| Param | Type | Required |
|---|---|---|
| `id` | string | ✅ |

---

### GET `/api/v1/companies/company/employees-data`
Employee count and distribution stats.

| Param | Type | Required |
|---|---|---|
| `id` | string | ✅ |

Returns: `totalEmployees, distribution{function, seniority, geography}`

---

### GET `/api/v1/companies/company/affiliated-pages`
Subsidiaries and affiliated pages.

| Param | Type | Required |
|---|---|---|
| `id` | string | ✅ |

---

### GET `/api/v1/companies/company/posts`
Posts published by a company.

| Param | Type | Required |
|---|---|---|
| `id` | string | ✅ |
| `start` | int | ❌ (default: 0) |

---

### GET `/api/v1/companies/company/universal-name-to-id`
Get company numeric ID from universalName (slug).

| Param | Type | Required |
|---|---|---|
| `universalName` | string | ✅ |

---

### GET `/api/v1/companies/jobs`
Active LinkedIn job listings for one or more companies.

| Param | Type | Required | Notes |
|---|---|---|---|
| `companyIDs` | string | ✅ | Comma-separated company IDs |
| `start` | int | ❌ | default: 0 |

---

## JOBS ENDPOINTS

### GET `/api/v1/jobs/search`
Search LinkedIn jobs — version 1 (simpler filters).

| Param | Type | Values/Notes |
|---|---|---|
| `keyword` | string | Job title, skills, keywords |
| `location` | string | City, state, region text |
| `geoId` | string | LinkedIn geo ID (from geos/name-lookup) |
| `companyIds` | string | Comma-separated company IDs |
| `jobTypes` | string | `full_time`, `part_time`, `contract`, `temporary`, `internship`, `volunteer` |
| `experience` | string | `internship`, `entry_level`, `associate`, `mid_senior`, `director` |
| `regions` | string | Region codes |
| `timePosted` | string | `any`, `24h`, `1week`, `1month` (default: `any`) |
| `salary` | string | `any`, `40k`, `60k`, `80k`, `100k`, `120k` |
| `workArrangement` | string | `onsite`, `remote`, `hybrid` |
| `start` | int | Pagination offset (default: 0) |

---

### GET `/api/v1/jobs/job/details`
Full LinkedIn job details. **Only works for open/active jobs.**

| Param | Type | Required |
|---|---|---|
| `jobId` | string | ✅ |

Returns: `title, company, companyId, companyLogoURL, location, workplaceType, employmentType, experienceLevel, description, applicantsCount, postedAt, salary, applyURL, hiringTeam[]`

---

### GET `/api/v1/jobs/job/details-v2`
Job details v2. **Supports all job statuses** (open, closed, expired, etc.).

| Param | Type | Required |
|---|---|---|
| `jobId` | string | ✅ |

---

### GET `/api/v1/jobs/job/similar`
Similar LinkedIn jobs.

| Param | Type | Required |
|---|---|---|
| `jobId` | string | ✅ |

---

### GET `/api/v1/jobs/job/people-also-viewed`
Related jobs people also viewed.

| Param | Type | Required |
|---|---|---|
| `jobId` | string | ✅ |

---

### GET `/api/v1/jobs/job/hiring-team`
Hiring team members for a specific job.

| Param | Type | Required |
|---|---|---|
| `jobId` | string | ✅ |
| `start` | int | ❌ (default: 0) |

---

### GET `/api/v1/jobs/posted-by-profile`
Jobs posted by a specific LinkedIn profile.

| Param | Type | Required |
|---|---|---|
| `profileUrn` | string | ✅ |
| `start` | int | ❌ (default: 0) |
| `count` | int | ❌ (default: 25) |

---

## SEARCH ENDPOINTS

### GET `/api/v1/search/jobs`
Search LinkedIn jobs **version 2** — comprehensive filters. Prefer over `jobs/search` for complex queries.

| Param | Type | Notes |
|---|---|---|
| `keyword` | string | Search keyword |
| `start` | int | Pagination (increment by 25, default: 0) |
| `count` | int | Results per page (default: 25, max: 50) |
| `sortBy` | string | `relevance` (default) or `date_posted` |
| `datePosted` | string | `24h`, `1week`, `1month` |
| `experience` | string | `internship`, `entry_level`, `associate`, `mid_senior`, `director`, `executive` |
| `jobTypes` | string | `full_time`, `part_time`, `contract`, `temporary`, `internship`, `volunteer`, `other` |
| `workplaceTypes` | string | `onsite`, `remote`, `hybrid` |
| `salary` | string | `20k`, `30k`, `40k`, `50k`, `60k`, `70k`, `80k`, `90k`, `100k` |
| `companies` | string | Company IDs comma-separated |
| `industries` | string | Industry IDs comma-separated |
| `locations` | string | LinkedIn geo IDs comma-separated |
| `functions` | string | Job function codes (e.g. `it,sales,eng`) |
| `titles` | string | Job title IDs |
| `Benefits` | string | `medical_ins`, `dental_ins`, `vision_ins`, `401k`, `pension`, `paid_maternity`, `paid_paternity`, `commuter`, `student_loan`, `tuition`, `disability_ins` |
| `commitments` | string | `dei`, `environmental`, `work_life`, `social_impact`, `career_growth` |
| `easyApply` | bool | `true`/`false` — LinkedIn Easy Apply only |
| `verifiedJob` | bool | Verified postings only |
| `under10Applicants` | bool | Jobs with fewer than 10 applicants |
| `fairChance` | bool | Fair chance employers only |

---

### GET `/api/v1/search/people`
Search for LinkedIn professionals.

| Param | Type | Notes |
|---|---|---|
| `keyword` | string | Free text search |
| `start` | int | Pagination (default: 0) |
| `count` | int | Per page (default: 20, max: 50) |
| `firstName` | string | First name filter |
| `lastName` | string | Last name filter |
| `title` | string | Job title filter (e.g. `founder`) |
| `currentCompany` | string | Current company ID(s) comma-separated |
| `pastCompany` | string | Past company ID(s) comma-separated |
| `geoUrn` | string | Geo URN(s) from `geos/name-lookup` |
| `industry` | string | Industry ID(s) comma-separated |
| `school` | string | School ID(s) comma-separated |
| `profileLanguage` | string | Language code (e.g. `en`) |
| `serviceCategory` | string | Service category ID |

Returns: `[]{urn, publicIdentifier, firstName, lastName, headline, profilePictureURL, location}`

---

### GET `/api/v1/search/companies`
Search for LinkedIn companies.

| Param | Type | Notes |
|---|---|---|
| `keyword` | string | Company name/keyword |
| `start` | int | Pagination (default: 0) |
| `count` | int | Per page (default: 25, max: 50) |
| `geoUrn` | string | Geo URN(s) comma-separated |
| `companySize` | string | `1-10`, `11-50`, `51-200`, `201-500`, `501-1000`, `1001-5000`, `5001-10000`, `10001+` |
| `hasJobs` | bool | Filter companies with active jobs |
| `industry` | string | Industry ID(s) comma-separated |

---

### GET `/api/v1/search/posts`
Search LinkedIn posts with filters.

| Param | Type | Notes |
|---|---|---|
| `keyword` | string | Search term |
| `start` | int | Pagination (default: 10) |
| `sortBy` | string | `relevance` (default) or `date_posted` |
| `authorCompany` | string | Company ID of post author |
| `authorIndustry` | string | Industry ID of post author |
| `authorJobTitle` | string | Job title of author (e.g. `founder`) |
| `contentType` | string | `videos`, `photos`, `jobs`, `liveVideos`, `documents`, `collaborativeArticles` |
| `datePosted` | string | `past-24h`, `past-week`, `past-month`, `past-year` |
| `fromMember` | string | Profile URN of author |
| `fromOrganization` | string | Company ID(s) comma-separated |
| `mentionsMember` | string | Profile URN mentioned in posts |
| `mentionsOrganization` | string | Company ID(s) mentioned comma-separated |

---

### GET `/api/v1/search/services`
Search LinkedIn service providers.

| Param | Type | Notes |
|---|---|---|
| `keyword` | string | Service keyword |
| `start` | int | Pagination (default: 0) |
| `count` | int | Per page (default: 25, max: 50) |
| `geoUrn` | string | Geo URN(s) comma-separated |
| `profileLanguage` | string | Language code (e.g. `en,ch`) |
| `serviceCategory` | string | Service category ID(s) comma-separated |

---

### GET `/api/v1/search/schools`
Search LinkedIn educational institutions.

| Param | Type | Notes |
|---|---|---|
| `keyword` | string | School name |
| `start` | int | Pagination (default: 0) |
| `count` | int | Per page (default: 25, max: 50) |

---

## POSTS ENDPOINTS

### GET `/api/v1/posts/featured`
Featured posts pinned to a LinkedIn profile.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

---

### GET `/api/v1/posts/all`
All posts by a profile, paginated.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |
| `cursor` | string | ❌ (pagination) |
| `start` | int | ❌ (default: 0) |

---

### GET `/api/v1/posts/info`
Single post details.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |

Returns: `text, author, postedAt, likesCount, commentsCount, sharesCount, mediaURL`

---

### GET `/api/v1/posts/comments`
Comments on a post, paginated.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |
| `start` | int | ❌ |
| `count` | int | ❌ (default: 10) |
| `cursor` | string | ❌ |

---

### GET `/api/v1/posts/likes`
Likes/reactions on a post.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |
| `start` | int | ❌ (default: 0) |

---

## COMMENTS ENDPOINTS

### GET `/api/v1/comments/all`
All comments made by a LinkedIn profile, paginated.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |
| `cursor` | string | ❌ |

---

### GET `/api/v1/comments/likes`
Likes on specific comments by URN(s).

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ (comma-separated URNs) |
| `start` | int | ❌ (default: 0) |

---

## ARTICLES ENDPOINTS

### GET `/api/v1/articles/all`
All LinkedIn articles published by a profile, paginated.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ |
| `start` | int | ❌ (default: 0) |

---

### GET `/api/v1/articles/article/info`
Article details from a full LinkedIn article URL.

| Param | Type | Required |
|---|---|---|
| `url` | string | ✅ (full URL e.g. `https://www.linkedin.com/pulse/...`) |

---

### GET `/api/v1/articles/article/reactions`
Reactions on a LinkedIn article.

| Param | Type | Required |
|---|---|---|
| `urn` | string | ✅ (article/thread URN from article/info) |
| `start` | int | ❌ (default: 0) |

---

## LOOKUP ENDPOINTS

### GET `/api/v1/geos/name-lookup`
Search locations — get `geoUrn` IDs for people/company search filters.

| Param | Type | Required |
|---|---|---|
| `query` | string | ✅ (e.g. `San Francisco`) |

---

### GET `/api/v1/g/title-skills-lookup`
Search for job title and skill IDs for advanced search.

| Param | Type | Required |
|---|---|---|
| `query` | string | ✅ |

---

### GET `/api/v1/g/services-lookup`
Search service category IDs.

| Param | Type | Required |
|---|---|---|
| `query` | string | ✅ |

---

## SERVICES ENDPOINTS

### GET `/api/v1/services/service/details`
LinkedIn service page details by vanity name.

| Param | Type | Required |
|---|---|---|
| `vanityname` | string | ✅ |

---

### GET `/api/v1/services/service/similar`
Similar LinkedIn services by vanity name.

| Param | Type | Required |
|---|---|---|
| `vanityname` | string | ✅ |

---

## SYSTEM

### GET `status/`
API health check. No authentication required.

```bash
curl -s "https://linkdapi.com/status/"
```

---

## Response Envelope

```json
{
  "success": true,
  "statusCode": 200,
  "message": "Data retrieved successfully",
  "errors": null,
  "data": { "..." }
}
```

Error:
```json
{
  "success": false,
  "statusCode": 404,
  "message": "Profile not found",
  "errors": "...",
  "data": null
}
```

---

## SDK Usage

### Python (pip install linkdapi)

```python
from linkdapi import LinkdAPI, AsyncLinkdAPI

# Sync
client = LinkdAPI("YOUR_KEY")
profile = client.get_profile_overview("ryanroslansky")

# Async (40x faster for batch)
import asyncio
async with AsyncLinkdAPI("YOUR_KEY") as api:
    urn_data = await api.get_profile_urn("ryanroslansky")
    urn = urn_data['data']['urn']
    overview, experience, skills = await asyncio.gather(
        api.get_profile_overview("ryanroslansky"),
        api.get_full_experience(urn),
        api.get_skills(urn),
    )
```

### Node.js (npm install linkdapi) — requires Node 18+

```js
import { LinkdAPI } from 'linkdapi';
const api = new LinkdAPI({ [REDACTED_SECRET]' });

const overview = await api.getProfileOverview('ryanroslansky');
const company = await api.getCompanyInfo({ name: 'google' });

// Batch concurrent
const [employees, similar, jobs] = await Promise.all([
  api.getCompanyEmployeesData(companyId),
  api.getSimilarCompanies(companyId),
  api.getCompanyJobs([companyId]),
]);
```

---

## Rate Limits & Credits

- Free tier: **100 credits** on signup (https://linkdapi.com/?p=signup)
- Most endpoints: **1 credit** per call
- `profile/full`: higher cost (multiple endpoints in one)
- HTTP `429` → wait and retry with exponential backoff
- Retry config in Python SDK: `max_retries=3, retry_delay=1.0` (exponential)

---

*Python SDK: https://github.com/linkdAPI/linkdapi-SDK*  
*Node SDK: https://github.com/linkdAPI/linkdapi-node-sdk*  
*Go SDK: https://github.com/linkdAPI/linkdapi-go-sdk*  
*Docs: https://linkdapi.com/docs*  
*API Spec: https://linkdapi.com/apispec.yml*


path: references/skills.json
content: {
  "skill": {
    "name": "linkdapi",
    "version": "1.0.0",
    "description": "LinkedIn professional data API — profile enrichment, company research, people/jobs/posts search, B2B intelligence",
    "source": "https://linkdapi.com/apispec.yml",
    "tags": ["linkedin", "b2b", "lead-generation", "people-search", "company-research", "jobs", "professional-data"]
  },
  "api": {
    "baseUrl": "https://linkdapi.com",
    "authHeader": "X-linkdapi-apikey",
    "authEnv": "LINKDAPI_KEY",
    "note": "Header is X-linkdapi-apikey — NOT x-api-key",
    "responseEnvelope": {
      "success": "boolean",
      "statusCode": "integer",
      "message": "string",
      "errors": "string|null",
      "data": "object|array"
    }
  },
  "endpoints": {
    "profile": {
      "overview": {
        "method": "GET", "path": "api/v1/profile/overview",
        "params": { "username": { "type": "string", "required": true } },
        "note": "Returns urn field needed for all other profile endpoints"
      },
      "details": {
        "method": "GET", "path": "api/v1/profile/details",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "contactInfo": {
        "method": "GET", "path": "api/v1/profile/contact-info",
        "params": { "username": { "type": "string", "required": true } }
      },
      "about": {
        "method": "GET", "path": "api/v1/profile/about",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "full": {
        "method": "GET", "path": "api/v1/profile/full",
        "params": {
          "username": { "type": "string", "required": false },
          "urn": { "type": "string", "required": false, "note": "At least one required" }
        }
      },
      "fullExperience": {
        "method": "GET", "path": "api/v1/profile/full-experience",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "certifications": {
        "method": "GET", "path": "api/v1/profile/certifications",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "education": {
        "method": "GET", "path": "api/v1/profile/education",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "skills": {
        "method": "GET", "path": "api/v1/profile/skills",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "socialMatrix": {
        "method": "GET", "path": "api/v1/profile/social-matrix",
        "params": { "username": { "type": "string", "required": true } }
      },
      "recommendations": {
        "method": "GET", "path": "api/v1/profile/recommendations",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "similar": {
        "method": "GET", "path": "api/v1/profile/similar",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "reactions": {
        "method": "GET", "path": "api/v1/profile/reactions",
        "params": { "urn": { "type": "string", "required": true }, "cursor": { "type": "string", "required": false } }
      },
      "interests": {
        "method": "GET", "path": "api/v1/profile/interests",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "services": {
        "method": "GET", "path": "api/v1/profile/services",
        "params": { "urn": { "type": "string", "required": true } }
      },
      "usernameToUrn": {
        "method": "GET", "path": "api/v1/profile/username-to-urn",
        "params": { "username": { "type": "string", "required": true } }
      }
    },
    "companies": {
      "note": "Base path is /api/v1/companies/ (plural). Company ID param is 'id', not 'company_id'.",
      "nameLookup": {
        "method": "GET", "path": "api/v1/companies/name-lookup",
        "params": { "query": { "type": "string", "required": true } }
      },
      "info": {
        "method": "GET", "path": "api/v1/companies/company/info",
        "params": {
          "id": { "type": "string", "required": false, "note": "Company numeric ID" },
          "name": { "type": "string", "required": false, "note": "At least one of id or name required" }
        }
      },
      "infoV2": {
        "method": "GET", "path": "api/v1/companies/company/info-v2",
        "params": { "id": { "type": "string", "required": true } },
        "note": "Returns extended info: peopleAlsoFollow, affiliatedByJobs, etc."
      },
      "similar": {
        "method": "GET", "path": "api/v1/companies/company/similar",
        "params": { "id": { "type": "string", "required": true } }
      },
      "employeesData": {
        "method": "GET", "path": "api/v1/companies/company/employees-data",
        "params": { "id": { "type": "string", "required": true } }
      },
      "affiliatedPages": {
        "method": "GET", "path": "api/v1/companies/company/affiliated-pages",
        "params": { "id": { "type": "string", "required": true } }
      },
      "posts": {
        "method": "GET", "path": "api/v1/companies/company/posts",
        "params": {
          "id": { "type": "string", "required": true },
          "start": { "type": "integer", "required": false, "default": 0 }
        }
      },
      "universalNameToId": {
        "method": "GET", "path": "api/v1/companies/company/universal-name-to-id",
        "params": { "universalName": { "type": "string", "required": true } }
      },
      "jobs": {
        "method": "GET", "path": "api/v1/companies/jobs",
        "params": {
          "companyIDs": { "type": "string", "required": true, "note": "Comma-separated company IDs" },
          "start": { "type": "integer", "required": false, "default": 0 }
        }
      }
    },
    "jobs": {
      "search": {
        "method": "GET", "path": "api/v1/jobs/search",
        "note": "V1 — simpler, use for basic keyword+location queries",
        "params": {
          "keyword": { "type": "string" },
          "location": { "type": "string" },
          "geoId": { "type": "string" },
          "companyIds": { "type": "string" },
          "jobTypes": { "type": "string", "enum": ["full_time", "part_time", "contract", "temporary", "internship", "volunteer"] },
          "experience": { "type": "string", "enum": ["internship", "entry_level", "associate", "mid_senior", "director"] },
          "regions": { "type": "string" },
          "timePosted": { "type": "string", "enum": ["any", "24h", "1week", "1month"], "default": "any" },
          "salary": { "type": "string", "enum": ["any", "40k", "60k", "80k", "100k", "120k"] },
          "workArrangement": { "type": "string", "enum": ["onsite", "remote", "hybrid"] },
          "start": { "type": "integer", "default": 0 }
        }
      },
      "details": {
        "method": "GET", "path": "api/v1/jobs/job/details",
        "params": { "jobId": { "type": "string", "required": true } },
        "note": "Open jobs only"
      },
      "detailsV2": {
        "method": "GET", "path": "api/v1/jobs/job/details-v2",
        "params": { "jobId": { "type": "string", "required": true } },
        "note": "All job statuses (open, closed, expired)"
      },
      "similar": {
        "method": "GET", "path": "api/v1/jobs/job/similar",
        "params": { "jobId": { "type": "string", "required": true } }
      },
      "peopleAlsoViewed": {
        "method": "GET", "path": "api/v1/jobs/job/people-also-viewed",
        "params": { "jobId": { "type": "string", "required": true } }
      },
      "hiringTeam": {
        "method": "GET", "path": "api/v1/jobs/job/hiring-team",
        "params": {
          "jobId": { "type": "string", "required": true },
          "start": { "type": "integer", "required": false, "default": 0 }
        }
      },
      "postedByProfile": {
        "method": "GET", "path": "api/v1/jobs/posted-by-profile",
        "params": {
          "profileUrn": { "type": "string", "required": true },
          "start": { "type": "integer", "required": false, "default": 0 },
          "count": { "type": "integer", "required": false, "default": 25 }
        }
      }
    },
    "search": {
      "jobs_v2": {
        "method": "GET", "path": "api/v1/search/jobs",
        "note": "V2 — comprehensive filters. Prefer over jobs/search for complex queries",
        "params": {
          "keyword": { "type": "string" },
          "start": { "type": "integer", "default": 0 },
          "count": { "type": "integer", "max": 50, "default": 25 },
          "sortBy": { "type": "string", "enum": ["relevance", "date_posted"] },
          "datePosted": { "type": "string", "enum": ["24h", "1week", "1month"] },
          "experience": { "type": "string", "enum": ["internship", "entry_level", "associate", "mid_senior", "director", "executive"] },
          "jobTypes": { "type": "string", "enum": ["full_time", "part_time", "contract", "temporary", "internship", "volunteer", "other"] },
          "workplaceTypes": { "type": "string", "enum": ["onsite", "remote", "hybrid"] },
          "salary": { "type": "string", "enum": ["20k", "30k", "40k", "50k", "60k", "70k", "80k", "90k", "100k"] },
          "companies": { "type": "string", "note": "Comma-separated company IDs" },
          "industries": { "type": "string" },
          "locations": { "type": "string", "note": "LinkedIn geo IDs comma-separated" },
          "functions": { "type": "string", "example": "it,sales,eng" },
          "titles": { "type": "string" },
          "Benefits": { "type": "string", "enum": ["medical_ins", "dental_ins", "vision_ins", "401k", "pension", "paid_maternity", "paid_paternity", "commuter", "student_loan", "tuition", "disability_ins"] },
          "commitments": { "type": "string", "enum": ["dei", "environmental", "work_life", "social_impact", "career_growth"] },
          "easyApply": { "type": "boolean" },
          "verifiedJob": { "type": "boolean" },
          "under10Applicants": { "type": "boolean" },
          "fairChance": { "type": "boolean" }
        }
      },
      "people": {
        "method": "GET", "path": "api/v1/search/people",
        "params": {
          "keyword": { "type": "string" },
          "start": { "type": "integer", "default": 0 },
          "count": { "type": "integer", "max": 50, "default": 20 },
          "firstName": { "type": "string" },
          "lastName": { "type": "string" },
          "title": { "type": "string" },
          "currentCompany": { "type": "string", "note": "Company ID(s) comma-separated" },
          "pastCompany": { "type": "string" },
          "geoUrn": { "type": "string", "note": "From geos/name-lookup" },
          "industry": { "type": "string" },
          "school": { "type": "string" },
          "profileLanguage": { "type": "string", "example": "en" },
          "serviceCategory": { "type": "string" }
        }
      },
      "companies": {
        "method": "GET", "path": "api/v1/search/companies",
        "params": {
          "keyword": { "type": "string" },
          "start": { "type": "integer", "default": 0 },
          "count": { "type": "integer", "max": 50, "default": 25 },
          "geoUrn": { "type": "string" },
          "companySize": { "type": "string", "enum": ["1-10", "11-50", "51-200", "201-500", "501-1000", "1001-5000", "5001-10000", "10001+"] },
          "hasJobs": { "type": "boolean" },
          "industry": { "type": "string" }
        }
      },
      "posts": {
        "method": "GET", "path": "api/v1/search/posts",
        "params": {
          "keyword": { "type": "string" },
          "start": { "type": "integer", "default": 10 },
          "sortBy": { "type": "string", "enum": ["relevance", "date_posted"], "default": "relevance" },
          "authorCompany": { "type": "string" },
          "authorIndustry": { "type": "string" },
          "authorJobTitle": { "type": "string" },
          "contentType": { "type": "string", "enum": ["videos", "photos", "jobs", "liveVideos", "documents", "collaborativeArticles"] },
          "datePosted": { "type": "string", "enum": ["past-24h", "past-week", "past-month", "past-year"] },
          "fromMember": { "type": "string", "note": "Profile URN" },
          "fromOrganization": { "type": "string", "note": "Company ID(s) comma-separated" },
          "mentionsMember": { "type": "string" },
          "mentionsOrganization": { "type": "string" }
        }
      },
      "services": {
        "method": "GET", "path": "api/v1/search/services",
        "params": {
          "keyword": { "type": "string" },
          "start": { "type": "integer", "default": 0 },
          "count": { "type": "integer", "max": 50, "default": 25 },
          "geoUrn": { "type": "string" },
          "profileLanguage": { "type": "string" },
          "serviceCategory": { "type": "string" }
        }
      },
      "schools": {
        "method": "GET", "path": "api/v1/search/schools",
        "params": {
          "keyword": { "type": "string" },
          "start": { "type": "integer", "default": 0 },
          "count": { "type": "integer", "max": 50, "default": 25 }
        }
      }
    },
    "posts": {
      "featured": { "method": "GET", "path": "api/v1/posts/featured", "params": { "urn": { "type": "string", "required": true } } },
      "all": {
        "method": "GET", "path": "api/v1/posts/all",
        "params": { "urn": { "type": "string", "required": true }, "cursor": { "type": "string" }, "start": { "type": "integer", "default": 0 } }
      },
      "info": { "method": "GET", "path": "api/v1/posts/info", "params": { "urn": { "type": "string", "required": true } } },
      "comments": {
        "method": "GET", "path": "api/v1/posts/comments",
        "params": { "urn": { "type": "string", "required": true }, "start": { "type": "integer", "default": 0 }, "count": { "type": "integer", "default": 10 }, "cursor": { "type": "string" } }
      },
      "likes": {
        "method": "GET", "path": "api/v1/posts/likes",
        "params": { "urn": { "type": "string", "required": true }, "start": { "type": "integer", "default": 0 } }
      }
    },
    "comments": {
      "all": {
        "method": "GET", "path": "api/v1/comments/all",
        "params": { "urn": { "type": "string", "required": true }, "cursor": { "type": "string" } }
      },
      "likes": {
        "method": "GET", "path": "api/v1/comments/likes",
        "params": { "urn": { "type": "string", "required": true, "note": "Comma-separated URNs" }, "start": { "type": "integer", "default": 0 } }
      }
    },
    "articles": {
      "all": {
        "method": "GET", "path": "api/v1/articles/all",
        "params": { "urn": { "type": "string", "required": true }, "start": { "type": "integer", "default": 0 } }
      },
      "info": {
        "method": "GET", "path": "api/v1/articles/article/info",
        "params": { "url": { "type": "string", "required": true, "note": "Full LinkedIn article URL" } }
      },
      "reactions": {
        "method": "GET", "path": "api/v1/articles/article/reactions",
        "params": { "urn": { "type": "string", "required": true }, "start": { "type": "integer", "default": 0 } }
      }
    },
    "lookups": {
      "geoNameLookup": {
        "method": "GET", "path": "api/v1/geos/name-lookup",
        "params": { "query": { "type": "string", "required": true } },
        "note": "Returns geoUrn values to use in search filters"
      },
      "titleSkillsLookup": {
        "method": "GET", "path": "api/v1/g/title-skills-lookup",
        "params": { "query": { "type": "string", "required": true } }
      },
      "servicesLookup": {
        "method": "GET", "path": "api/v1/g/services-lookup",
        "params": { "query": { "type": "string", "required": true } }
      }
    },
    "services": {
      "details": {
        "method": "GET", "path": "api/v1/services/service/details",
        "params": { "vanityname": { "type": "string", "required": true } }
      },
      "similar": {
        "method": "GET", "path": "api/v1/services/service/similar",
        "params": { "vanityname": { "type": "string", "required": true } }
      }
    },
    "system": {
      "status": { "method": "GET", "path": "status/", "note": "No auth required" }
    }
  },
  "openclaw": {
    "install": {
      "path": "~/.openclaw/skills/linkdapi/",
      "files": ["SKILL.md", "api-ref.md", "skills.json"],
      "commands": [
        "mkdir -p ~/.openclaw/skills/linkdapi",
        "cp SKILL.md api-ref.md skills.json ~/.openclaw/skills/linkdapi/"
      ]
    },
    "openclaw_json_snippet": {
      "skills": {
        "entries": {
          "linkdapi": {
            "env": {
              "LINKDAPI_KEY": "YOUR_LINKDAPI_KEY_HERE"
            }
          }
        }
      }
    }
  }
}


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)