LinkedIn data, ready when you are.
People, companies, posts, jobs, comments, reactions and ads from LinkedIn.
- See the price before every call
- Pay only for records that come back
- No subscription. Your balance never expires
What you can get.
- $0.004per recordTry it →
Profiles
Name, headline, company, skills and work history.
- $0.002per recordTry it →
Posts by a person
A person's latest posts, with likes and comments.
- $0.004per recordTry it →
Companies
Size, industry, HQ, followers and website.
- $0.004per recordTry it →
Search people
Find people by title, company, school or city.
- $0.004per recordTry it →
Search companies
Find companies by keyword, size and industry.
- $0.001per recordTry it →
Jobs
Open roles by title, city, salary and type.
- $0.002per recordTry it →
Search posts
Posts about any topic, brand or person.
- $0.002per recordTry it →
Comments on a post
Who commented on a post, and what they said.
- $0.002per recordTry it →
Comments by a person
Comments a person left across LinkedIn.
- $0.002per recordTry it →
Reactions on a post
Who reacted to a post, and how.
- $0.002per recordTry it →
Reactions by a person
What a person liked and reacted to.
- $0.002per recordTry it →
Ads by a company
A company's ads from the LinkedIn Ad Library.
What the data looks like.
| publicId | name | headline | companyName | location | followers | connections | isOpenToWork | isHiring | skills | urn | avatarUrl | isPremium | positions | details |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ananya-rao | Ananya Rao | Head of Marketing at Paylane | Paylane | Bengaluru, Karnataka, India | 8,421 | 500 | false | true |
| urn:li:fsd_profile:885327295 | https://img.linkedin.com/ananya-rao.jpg | false |
|
|
| marcus-lee | Marcus Lee | VP Sales, EMEA | B2B SaaS | Northfold | London, England, United Kingdom | 15,230 | 500 | false | false |
| urn:li:fsd_profile:302922555 | https://img.linkedin.com/marcus-lee.jpg | false |
|
|
| sofia-ortiz | Sofia Ortiz | Data Engineer · Python, dbt, Airflow | Kitebank | Austin, Texas, United States | 2,104 | 812 | true | false |
| urn:li:fsd_profile:438143361 | https://img.linkedin.com/sofia-ortiz.jpg | false |
|
|
For developers
API reference.
One endpoint, POST /v1/linkedin. Open an operation to see its fields.
Profilesprofiles
Profile cards for up to ten people, by /in/<slug> vanity handle (a full profile URL is accepted and reduced to its slug). `include.posts` adds each person's recent posts to the same answer.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | /in/<slug> handles or profile URLs. |
| fields | list of enum | What each card carries: "profile" is the card itself (always), "positions" adds the person's work history. Omit for the card alone.profile · positions |
| include | object | |
| include.posts | object | |
| include.posts.limit | integer · 1-50 | Recent posts to fetch per person, newest first; 1-50. |
Response fields, each row of data
| Field | Type |
|---|---|
| publicId | string |
| urn | string |
| name | string |
| firstName | string |
| lastName | string |
| headline | string |
| about | string |
| location | string |
| city | string |
| state | string |
| country | string |
| profileUrl | string |
| avatarUrl | string |
| coverUrl | string |
| followers | integer |
| connections | integer |
| isPremium | boolean |
| isOpenToWork | boolean |
| isHiring | boolean |
| isVerified | boolean |
| isCreator | boolean |
| isInfluencer | boolean |
| isOpenProfile | boolean |
| skills | list of string |
| companyName | string |
| positions | list of object |
| education | list of object |
| certifications | list of object |
| languages | list of object |
| projects | list of object |
| publications | list of object |
| courses | list of object |
| honors | list of object |
| volunteering | list of object |
| recommendations | list of object |
| causes | list of string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"profiles","subjects":["satyanadella"]}'Example response rows
[
{
"publicId": "ananya-rao",
"name": "Ananya Rao",
"headline": "Head of Marketing at Paylane",
"companyName": "Paylane",
"location": "Bengaluru, Karnataka, India",
"followers": 8421,
"connections": 500,
"isOpenToWork": false,
"isHiring": true,
"skills": [
"Growth marketing",
"B2B SaaS",
"Brand strategy"
],
"urn": "urn:li:fsd_profile:885327295",
"avatarUrl": "https://img.linkedin.com/ananya-rao.jpg",
"isPremium": false,
"positions": [
{
"companyName": "Paylane",
"title": "Head of Marketing",
"startedOn": "2019-01",
"isCurrent": true
}
],
"details": {}
},
{
"publicId": "marcus-lee",
"name": "Marcus Lee",
"headline": "VP Sales, EMEA | B2B SaaS",
"companyName": "Northfold",
"location": "London, England, United Kingdom",
"followers": 15230,
"connections": 500,
"isOpenToWork": false,
"isHiring": false,
"skills": [
"Enterprise sales",
"Negotiation",
"Team leadership"
],
"urn": "urn:li:fsd_profile:302922555",
"avatarUrl": "https://img.linkedin.com/marcus-lee.jpg",
"isPremium": false,
"positions": [
{
"companyName": "Northfold",
"title": "VP Sales",
"startedOn": "2020-02",
"isCurrent": true
}
],
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Posts by a personposts
A person's recent posts with engagement. (Company-page posts are not served yet. Asking today is declined with a reason, never guessed at.)
| Field | Type | Meaning |
|---|---|---|
| subject * | string · ≤400 chars | One /in/<slug> handle or profile URL. |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| urn | string |
| body | string |
| kind | string |
| postedAt | string |
| permalink | string |
| mediaUrl | string |
| mediaType | string |
| likes | integer |
| comments | integer |
| reposts | integer |
| author | object |
| mentions | list of object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"posts","subject":"satyanadella","limit":10}'Example response rows
[
{
"author": {
"handle": "ananya-rao",
"type": "person"
},
"body": "We cut onboarding from 14 days to 3. Here is what changed, step by step.",
"kind": "text",
"postedAt": "2026-10-14T09:12:00Z",
"likes": 1284,
"comments": 96,
"reposts": 41,
"urn": "urn:li:activity:2164259024",
"permalink": "https://www.linkedin.com/we-cut-onboarding-from-14-days-to-3-here-1000",
"mediaUrl": "https://www.linkedin.com/we-cut-onboarding-from-14-days-to-3-here-1000",
"details": {}
},
{
"author": {
"handle": "ananya-rao",
"type": "person"
},
"body": "We're hiring two product marketers in Bengaluru. DM me.",
"kind": "image",
"postedAt": "2026-10-08T06:40:00Z",
"likes": 412,
"comments": 58,
"reposts": 19,
"urn": "urn:li:activity:2872631718",
"permalink": "https://www.linkedin.com/we-re-hiring-two-product-marketers-in-be-1001",
"mediaUrl": "https://www.linkedin.com/we-re-hiring-two-product-marketers-in-be-1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Companiescompanies
Company pages for up to ten /company/<slug> handles or URLs.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | /company/<slug> handles or URLs. |
Response fields, each row of data
| Field | Type |
|---|---|
| universalName | string |
| urn | string |
| name | string |
| industry | string |
| sizeBucket | string |
| employeesCount | integer |
| followers | integer |
| website | string |
| linkedinUrl | string |
| hqLocation | string |
| hqStreet | string |
| hqCity | string |
| hqState | string |
| hqPostalCode | string |
| hqCountry | string |
| about | string |
| founded | integer |
| specialities | list of string |
| logoUrl | string |
| pageType | string |
| isVerified | boolean |
| isActive | boolean |
| jobsUrl | string |
| callToActionUrl | string |
| locations | list of object |
| employeesByLocation | list of object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"companies","subjects":["microsoft"]}'Example response rows
[
{
"universalName": "paylane",
"name": "Paylane",
"industry": "Financial Services",
"sizeBucket": "201-500",
"employeesCount": 342,
"followers": 48210,
"website": "https://paylane.example",
"hqLocation": "Bengaluru, Karnataka, India",
"founded": 2017,
"specialities": [
"Payments",
"Payouts",
"APIs"
],
"urn": "urn:li:fsd_company:70566685",
"logoUrl": "https://img.linkedin.com/paylane.jpg",
"details": {
"tagline": "Payments for every shop",
"employeesBySkill": [
{
"skill": "Sales",
"count": 120
},
{
"skill": "Python",
"count": 85
}
],
"employeesByFunction": [
{
"function": "Engineering",
"count": 210
}
]
}
},
{
"universalName": "northfold",
"name": "Northfold",
"industry": "Software Development",
"sizeBucket": "51-200",
"employeesCount": 128,
"followers": 15904,
"website": "https://northfold.example",
"hqLocation": "London, England, United Kingdom",
"founded": 2019,
"specialities": [
"Finance automation",
"Close management"
],
"urn": "urn:li:fsd_company:1275972461",
"logoUrl": "https://img.linkedin.com/northfold.jpg",
"details": {
"tagline": "Freight, simplified",
"employeesBySkill": [
{
"skill": "Sales",
"count": 90
},
{
"skill": "Python",
"count": 65
}
],
"employeesByFunction": [
{
"function": "Engineering",
"count": 160
}
]
}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Search peoplesearchPeople
People search. With `company`: that company's people, filtered (employees-of-X). Without it: a GLOBAL search. Give `query` (e.g. "fintech founder") and/or titles. Find founders/leadership via titles (free text: "Founder", "CEO") and/or seniority bands (cxo, owner_partner); functions and tenure narrow further.
| Field | Type | Meaning |
|---|---|---|
| company | string · ≤400 chars | A /company/<slug> handle or company URL: search only that company's people. Omit for a global search (then give query and/or titles). |
| query | string · ≤300 chars | |
| titles | list of string | Current job titles, free text ("Founder", "Head of Marketing"); any match. |
| pastTitles | list of string | Titles the person held before, free text. Global search only. |
| pastCompanies | list of string | Company names the person worked at before. Global search only. |
| schools | list of string | School or university names the person attended. Global search only. |
| locations | list of string | |
| industries | list of string | Leaf names or " > " paths. Validated against LinkedIn's 434-node taxonomy. |
| companySizes | list of enum | Headcount bands of the person's current employer: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. Global search only.1-10 · 11-50 · 51-200 · 201-500 · 501-1000 · 1001-5000 · 5001-10000 · 10001+ |
| seniority | list of enum | Seniority bands: cxo, owner_partner, vice_president, director, experienced_manager, entry_manager, strategic, senior, entry, in_training. Any match.in_training · entry · senior · strategic · entry_manager · experienced_manager · director · vice_president · cxo · owner_partner |
| functions | list of enum | Job functions: marketing, sales, engineering, finance, operations, product_management, human_resources … Any match.accounting · administrative · arts_and_design · business_development · community_and_social_services · consulting · education · engineering · entrepreneurship · finance · healthcare_services · human_resources · information_technology · legal · marketing · media_and_communication · military_and_protective_services · operations · product_management · program_and_project_management · purchasing · quality_assurance · real_estate · research · sales |
| yearsAtCompany | list of enum | Tenure at the current company, in bands: lt_1y, 1_2y, 3_5y, 6_10y, gt_10y.lt_1y · 1_2y · 3_5y · 6_10y · gt_10y |
| yearsOfExperience | list of enum | Total career length, the same bands as yearsAtCompany.lt_1y · 1_2y · 3_5y · 6_10y · gt_10y |
| recentlyChangedJobs | boolean | true: only people who started a new role recently. |
| recentlyPosted | boolean | true: only people who posted on LinkedIn recently. Global search only. |
| personNames | list of string | Person-name / current employer / HQ / language filters (global search honours all). |
| currentCompanies | list of string | Names of the person's current employer(s). Global search only. |
| companyHqLocations | list of string | Where the current employer is headquartered. Cities, regions or countries as written on LinkedIn ("Bengaluru", "United States"). |
| profileLanguages | list of string | Languages listed on the profile, by name ("English", "Hindi"). |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| publicId | string |
| urn | string |
| name | string |
| firstName | string |
| lastName | string |
| headline | string |
| about | string |
| location | string |
| city | string |
| state | string |
| country | string |
| profileUrl | string |
| avatarUrl | string |
| coverUrl | string |
| followers | integer |
| connections | integer |
| isPremium | boolean |
| isOpenToWork | boolean |
| isHiring | boolean |
| isVerified | boolean |
| isCreator | boolean |
| isInfluencer | boolean |
| isOpenProfile | boolean |
| skills | list of string |
| companyName | string |
| positions | list of object |
| education | list of object |
| certifications | list of object |
| languages | list of object |
| projects | list of object |
| publications | list of object |
| courses | list of object |
| honors | list of object |
| volunteering | list of object |
| recommendations | list of object |
| causes | list of string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"searchPeople","company":"stripe","titles":["Head of Data"],"limit":10}'Example response rows
[
{
"publicId": "priya-nair",
"name": "Priya Nair",
"headline": "Head of Marketing · Ledgerly",
"companyName": "Ledgerly",
"location": "Bengaluru, Karnataka, India",
"followers": 5120,
"connections": 500,
"isOpenToWork": false,
"isHiring": false,
"skills": [
"Demand generation",
"Fintech"
],
"urn": "urn:li:fsd_profile:1103731855",
"avatarUrl": "https://img.linkedin.com/priya-nair.jpg",
"isPremium": false,
"positions": [
{
"companyName": "Ledgerly",
"title": "Head of Marketing",
"startedOn": "2019-01",
"isCurrent": true
}
],
"details": {}
},
{
"publicId": "arjun-mehta",
"name": "Arjun Mehta",
"headline": "Marketing Director at Coinmint",
"companyName": "Coinmint",
"location": "Bengaluru, Karnataka, India",
"followers": 3380,
"connections": 500,
"isOpenToWork": false,
"isHiring": true,
"skills": [
"Performance marketing",
"Payments"
],
"urn": "urn:li:fsd_profile:1983785629",
"avatarUrl": "https://img.linkedin.com/arjun-mehta.jpg",
"isPremium": false,
"positions": [
{
"companyName": "Coinmint",
"title": "Marketing Director",
"startedOn": "2020-02",
"isCurrent": true
}
],
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Search companiessearchCompanies
Company search by keyword and structured filters.
| Field | Type | Meaning |
|---|---|---|
| query | string · ≤300 chars | |
| locations | list of string | |
| companySizes | list of enum | Headcount bands: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+; any match.1-10 · 11-50 · 51-200 · 201-500 · 501-1000 · 1001-5000 · 5001-10000 · 10001+ |
| industries | list of string | Industry names, leaf or " > " path, from LinkedIn's own taxonomy. |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| universalName | string |
| urn | string |
| name | string |
| industry | string |
| sizeBucket | string |
| employeesCount | integer |
| followers | integer |
| website | string |
| linkedinUrl | string |
| hqLocation | string |
| hqStreet | string |
| hqCity | string |
| hqState | string |
| hqPostalCode | string |
| hqCountry | string |
| about | string |
| founded | integer |
| specialities | list of string |
| logoUrl | string |
| pageType | string |
| isVerified | boolean |
| isActive | boolean |
| jobsUrl | string |
| callToActionUrl | string |
| locations | list of object |
| employeesByLocation | list of object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"searchCompanies","query":"fintech","locations":["London"],"limit":10}'Example response rows
[
{
"universalName": "ledgerly",
"name": "Ledgerly",
"industry": "Software Development",
"sizeBucket": "11-50",
"employeesCount": 38,
"followers": 4120,
"website": "https://ledgerly.example",
"hqLocation": "Berlin, Germany",
"founded": 2021,
"specialities": [
"Accounting software",
"SMBs"
],
"urn": "urn:li:fsd_company:4164023981",
"logoUrl": "https://img.linkedin.com/ledgerly.jpg",
"details": {
"tagline": "Payments for every shop"
}
},
{
"universalName": "coinmint",
"name": "Coinmint",
"industry": "Financial Services",
"sizeBucket": "51-200",
"employeesCount": 96,
"followers": 12800,
"website": "https://coinmint.example",
"hqLocation": "Berlin, Germany",
"founded": 2018,
"specialities": [
"Crypto custody"
],
"urn": "urn:li:fsd_company:1700968753",
"logoUrl": "https://img.linkedin.com/coinmint.jpg",
"details": {
"tagline": "Freight, simplified"
}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Jobsjobs
Job listings search: `query` is the job-title anchor, the rest narrow it.
| Field | Type | Meaning |
|---|---|---|
| query * | string · ≤300 chars | |
| locations | list of string | |
| companies | list of string | Hiring company names, as written on LinkedIn; any match. |
| industries | list of string | Industry names, leaf or " > " path, from LinkedIn's own taxonomy. |
| workplace | list of enum | remote · hybrid · onsite |
| employmentType | list of enum | full_time · part_time · contract · internship · temporary |
| experienceLevel | list of enum | Levels: internship, entry, associate, mid_senior, director, executive.internship · entry · associate · mid_senior · director · executive |
| postedWithin | enum | 1h · 1d · 7d · 30d |
| salaryMin | integer · 40-1000 | Thousands of USD a year, 40 and up; filtered in LinkedIn's $20k bands. |
| easyApply | boolean | true: only listings that take applications on LinkedIn itself. |
| under10Applicants | boolean | true: only listings with fewer than ten applicants so far. |
| sort | enum | Unset = the platform's default order.relevance · newest |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| jobId | string |
| title | string |
| companyName | string |
| location | string |
| city | string |
| state | string |
| country | string |
| employmentType | string |
| workplaceType | string |
| isRemoteAllowed | boolean |
| experienceLevel | string |
| industries | list of string |
| functions | list of string |
| salaryText | string |
| listedAt | string |
| expiresAt | string |
| applicants | integer |
| url | string |
| applyUrl | string |
| applicantTrackingSystem | string |
| description | string |
| descriptionHtml | string |
| companyUrn | string |
| companySlug | string |
| companyUrl | string |
| companyLogoUrl | string |
| companyWebsite | string |
| companyDescription | string |
| companyEmployees | integer |
| companyFollowers | integer |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"jobs","query":"data engineer","locations":["Berlin"],"postedWithin":"7d","limit":10}'Example response rows
[
{
"jobId": "4430707116",
"title": "Product Manager (Manufacturing) - Hybrid",
"companyName": "MacLean Power Systems",
"location": "Manteca, California, United States",
"employmentType": "full_time",
"listedAt": "2026-08-22T15:42:18+00:00",
"applyUrl": "https://jobs.dayforcehcm.com/en-US/mlp/CANDIDATEPORTAL/jobs/15691?src=LinkedIn",
"description": "MPS in Stockton, CA is seeking a talented Product Manager (Overhead High Voltage Switchgear). In this role you will be responsible for managing product portfolios, providing technical and commercial support to customers, and developing strategic and tactical plans encompassing the market and competitive analysis for our Stockton facility.\n\nThis role is Hybrid 3-2, and our facility is located in Stockton, CA.\n\nWhat You’ll Do\n\nOversee the implementation of technical product solutions for clients a",
"details": {}
},
{
"jobId": "4419567749",
"title": "Sr. Engineering and Product Manager",
"companyName": "Justrite Safety Group",
"location": "Broomfield, Colorado, United States",
"employmentType": "full_time",
"listedAt": "2026-08-22T15:22:45+00:00",
"applyUrl": "https://recruiting2.ultipro.com/JUS1001JUSTM/JobBoard/2d5c8dc9-71e2-46d7-aa3d-305883f6102b/OpportunityDetail?opportunityId=12d54091-fc20-4284-8485-92c704543815&source=LinkedIn",
"description": "About Justrite Safety Group\n\nAt Justrite Safety Group, we're more than just a collection of industrial safety companies; we're a dynamic organization dedicated to protecting people, property, and the planet. Our ever-growing portfolio of companies collaborates to deliver advanced industrial safety solutions that set the standard for excellence.\n\nAs our business continues to grow, we continue to look for top talent to join our team as we lead the charge in revolutionizing industrial safety, ensur",
"details": {}
}
]Rows from an earlier run. The rows show the most used fields; a live row carries every field in the table above.
Search postssearchPosts
Search LinkedIn POSTS by keyword. The content itself, not people or companies. `query` is the search ("layoffs fintech", a product name, a hashtag). Narrow by who is mentioned, the content type (videos, images, documents…), how recent, and sort by relevance or date.
| Field | Type | Meaning |
|---|---|---|
| query * | string · ≤300 chars | Words the posts must contain. Always needed, even with mentioning (a mention-only ask is refused, verified 2026-09-23): to list all that tags a company or person, use their name as the query. |
| mentioning | list of string | Only posts that tag these people or companies: /in/<slug> or /company/<slug> handles, or their URLs. |
| contentType | enum | What kind of post: videos, images, jobs, live_videos, documents, collaborative_articles. Omit or "all" for every kind.all · videos · images · jobs · live_videos · documents · collaborative_articles |
| postedWithin | enum | any · 1h · 1d · 7d · 30d · 3m · 6m · 1y |
| sort | enum | relevance · newest |
| includeReposts | boolean | true: reposts of other people's posts count as hits too. |
| includeQuotePosts | boolean | true: posts that quote another post count as hits too. |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| urn | string |
| body | string |
| kind | string |
| postedAt | string |
| permalink | string |
| mediaUrl | string |
| mediaType | string |
| likes | integer |
| comments | integer |
| reposts | integer |
| author | object |
| mentions | list of object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"searchPosts","query":"AI agents","postedWithin":"7d","limit":10}'Example response rows
[
{
"author": {
"handle": "marcus-lee",
"type": "person"
},
"body": "Layoffs in fintech this quarter: what I'm hearing from 40 sales leaders.",
"kind": "text",
"postedAt": "2026-10-15T08:00:00Z",
"likes": 3120,
"comments": 402,
"reposts": 210,
"urn": "urn:li:activity:31086471",
"permalink": "https://www.linkedin.com/layoffs-in-fintech-this-quarter-what-i-m-1000",
"mediaUrl": "https://www.linkedin.com/layoffs-in-fintech-this-quarter-what-i-m-1000",
"details": {}
},
{
"author": {
"handle": "leila-haddad",
"type": "person"
},
"body": "If you were part of the fintech layoffs, I'm sharing 25 open roles below.",
"kind": "text",
"postedAt": "2026-10-13T15:30:00Z",
"likes": 1840,
"comments": 233,
"reposts": 512,
"urn": "urn:li:activity:3331202746",
"permalink": "https://www.linkedin.com/if-you-were-part-of-the-fintech-layoffs--1001",
"mediaUrl": "https://www.linkedin.com/if-you-were-part-of-the-fintech-layoffs--1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Comments on a postpostComments
Comments on up to ten LinkedIn POSTS, by post URL. `includeReplies` pulls nested replies; `postedWithin` limits how far back to read.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Post URLs. |
| includeReplies | boolean | true: nested replies come back under their parent comment, not only top-level comments. |
| postedWithin | enum | any · 1d · 7d · 30d |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| commentId | string |
| commentUrl | string |
| postUrl | string |
| postUrn | string |
| commenterProfileId | string |
| commenterHandle | string |
| commenterName | string |
| commenterHeadline | string |
| commenterUrl | string |
| commenterAvatarUrl | string |
| commenterType | string |
| commenterFollowers | integer |
| isAuthor | boolean |
| edited | boolean |
| likes | integer |
| replies | integer |
| reactions | list of object |
| body | string |
| commentedAt | string |
| mentions | list of string |
| postAuthor | string |
| postAuthorHandle | string |
| postAuthorUrl | string |
| postAuthorHeadline | string |
| postAuthorAvatarUrl | string |
| postAuthorProfileId | string |
| postAuthorType | string |
| postText | string |
| postPostedAt | string |
| postMediaUrl | string |
| postLikes | integer |
| postComments | integer |
| postReposts | integer |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"postComments","subjects":["https://www.linkedin.com/posts/<post-id>"],"limit":25}'Example response rows
[
{
"commenterHandle": "priya-nair",
"commenterName": "Priya Nair",
"commenterHeadline": "Product Lead at Ledgerly",
"body": "This matches what we saw. Did churn move too?",
"likes": 34,
"replies": 3,
"commentedAt": "2026-10-14T10:02:00Z",
"postAuthor": "Ananya Rao",
"isAuthor": false,
"commentId": "3095264851",
"commentUrl": "https://www.linkedin.com/priya-nair-1000",
"postUrl": "https://www.linkedin.com/priya-nair-1000",
"postUrn": "urn:li:activity:1393902121",
"commenterProfileId": "3708772264",
"commenterUrl": "https://www.linkedin.com/priya-nair-1000",
"postAuthorUrl": "https://www.linkedin.com/priya-nair-1000",
"details": {}
},
{
"commenterHandle": "tom-becker",
"commenterName": "Tom Becker",
"commenterHeadline": "Founder, Brightdesk",
"body": "Saving this for our next planning week.",
"likes": 12,
"replies": 0,
"commentedAt": "2026-10-14T10:40:00Z",
"postAuthor": "Ananya Rao",
"isAuthor": false,
"commentId": "2364499118",
"commentUrl": "https://www.linkedin.com/tom-becker-1001",
"postUrl": "https://www.linkedin.com/tom-becker-1001",
"postUrn": "urn:li:activity:492950413",
"commenterProfileId": "1378818087",
"commenterUrl": "https://www.linkedin.com/tom-becker-1001",
"postAuthorUrl": "https://www.linkedin.com/tom-becker-1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Comments by a personprofileComments
A profile's OWN commenting activity. The comments up to ten people left across LinkedIn, by /in/<slug> handle, newest first.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | /in/<slug> handles or profile URLs. |
| postedWithin | enum | any · 1d · 7d · 30d |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| commentId | string |
| commentUrl | string |
| postUrl | string |
| postUrn | string |
| commenterProfileId | string |
| commenterHandle | string |
| commenterName | string |
| commenterHeadline | string |
| commenterUrl | string |
| commenterAvatarUrl | string |
| commenterType | string |
| commenterFollowers | integer |
| isAuthor | boolean |
| edited | boolean |
| likes | integer |
| replies | integer |
| reactions | list of object |
| body | string |
| commentedAt | string |
| mentions | list of string |
| postAuthor | string |
| postAuthorHandle | string |
| postAuthorUrl | string |
| postAuthorHeadline | string |
| postAuthorAvatarUrl | string |
| postAuthorProfileId | string |
| postAuthorType | string |
| postText | string |
| postPostedAt | string |
| postMediaUrl | string |
| postLikes | integer |
| postComments | integer |
| postReposts | integer |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"profileComments","subjects":["satyanadella"],"limit":25}'Example response rows
[
{
"commenterHandle": "marcus-lee",
"commenterName": "Marcus Lee",
"commenterHeadline": "VP Sales, EMEA | B2B SaaS",
"body": "Strong take. Discovery calls are where most deals are lost.",
"likes": 48,
"replies": 5,
"commentedAt": "2026-10-15T07:30:00Z",
"postAuthor": "Emma Novak",
"isAuthor": false,
"commentId": "3190665176",
"commentUrl": "https://www.linkedin.com/marcus-lee-1000",
"postUrl": "https://www.linkedin.com/marcus-lee-1000",
"postUrn": "urn:li:activity:1646120582",
"commenterProfileId": "1150986638",
"commenterUrl": "https://www.linkedin.com/marcus-lee-1000",
"postAuthorUrl": "https://www.linkedin.com/marcus-lee-1000",
"details": {}
},
{
"commenterHandle": "marcus-lee",
"commenterName": "Marcus Lee",
"commenterHeadline": "VP Sales, EMEA | B2B SaaS",
"body": "Congrats on the launch, team!",
"likes": 9,
"replies": 1,
"commentedAt": "2026-10-12T16:05:00Z",
"postAuthor": "Daniel Kim",
"isAuthor": false,
"commentId": "4239718143",
"commentUrl": "https://www.linkedin.com/marcus-lee-1001",
"postUrl": "https://www.linkedin.com/marcus-lee-1001",
"postUrn": "urn:li:activity:3776163747",
"commenterProfileId": "3190281601",
"commenterUrl": "https://www.linkedin.com/marcus-lee-1001",
"postAuthorUrl": "https://www.linkedin.com/marcus-lee-1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Reactions on a postpostReactions
Reactions on up to ten LinkedIn POSTS, by post URL. Who reacted and how. `reactionTypes` filters to specific reactions (Like, Celebrate…).
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Post URLs. |
| reactionTypes | list of enum | Keep only these reactions: like, celebrate, support, love, insightful, funny. Omit for all of them.like · celebrate · support · love · insightful · funny |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| reactorProfileId | string |
| reactorHandle | string |
| reactorName | string |
| reactorHeadline | string |
| reactorUrl | string |
| reactorAvatarUrl | string |
| reactorLocation | string |
| reactionType | string |
| postUrn | string |
| postUrl | string |
| postAuthor | string |
| postAuthorHandle | string |
| postAuthorUrl | string |
| postAuthorHeadline | string |
| postAuthorProfileId | string |
| postAuthorType | string |
| postText | string |
| postPostedAt | string |
| postMediaUrl | string |
| postLikes | integer |
| postComments | integer |
| postReposts | integer |
| reactedAt | string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"postReactions","subjects":["https://www.linkedin.com/posts/<post-id>"],"reactionTypes":["like"],"limit":25}'Example response rows
[
{
"reactorHandle": "priya-nair",
"reactorName": "Priya Nair",
"reactorHeadline": "Product Lead at Ledgerly",
"reactorLocation": "Mumbai, India",
"reactionType": "LIKE",
"postAuthor": "Ananya Rao",
"reactedAt": "2026-10-14T09:30:00Z",
"reactorProfileId": "4155200177",
"reactorUrl": "https://www.linkedin.com/priya-nair-1000",
"postUrn": "urn:li:activity:492783029",
"postUrl": "https://www.linkedin.com/priya-nair-1000",
"postAuthorUrl": "https://www.linkedin.com/priya-nair-1000",
"details": {}
},
{
"reactorHandle": "daniel-kim",
"reactorName": "Daniel Kim",
"reactorHeadline": "Engineering Manager at Kitebank",
"reactorLocation": "Seoul, South Korea",
"reactionType": "PRAISE",
"postAuthor": "Ananya Rao",
"reactedAt": "2026-10-14T09:41:00Z",
"reactorProfileId": "1968241913",
"reactorUrl": "https://www.linkedin.com/daniel-kim-1001",
"postUrn": "urn:li:activity:3363527946",
"postUrl": "https://www.linkedin.com/daniel-kim-1001",
"postAuthorUrl": "https://www.linkedin.com/daniel-kim-1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Reactions by a personprofileReactions
A profile's OWN reactions. What up to ten people reacted to across LinkedIn, by /in/<slug> handle, newest first.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | /in/<slug> handles or profile URLs. |
| postedWithin | enum | any · 1d · 7d · 30d |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| reactorProfileId | string |
| reactorHandle | string |
| reactorName | string |
| reactorHeadline | string |
| reactorUrl | string |
| reactorAvatarUrl | string |
| reactorLocation | string |
| reactionType | string |
| postUrn | string |
| postUrl | string |
| postAuthor | string |
| postAuthorHandle | string |
| postAuthorUrl | string |
| postAuthorHeadline | string |
| postAuthorProfileId | string |
| postAuthorType | string |
| postText | string |
| postPostedAt | string |
| postMediaUrl | string |
| postLikes | integer |
| postComments | integer |
| postReposts | integer |
| reactedAt | string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"profileReactions","subjects":["satyanadella"],"limit":25}'Example response rows
[
{
"reactorHandle": "sofia-ortiz",
"reactorName": "Sofia Ortiz",
"reactorHeadline": "Data Engineer · Python, dbt, Airflow",
"reactorLocation": "Austin, Texas, United States",
"reactionType": "LIKE",
"postAuthor": "Tom Becker",
"postText": "We open-sourced our data quality checks.",
"reactedAt": "2026-10-15T14:10:00Z",
"reactorProfileId": "3680798353",
"reactorUrl": "https://www.linkedin.com/sofia-ortiz-1000",
"postUrn": "urn:li:activity:3845499993",
"postUrl": "https://www.linkedin.com/sofia-ortiz-1000",
"postAuthorUrl": "https://www.linkedin.com/sofia-ortiz-1000",
"details": {}
},
{
"reactorHandle": "sofia-ortiz",
"reactorName": "Sofia Ortiz",
"reactorHeadline": "Data Engineer · Python, dbt, Airflow",
"reactorLocation": "Austin, Texas, United States",
"reactionType": "EMPATHY",
"postAuthor": "Leila Haddad",
"postText": "Today is my last day at Coinmint.",
"reactedAt": "2026-10-12T18:22:00Z",
"reactorProfileId": "3776001972",
"reactorUrl": "https://www.linkedin.com/sofia-ortiz-1001",
"postUrn": "urn:li:activity:1372690733",
"postUrl": "https://www.linkedin.com/sofia-ortiz-1001",
"postAuthorUrl": "https://www.linkedin.com/sofia-ortiz-1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Ads by a companyadsLibrary
Ads from the LinkedIn Ad Library, by Ad Library URL. An advertiser's page (all their live ads) or a single ad's detail URL.
| Field | Type | Meaning |
|---|---|---|
| subject * | string · ≤400 chars | An Ad Library URL. An advertiser page or one ad's detail page. |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| adId | string |
| adUrl | string |
| advertiserUrl | string |
| paidBy | string |
| headline | string |
| body | string |
| format | string |
| mediaType | string |
| mediaUrl | string |
| clickUrl | string |
| impressions | integer |
| targetingLocation | string |
| started | string |
| ended | string |
| daysActive | integer |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/linkedin \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"adsLibrary","subject":"https://www.linkedin.com/ad-library/search?companyIds=<company-id>","limit":10}'Example response rows
[
{
"paidBy": "Northfold",
"headline": "Close your books 3x faster",
"body": "Finance teams at 400+ companies close in 2 days.",
"format": "SINGLE_IMAGE",
"mediaType": "image",
"impressions": "10k-50k",
"targetingLocation": "United Kingdom",
"started": "2026-09-02",
"daysActive": 44,
"adId": "3114963231",
"adUrl": "https://www.linkedin.com/finance-teams-at-400-companies-close-in--1000",
"advertiserUrl": "https://www.linkedin.com/finance-teams-at-400-companies-close-in--1000",
"mediaUrl": "https://www.linkedin.com/finance-teams-at-400-companies-close-in--1000",
"clickUrl": "https://www.linkedin.com/finance-teams-at-400-companies-close-in--1000",
"details": {}
},
{
"paidBy": "Northfold",
"headline": "The 2026 finance team benchmark",
"body": "Download the report: 1,200 teams surveyed.",
"format": "DOCUMENT",
"mediaType": "document",
"impressions": "50k-100k",
"targetingLocation": "Europe",
"started": "2026-09-20",
"daysActive": 26,
"adId": "3288908810",
"adUrl": "https://www.linkedin.com/download-the-report-1-200-teams-surveyed-1001",
"advertiserUrl": "https://www.linkedin.com/download-the-report-1-200-teams-surveyed-1001",
"mediaUrl": "https://www.linkedin.com/download-the-report-1-200-teams-surveyed-1001",
"clickUrl": "https://www.linkedin.com/download-the-report-1-200-teams-surveyed-1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Historyhistoryfree
The stored time series. Free, reads what captures already wrote.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Handles or URLs of the chosen entity kind. |
| entity | enum | Whose series: "people" (/in/ handles) or "companies" (/company/ handles).people · companies |
| metric | string | people: followers | connections; companies: followers | employees_count |
| days | integer · 1-730 |
Response fields, each row of data
| Field | Type |
|---|---|
| subject | |
| metric | |
| points[].date | |
| points[].value |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.