LinkedIn API
Fetch LinkedIn data in bulk: profiles, jobs, posts, and search results. Most endpoints return data immediately (no async task).
Bulk
api_key (legacy)
limit_per_input
v1
Stable
api_key in query is supported for legacy integrations. For new integrations, prefer Authorization: Bearer <token> when available on your account.
Auth
Legacy: api_key in query string.
Prefer Bearer auth when enabled on your account.
Batching
Use limit_per_input to control how many results are returned per input item
(when supported by the endpoint).
Input format
Most endpoints accept {"items": [...]}.
Some accept [{ "url": "..." }] (see Posts).
Use cases
Common automations to pull LinkedIn data and push it into your outbound stack.
Make
Scheduled enrichment: profiles/jobs/posts β Sheets/Airtable/CRM.
Flow
- 1) Scheduler
- 2) HTTP (POST) to a LinkedIn endpoint
- 3) Parse JSON
- 4) Map fields β destination
Zapier
Trigger-based enrichment: new lead β fetch profile/post β append data to CRM.
Flow
- 1) Trigger (form/CRM row)
- 2) Webhooks by Zapier (POST)
- 3) Formatter / Code step (optional)
- 4) Create/Update in destination
Clay
Bulk enrichment inside Clay tables: profile URLs β structured rows.
Flow
- 1) Import URLs into Clay
- 2) Add API enrichment step
- 3) Map response β columns
- 4) Push to sequences/export
Group
Actions
Run LinkedIn actions via API: send invites, messages, and engage with posts. Use responsibly to avoid account restrictions.
rate limits apply
requires active session
v1
Operational
Actions require a valid LinkedIn session (usually via the Chrome extension).
Keep volumes low and add delays between requests.
POST
LinkedIn Action
/api/v1/linkedin/action
One endpoint, multiple action types. Choose action by type.
Request
| Part | Field | Type | Notes |
|---|---|---|---|
| Query | api_key | string | Required (legacy) |
| Body | type | string | invite | message | like | comment |
| Body | payload | object | Depends on type |
Response
{
"ok": true,
"type": "invite",
"result": { "...": "..." }
}
Exact fields depend on LinkedIn response and availability.
Safety defaults
Recommended automation limits:
- Invites: 10β30/day
- Messages: 20β60/day (depending on account)
- Likes/Comments: keep natural, add delays
- Always add sleep 10β60s between actions
POST
Invite
type: invite
Send a connection invite to a profile.
Body example
{
"type": "invite",
"payload": {
"profile_url": "https://www.linkedin.com/in/username/",
"message": "Hey! Quick question about your role at {company} β can I connect?"
}
}
Notes
Keep invite notes short. If no message needed, omit message.
POST
Message
type: message
Send a message to an existing connection (or thread, if supported by your setup).
Body example
{
"type": "message",
"payload": {
"profile_url": "https://www.linkedin.com/in/username/",
"text": "Hey {first_name} β saw your post about {topic}. Quick question: are you open toβ¦"
}
}
Notes
If messaging by thread is supported in your implementation, you can also accept a thread_id.
POST
Like
type: like
Like a LinkedIn post by URL.
Body example
{
"type": "like",
"payload": {
"post_url": "https://www.linkedin.com/posts/..."
}
}
Notes
Keep engagement natural. Combine with comment only occasionally.
POST
Comment
type: comment
Comment on a LinkedIn post by URL.
Body example
{
"type": "comment",
"payload": {
"post_url": "https://www.linkedin.com/posts/...",
"text": "This is solid β especially the point about {insight}. Curious: how do you measure {metric}?"
}
}
Notes
Avoid repetitive templates. Short, contextual comments perform best.
POST
Get Profile by LinkedIn URL
/linkedin/profile
supports
limit_per_input
Request
| Part | Field | Type | Notes |
|---|---|---|---|
| Query | api_key | string | Required (legacy) |
| Query | limit_per_input | number | Default: 10 |
| Body | items | string[] | LinkedIn profile URLs |
Body example
{
"items": [
"https://www.linkedin.com/in/satya-nadella",
"https://www.linkedin.com/in/williamhgates"
]
}
Response (example)
[
{
"input": { "url": "https://www.linkedin.com/in/sundarpichai" },
"id": "sundarpichai",
"name": "Sundar Pichai",
"city": "Mountain View, California, United States",
"country_code": "US",
"position": "CEO at Google",
"about": "..."
}
]
Response fields may vary depending on profile availability.
POST
Find Profile by Name
/linkedin/profile/name
supports
limit_per_input
Request
| Part | Field | Type | Notes |
|---|---|---|---|
| Query | api_key | string | Required (legacy) |
| Query | limit_per_input | number | Default: 10 |
| Body | items | object[] | first_name + last_name |
Body example
{
"items": [
{ "first_name": "Satya", "last_name": "Nadella" },
{ "first_name": "Bill", "last_name": "Gates" }
]
}
Response
[
{
"input": { "first_name": "Satya", "last_name": "Nadella" },
"results": [
{ "url": "https://www.linkedin.com/in/...", "name": "...", "title": "..." }
]
}
]
Names can be ambiguous. Prefer URLs for accuracy.
POST
Get Jobs by URL
/linkedin/job
Body example
{
"items": [
"https://www.linkedin.com/jobs/view/4085995998",
"https://www.linkedin.com/jobs/view/4096097717"
]
}
Notes
Returns structured job details for each URL.
POST
Search Jobs
/linkedin/job/keyword
supports
limit_per_input
Body example
{
"items": [
{
"location": "New York",
"keyword": "software engineer",
"country": "US",
"time_range": "Past month",
"company": "Microsoft"
}
]
}
Notes
Use limit_per_input to control how many jobs are returned per query object.
POST
Get Jobs by Search URL
/linkedin/job/url
supports
limit_per_input
Body example
{
"items": [
"https://www.linkedin.com/jobs/search?keywords=Software&location=New%20York",
"https://www.linkedin.com/jobs/microsoft-jobs-worldwide?f_C=1035"
]
}
Notes
Provide LinkedIn job search URLs as input.
POST
Get Posts
/linkedin/post
Body example
[
{ "url": "https://www.linkedin.com/posts/..." },
{ "url": "https://www.linkedin.com/posts/..." }
]
This endpoint expects an array of objects (not {"items": [...] }).
Notes
Returns structured post data (text, media, metadata) when available.
POST
Get Author's Articles
/linkedin/post/author
supports
limit_per_input
Body example
{
"items": [
"https://www.linkedin.com/today/author/satyanadella",
"https://www.linkedin.com/today/author/billgates"
]
}
Notes
Useful for monitoring thought leaders and saving content for outreach context.
POST
Get Profile Posts
/linkedin/post/profile
supports
limit_per_input
Body example
{
"items": [
{
"url": "https://www.linkedin.com/in/satyanadella",
"start_date": "2024-01-01T00:00:00.000Z",
"end_date": "2024-12-31T00:00:00.000Z"
}
]
}
Notes
Use date ranges to limit output and speed up processing.
POST
Get Company Posts
/linkedin/post/company
supports
limit_per_input
Body example
{
"items": [
"https://www.linkedin.com/company/microsoft",
"https://www.linkedin.com/company/apple"
]
}
Notes
Great for tracking hiring signals, announcements, and product updates.
POST
Get Post Likers
/list/search/create
Extract profiles from a LinkedIn post engagement list (likers), with optional enrichment fields.
Body example
{
"url": "https://www.linkedin.com/posts/.../",
"with_emails": true,
"max": 100,
"page": 1
}
Notes
Use page for pagination and max to limit results.
Group
Search URLs
Extract people from LinkedIn search URLs (useful for saved searches and quick exports).
POST
Get People by Search URL
/linkedin/search
Provide a LinkedIn people search URL and get back structured people results with optional enrichment fields.
Body example
{
"url": "https://www.linkedin.com/search/results/people/?keywords=sales-man",
"with_emails": true,
"max": 100,
"page": 1
}
Notes
Use page for pagination and max to limit results.
For best accuracy, use clean search URLs without extra tracking params.