General-purpose LinkedIn automation – fetch profiles, search people and companies, send messages, manage connections, create posts, and more. Use when the user wants to interact with LinkedIn.
git clone https://github.com/Linked-API/linkedin-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/Linked-API/linkedin-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/linkedin" ~/.claude/skills/linked-api-linkedin-skills-linkedin && rm -rf "$T"
linkedin/SKILL.mdLinkedIn Skill
You have access to
linkedin – a CLI tool for LinkedIn automation. Use it to fetch profiles, search people and companies, send messages, manage connections, create posts, react, comment, and more.
Each command sends a request to Linked API, which runs a real cloud browser to perform the action on LinkedIn. Operations are not instant – expect 30 seconds to several minutes depending on complexity.
If
linkedin is not available, install it:
npm install -g @linkedapi/linkedin-cli
Authentication
If a command fails with exit code 2 (authentication error), ask the user to set up their account:
- Go to app.linkedapi.io and sign up or log in
- Connect their LinkedIn account
- Copy the Linked API Token and Identification Token from the dashboard
Once the user provides the tokens, run:
linkedin setup --linked-api-token=TOKEN --identification-token=TOKEN
Global Flags
Always use
--json and -q for machine-readable output:
linkedin <command> --json -q
| Flag | Description |
|---|---|
| Structured JSON output |
/ | Suppress stderr progress messages |
| Select specific fields in output |
| Disable colors |
| Use a specific account for this command |
Output Format
Success:
{"success": true, "data": {"name": "John Doe", "headline": "Engineer"}}
Error:
{"success": false, "error": {"type": "personNotFound", "message": "Person not found"}}
Exit code 0 means the API call succeeded – always check the
success field for the action outcome. Non-zero exit codes indicate infrastructure errors:
| Exit Code | Meaning |
|---|---|
| 0 | Success (check field – action may have returned an error like "person not found") |
| 1 | General/unexpected error |
| 2 | Missing or invalid tokens |
| 3 | Subscription/plan required |
| 4 | LinkedIn account issue |
| 5 | Invalid arguments |
| 6 | Rate limited |
| 7 | Network error |
| 8 | Workflow timeout (workflowId returned for recovery) |
Commands
Fetch a Person Profile
linkedin person fetch <url> [flags] --json -q
Optional flags to include additional data:
– work history--experience
– education history--education
– skills list--skills
– languages--languages
– recent posts (with--posts
,--posts-limit N
)--posts-since TIMESTAMP
– recent comments (with--comments
,--comments-limit N
)--comments-since TIMESTAMP
– recent reactions (with--reactions
,--reactions-limit N
)--reactions-since TIMESTAMP
Only request additional data when needed – each flag increases execution time.
# Basic profile linkedin person fetch https://www.linkedin.com/in/username --json -q # With experience and education linkedin person fetch https://www.linkedin.com/in/username --experience --education --json -q # With last 5 posts linkedin person fetch https://www.linkedin.com/in/username --posts --posts-limit 5 --json -q
Search People
linkedin person search [flags] --json -q
| Flag | Description |
|---|---|
| Search keyword or phrase |
| Max results |
| Filter by first name |
| Filter by last name |
| Filter by job position |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated current company names |
| Comma-separated previous company names |
| Comma-separated school names |
linkedin person search --term "product manager" --locations "San Francisco" --json -q linkedin person search --current-companies "Google" --position "Engineer" --limit 20 --json -q
Fetch a Company
linkedin company fetch <url> [flags] --json -q
Optional flags:
– include employees--employees
– include decision makers--dms
– include company posts--posts
Employee filters (require
--employees):
| Flag | Description |
|---|---|
| Max employees to retrieve |
| Filter by first name |
| Filter by last name |
| Filter by position |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated school names |
| Flag | Description |
|---|---|
| Max decision makers to retrieve (requires ) |
| Max posts to retrieve (requires ) |
| Posts since ISO timestamp (requires ) |
# Basic company info linkedin company fetch https://www.linkedin.com/company/name --json -q # With employees filtered by position linkedin company fetch https://www.linkedin.com/company/name --employees --employees-position "Engineer" --json -q # With decision makers and posts linkedin company fetch https://www.linkedin.com/company/name --dms --posts --posts-limit 10 --json -q
Search Companies
linkedin company search [flags] --json -q
| Flag | Description |
|---|---|
| Search keyword |
| Max results |
| Comma-separated sizes: , , , , , , , |
| Comma-separated locations |
| Comma-separated industries |
linkedin company search --term "fintech" --sizes "11-50,51-200" --json -q
Send a Message
linkedin message send <person-url> '<text>' --json -q
Text up to 1900 characters. Wrap the message in single quotes to avoid shell interpretation issues.
linkedin message send https://www.linkedin.com/in/username 'Hey, loved your latest post!' --json -q
Get Conversation
linkedin message get <person-url> [--since TIMESTAMP] --json -q
The first call for a conversation triggers a background sync and may take longer. Subsequent calls are faster.
linkedin message get https://www.linkedin.com/in/username --json -q linkedin message get https://www.linkedin.com/in/username --since 2024-01-15T10:30:00Z --json -q
Connection Management
Check connection status
linkedin connection status <url> --json -q
Send connection request
linkedin connection send <url> [--note 'text'] [--email user@example.com] --json -q
List connections
linkedin connection list [flags] --json -q
| Flag | Description |
|---|---|
| Max connections to return |
| Only connections made since ISO timestamp (only works when no filter flags are used) |
| Filter by first name |
| Filter by last name |
| Filter by job position |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated current company names |
| Comma-separated previous company names |
| Comma-separated school names |
linkedin connection list --limit 50 --json -q linkedin connection list --current-companies "Google" --position "Engineer" --json -q linkedin connection list --since 2024-01-01T00:00:00Z --json -q
List pending outgoing requests
linkedin connection pending --json -q
Withdraw a pending request
linkedin connection withdraw <url> [--no-unfollow] --json -q
By default, withdrawing also unfollows the person. Use
--no-unfollow to keep following.
Remove a connection
linkedin connection remove <url> --json -q
Posts
Fetch a post
linkedin post fetch <url> [flags] --json -q
| Flag | Description |
|---|---|
| Include comments |
| Include reactions |
| Max comments to retrieve (requires ) |
| Sort order: or (requires ) |
| Include replies to comments (requires ) |
| Max reactions to retrieve (requires ) |
linkedin post fetch https://www.linkedin.com/posts/username_activity-123 --json -q # With comments sorted by most recent, including replies linkedin post fetch https://www.linkedin.com/posts/username_activity-123 \ --comments --comments-sort mostRecent --comments-replies --json -q
Create a post
linkedin post create '<text>' [flags] --json -q
| Flag | Description |
|---|---|
| Post on behalf of a company page (requires admin access) |
| Attachment as or . Types: , , . Can be specified multiple times. |
Attachment limits: up to 9 images, or 1 video, or 1 document. Cannot mix types.
linkedin post create 'Excited to share our latest update!' --json -q # With a document linkedin post create 'Our Q4 report' \ --attachments "https://example.com/report.pdf:document:Q4 Report" --json -q # Post as a company linkedin post create 'Company announcement' \ --company-url https://www.linkedin.com/company/name --json -q
React to a post
linkedin post react <url> --type <reaction> [--company-url <url>] --json -q
Reaction types:
like, love, support, celebrate, insightful, funny.
linkedin post react https://www.linkedin.com/posts/username_activity-123 --type like --json -q # React on behalf of a company linkedin post react https://www.linkedin.com/posts/username_activity-123 --type celebrate \ --company-url https://www.linkedin.com/company/name --json -q
Comment on a post
linkedin post comment <url> '<text>' [--company-url <url>] --json -q
Text up to 1000 characters.
linkedin post comment https://www.linkedin.com/posts/username_activity-123 'Great insights!' --json -q # Comment on behalf of a company linkedin post comment https://www.linkedin.com/posts/username_activity-123 'Well said!' \ --company-url https://www.linkedin.com/company/name --json -q
Statistics
# Social Selling Index linkedin stats ssi --json -q # Performance analytics (profile views, post impressions, search appearances) linkedin stats performance --json -q # API usage for a date range linkedin stats usage --start 2024-01-01T00:00:00Z --end 2024-01-31T00:00:00Z --json -q
Sales Navigator
Requires a LinkedIn Sales Navigator subscription. Uses hashed URLs for person/company lookups.
Fetch person
linkedin navigator person fetch <hashed-url> --json -q
Search people
linkedin navigator person search [flags] --json -q
| Flag | Description |
|---|---|
| Search keyword or phrase |
| Max results |
| Filter by first name |
| Filter by last name |
| Filter by job position |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated current company names |
| Comma-separated previous company names |
| Comma-separated school names |
| Comma-separated ranges: , , , , |
linkedin navigator person search --term "VP Marketing" --locations "United States" --json -q linkedin navigator person search --years-of-experience "moreThanTen" --position "CEO" --json -q
Fetch company
linkedin navigator company fetch <hashed-url> [flags] --json -q
Optional flags:
– include employees--employees
– include decision makers--dms
Employee filters (require
--employees):
| Flag | Description |
|---|---|
| Max employees to retrieve |
| Filter by first name |
| Filter by last name |
| Comma-separated positions |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated school names |
| Comma-separated experience ranges |
| Max decision makers to retrieve (requires ) |
linkedin navigator company fetch https://www.linkedin.com/sales/company/97ural --employees --dms --json -q linkedin navigator company fetch https://www.linkedin.com/sales/company/97ural \ --employees --employees-positions "Engineer,Designer" --employees-locations "Europe" --json -q
Search companies
linkedin navigator company search [flags] --json -q
| Flag | Description |
|---|---|
| Search keyword |
| Max results |
| Comma-separated sizes: , , , , , , , |
| Comma-separated locations |
| Comma-separated industries |
| Min annual revenue in M USD: , , , , , , , , , , |
| Max annual revenue in M USD: , , , , , , , , , , |
linkedin navigator company search --term "fintech" --sizes "11-50,51-200" --json -q linkedin navigator company search --revenue-min 10 --revenue-max 100 --locations "United States" --json -q
Send InMail
linkedin navigator message send <person-url> '<text>' --subject '<subject>' --json -q
Text up to 1900 characters. Subject up to 80 characters.
linkedin navigator message send https://www.linkedin.com/in/username \ 'Would love to chat about API integrations' --subject 'Partnership Opportunity' --json -q
Get Sales Navigator conversation
linkedin navigator message get <person-url> [--since TIMESTAMP] --json -q
Custom Workflows
Execute a custom workflow definition from a file, stdin, or inline:
# From file linkedin workflow run --file workflow.json --json -q # From stdin cat workflow.json | linkedin workflow run --json -q # Inline echo '{"actions":[...]}' | linkedin workflow run --json -q
Check workflow status or wait for completion:
linkedin workflow status <id> --json -q linkedin workflow status <id> --wait --json -q
See Building Workflows for the workflow JSON schema.
Account Management
linkedin account list # List accounts (* = active) linkedin account switch "Name" # Switch active account linkedin account rename "Name" --name "New Name" # Rename account linkedin reset # Remove active account linkedin reset --all # Remove all accounts
Important Behavior
- Sequential execution. All operations for an account run one at a time. Multiple requests queue up.
- Not instant. A real browser navigates LinkedIn – expect 30 seconds to several minutes per operation.
- Timestamps in UTC. All dates and times are in UTC.
- Single quotes for text arguments. Use single quotes around message text, post text, and comments to avoid shell interpretation issues with special characters.
- Action limits. Per-account limits are configurable on the platform. A
error means the limit was reached.limitExceeded - URL normalization. All LinkedIn URLs in responses are normalized to
format without trailing slashes.https://www.linkedin.com/... - Null fields. Fields that are unavailable are returned as
ornull
, not omitted.[]