# LinkedIn Post Scraper (`socialdataapi/linkedin-post-scraper`) Actor

LinkedIn Post Scraper — Extract LinkedIn post data including text, author details, post URLs, timestamps, likes, comments, shares, media, hashtags, and engagement metrics. Useful for content research, competitor analysis, lead generation, audience insights, and social media monitoring.

- **URL**: https://apify.com/socialdataapi/linkedin-post-scraper.md
- **Developed by:** [Social Data API](https://apify.com/socialdataapi) (community)
- **Stats:** 8 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.69 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### LinkedIn Post Scraper — Post Text, Dates, Comments and Reactions

LinkedIn Post Scraper extracts public posts from LinkedIn company pages, personal profiles and single post links. Each post comes back with its text, link, publish date, author name and headline, images or video cover, up to 10 comments, reaction types and the reaction and comment counts. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a social listening pipeline. **No LinkedIn account or cookies needed.** Start with one company page, then add every account you follow.

***

### What data can I extract with LinkedIn Post Scraper?

Using this LinkedIn Post API, you will be able to extract the following LinkedIn post data:

| 📝 Post text | 🔗 Post link and ID | 📅 Publish date and age | 🔁 Repost or original |
|---|---|---|---|
| 🖼️ Images, video cover or document pages | 🎞️ Media type (image, video, document, article, text) | 👤 Author name and type (company or person) | 💼 Author headline or About text |
| 🆔 Author ID and profile link | 🏞️ Author logo or photo and cover image | 💬 Up to 10 comments with author and time | 👍 Reaction count |
| 🔢 Comment count | 😀 Reaction types shown on the post | 📣 @-mentions with the mentioned profile's details | ✂️ Comments-truncated flag |
| 🔓 Whether reacting, commenting and sharing are open | 🌍 Share audience (public) | | |

Values LinkedIn does not show to logged-out visitors, such as the share count and who reacted, come back as null.

***

### How to use LinkedIn Post Scraper

Marketers, sales teams and researchers use it to scrape LinkedIn posts from a list of companies or people and get one clean JSON row per post from a single run.

**Copy to your AI assistant:**

```text
LinkedIn Post Scraper is an Apify Actor that returns public LinkedIn posts from company pages, profiles or single post links as structured JSON: post text, post link, publish date, author name and headline, images or video cover, media type, up to 10 comments, reaction types, and reaction and comment counts. Use it whenever someone needs LinkedIn posts without cookies, a login, or a browser - tracking what competitors publish, spotting hiring or launch announcements, building a dataset of an executive's public posts. Inputs: urls (array of strings, required: LinkedIn company, showcase or school page links, public profile links, or single post links), limitPerSource (integer, posts per link, minimum 1, default 10), scrapeUntil (string date YYYY-MM-DD, keeps posts published on or after it), deepScrape (boolean, default true: also opens each post's own page for exact time, full text, comments, reaction types and media), rawData (boolean, default false: also saves the downloaded pages as one file in the key-value store), proxyConfiguration (object, Apify proxy settings). Every dataset row is one post; there are no summary or error rows, and only saved posts are billed (one row_result event each). LinkedIn shows at most about 10 comments per post to logged-out visitors, so comments-truncated is true when the post has more; share counts and the names of people who reacted are not public and stay null.
```

#### LinkedIn Post Scraper MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at the Apify MCP server and it can find, add and call this Actor on its own through the server's search, add and call tools. No glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open this Actor in the Apify Store.
3. Paste the LinkedIn company, profile or post URLs, one per line.
4. Click **Start** (or send your API request).
5. Download or stream your results in JSON, CSV or Excel.

#### How to scale LinkedIn Post Scraper to bulk

Add as many links as you need to the urls list of one run: every link is worked on in parallel and returns up to your per-link limit, so one run can be a bulk LinkedIn post scraper for a whole account list. A post that turns up for two links is saved only once. To monitor LinkedIn company posts over time, save the input as a task and run it on an Apify schedule with a publish-date limit, or start runs from your own code through the Apify API.

***

### ✨ Features

LinkedIn Post Scraper fetches clean, structured posts from LinkedIn ⚡. It's ideal for competitor content tracking, sales trigger alerts, executive research and building datasets for AI. Think of it as a LinkedIn posts extractor that also reads each post's own page for the details a page preview leaves out.

It extracts, per post:

- **Post text and link** – the full text, the post link and LinkedIn's post ID
- **Publish date** – exact date and time, plus the age shown on LinkedIn (for example "3d")
- **Author** – name, company or person, headline or About text, ID, logo or photo and cover image
- **Media** – image links, video cover, document pages or article preview, with the media type
- **Engagement** – reaction count, comment count and which reaction types the post received
- **Comments** – up to 10 comments with text, time, mentioned profiles and the commenter's name, photo and headline
- **Reposts** – whether the post shares another author's post

⚡ When a page shows fewer posts than you asked for, the Actor looks for that author's older posts and checks each one on its own page before keeping it, so every row belongs to the author you asked for.

***

### Use cases 💡

- **Content marketer** — track competitor post text, media type and reaction counts every week.
- **Sales rep** — spot hiring and launch posts from target accounts by publish date.
- **Researcher** — export LinkedIn posts to CSV for a timeline of an executive's commentary.
- **Social media manager** — compare comment counts and reaction types across company pages.
- **AI agent builder** — feed post text and author headlines into a RAG index for account research.

Building an AI agent? [Connect LinkedIn Post Scraper over MCP](#mcp-integration-for-ai-agents) and let it call the actor on its own.

***

### Why choose this actor?

- **Posts with their full details in one run.** A recorded run returned 6 posts from 2 sources (Google's company page and Satya Nadella's profile) in 92 seconds, each with its exact publish time, comments and reaction types.
- **The numbers behind each post.** A recorded Google post came back with 674 reactions, 52 comments, 3 images, 3 reaction types and the first 10 comments with each commenter's name and photo.
- **34 fields, 6 inputs.** A LinkedIn post engagement scraper that takes company, showcase, school, profile and single-post links, with a per-link limit, a publish-date limit and an optional detail step.

***

### ⬇️ Input

The Actor takes a list of LinkedIn links: company, showcase or school pages, public profiles, or single posts. Only urls is required; the other fields set how many posts you get and how much detail.

Accepted link formats:

- `https://www.linkedin.com/company/google/` (company, also `/showcase/...` and `/school/...`)
- `https://www.linkedin.com/in/satyanadella/` (public profile)
- `https://www.linkedin.com/posts/google_...-activity-7511155958451105792-acJP` (single post)
- `https://www.linkedin.com/feed/update/urn:li:activity:7511155958451105792` (single post; `urn:li:share:...` and `urn:li:ugcPost:...` links work too)

| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
| `urls` | Yes | array | LinkedIn company, showcase, school, profile or post links, one or many. Other links are skipped. | `["https://www.linkedin.com/company/google/"]` |
| `limitPerSource` | No | integer | Posts to collect from each link. Minimum `1`, default `10`. | `3` |
| `scrapeUntil` | No | string | Keep only posts published on or after this date (`YYYY-MM-DD`). Empty = no date limit. | `"2026-09-01"` |
| `deepScrape` | No | boolean | Also open each post's own page for exact time, full text, up to 10 comments, reaction types and media. Default `true`. In both modes, a page with fewer posts than your limit also triggers the search for that author's older posts. | `true` |
| `rawData` | No | boolean | Also save the downloaded pages and parsed posts as one file (`raw_pages.json`) in the key-value store. Meant for small runs. Default `false`. | `false` |
| `proxyConfiguration` | No | object | Apify proxy settings. LinkedIn pages are first requested without a proxy; after the first block the Actor switches to Apify's residential proxy. | `{"useApifyProxy": true}` |

#### Example input

The input of the recorded run (2 sources, 6 posts in 92 seconds):

```json
{
  "urls": [
    "https://www.linkedin.com/company/google/",
    "https://www.linkedin.com/in/satyanadella/"
  ],
  "limitPerSource": 3,
  "scrapeUntil": "2026-09-01",
  "deepScrape": true,
  "rawData": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

***

### ⬆️ Output

Every post is one typed, normalized JSON item with the same 34 keys on every run, so you can export LinkedIn posts as JSON (default), CSV or Excel. All posts of a run are also saved together as `linkedin_posts.json` in the key-value store.

#### Example output

A Google post from the recorded run above (abridged: one comment and two reaction entries shown):

```json
{
  "urn": "urn:li:activity:7511489262819831809",
  "text": "As an account executive, Jenna solves problems that don't always look like traditional advertising problems. Working in Google Ads, she acts as a strategic consultant for restaurant brands, using data and customer behavior to uncover opportunities for growth. ...",
  "url": "https://www.linkedin.com/posts/google_as-an-account-executive-jenna-solves-problems-activity-7511489262819831809-a_lL",
  "postedAtTimestamp": 1790878596977,
  "postedAtISO": "2026-10-01T18:16:36.977000Z",
  "timeSincePosted": "3d",
  "isRepost": false,
  "authorType": "Company",
  "authorProfileUrl": "https://www.linkedin.com/company/google/",
  "authorProfileId": "1441",
  "authorHeadline": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. ...",
  "authorFullName": "Google",
  "image": "https://media.licdn.com/dms/image/v2/D5610AQHiq7uhZDnNug/image-shrink_1280/B56aD4ro0wGcAc-/0/1790878584366?e=2147483647&v=beta&t=7dOm2skVsMujjjzm0sLIeGMalOmXZqk6fE08K0kgjZk",
  "type": "image",
  "images": [
    "https://media.licdn.com/dms/image/v2/D5610AQHiq7uhZDnNug/image-shrink_1280/B56aD4ro0wGcAc-/0/1790878584366?e=2147483647&v=beta&t=7dOm2skVsMujjjzm0sLIeGMalOmXZqk6fE08K0kgjZk",
    "https://media.licdn.com/dms/image/v2/D5610AQHx_S9-uB-WrA/image-shrink_1280/B56aD4ro.3JwAg-/0/1790878585241?e=2147483647&v=beta&t=Xp4Qvx7DYgZdvoVtIaP-6Ey7fQVd9X0v3zr5VEFl8-8",
    "https://media.licdn.com/dms/image/v2/D5610AQHJ9BeYMu2KRQ/image-shrink_1280/B56aD4rpJ6G4Ac-/0/1790878586208?e=2147483647&v=beta&t=A1EjbDmpMk4ylkJ9ZwBlY8M9LDA-XmxtzG_KyDnwZKU"
  ],
  "author": {
    "firstName": null,
    "lastName": null,
    "occupation": "A problem isn't truly solved until it's solved for all. ...",
    "id": "1441",
    "publicId": "google",
    "trackingId": null,
    "profileId": "1441",
    "picture": "https://media.licdn.com/dms/image/v2/D4E0BAQGv3cqOuUMY7g/company-logo_200_200/B4EZmhegXHGcAM-/0/1759350753990/google_logo?e=2147483647&v=beta&t=Hzaw0d0Yz1Yi-_mDuQ6JQo-Ph41AG50Z8pWjyaeTI0k",
    "backgroundImage": "https://media.licdn.com/dms/image/v2/D563DAQGtANfXBwQdug/image-scale_191_1128/B56Z2dEWlfIAAg-/0/1776456657776/google_cover?e=2147483647&v=beta&t=f1V4NKVCAzcuXjhn2gdiiYr59LjUbtJ9k3oddKeymtk"
  },
  "authorName": "Google",
  "authorTitle": "A problem isn't truly solved until it's solved for all. ...",
  "attributes": [],
  "comments": [
    {
      "time": 1791018455895,
      "link": "https://www.linkedin.com/feed/update/urn:li:activity:7511489262819831809?commentUrn=urn%3Ali%3Acomment%3A%28urn%3Ali%3AugcPost%3A7511489262035476480%2C7512075873630715904%29",
      "text": "The interesting part here isn't the predictive AI, it's the business fluency behind how it was applied. ...",
      "entities": [],
      "pinned": false,
      "originalLanguage": null,
      "author": {
        "firstName": "Shubham",
        "lastName": "Chaudhary",
        "occupation": null,
        "id": "shubham-chaudhary-investing",
        "publicId": "shubham-chaudhary-investing",
        "trackingId": null,
        "profileId": "shubham-chaudhary-investing",
        "picture": "https://media.licdn.com/dms/image/v2/D5603AQHQOHmsPdHs0g/profile-displayphoto-scale_400_400/B56Z2Z.nXjKIAg-/0/1776404823641?e=2147483647&v=beta&t=ZhTgmToB6cVbLja6HWLqm1lCTU4BV2USOlpyRj_oWz0",
        "backgroundImage": null,
        "distance": "OUT_OF_NETWORK"
      }
    }
  ],
  "reactions": [
    { "type": "LIKE", "profile": { "firstName": null, "lastName": null, "occupation": null, "id": null, "publicId": null, "trackingId": null, "profileId": null, "picture": null, "backgroundImage": null } },
    { "type": "PRAISE", "profile": { "firstName": null, "lastName": null, "occupation": null, "id": null, "publicId": null, "trackingId": null, "profileId": null, "picture": null, "backgroundImage": null } }
  ],
  "numShares": null,
  "numLikes": 674,
  "numComments": 52,
  "commentsTruncated": true,
  "commentsComplete": false,
  "reactionsTruncated": true,
  "canReact": true,
  "canPostComments": true,
  "canShare": true,
  "commentingDisabled": false,
  "allowedCommentersScope": "ALL",
  "rootShare": true,
  "shareAudience": "PUBLIC"
}
```

***

### How does it work?

The Actor reads public LinkedIn pages — the same company, profile and post pages any visitor sees without logging in — so no LinkedIn account is needed. It opens each page you give it, reads the posts shown there and, with the detail step on, opens every post's own page for the exact time, full text, comments and reaction types. When a page shows fewer posts than your limit, it looks for that author's older posts in public web results and keeps only the ones whose own page confirms the same author. It uses plain HTTP requests, no browser. Requests start without a proxy; when LinkedIn blocks one, the Actor retries and switches to a proxy with a new address for each request. Rows keep the same normalized schema on every run. Values LinkedIn hides from logged-out visitors come back as null.

***

### How do you integrate LinkedIn Post Scraper into your stack?

It works with what you already use: the REST API from any language, MCP for AI agents, and no-code tools.

#### MCP integration for AI agents

Add the Apify MCP server to your agent with one command:

```bash
claude mcp add --transport http apify "https://mcp.apify.com"
```

This registers LinkedIn Post Scraper as a tool your agent can call directly: the agent finds it with the server's search tool, adds it, and calls it with a list of LinkedIn links. It works in Claude Code, Cursor and Windsurf, and any MCP-compatible client can use the same server address.

#### No-code tools (n8n, Make, LangChain)

- **n8n** — use the Apify node's "Run an Actor" operation, then read the run's dataset items in the next node. You can also call the Apify API's run-sync endpoint from an HTTP Request node with your token.
- **Make** — add the Apify app's "Run an Actor" module, then "Get Dataset Items" to map each post into a sheet, a Slack message or your CRM.
- **LangChain** — install `langchain-apify` and load the run's dataset with `ApifyDatasetLoader`, mapping each post's text and author to a document for your agent or vector store.

***

### Is it legal to scrape LinkedIn data?

Scraping publicly available LinkedIn data is generally legal, but how you store and use it is regulated. The Actor returns only publicly available data — what any user sees without logging in. Under GDPR, collecting public data is generally permissible, but posts and comments contain names and headlines, so storing and using them must comply with local data-protection law. Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does LinkedIn Post Scraper return?

It returns each post's text, link, publish date, author name and headline, plus images, comments, reaction types and the reaction and comment counts. See [the data fields section](#what-data-can-i-extract-with-linkedin-post-scraper).

#### Does LinkedIn Post Scraper require a LinkedIn account or login?

No. You can scrape LinkedIn posts without login: only public post data is extracted, and no credentials or cookies are needed.

#### How fast does LinkedIn Post Scraper run?

A recorded run returned 6 posts from 2 sources in 92 seconds with the detail step on; most of that time went to waiting and retrying when LinkedIn limited requests. Data is fetched live, not cached.

#### What happens if a post is private or doesn't exist?

Links that do not exist or stay blocked after all retries are listed in the run log and skipped, and links that are not LinkedIn company, profile or post links are skipped too. No row is saved and nothing is charged for them. If no link can be read at all, the run ends with a status message saying so.

#### Can I scrape multiple LinkedIn posts at once?

Yes. Put any number of company, profile or post links in the urls list; each one returns up to your per-link limit, and duplicates across links are saved once.

#### Does LinkedIn Post Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — LinkedIn Post Scraper is available as an MCP tool through the Apify MCP server. Register it in Claude Code, Cursor or Windsurf with `claude mcp add --transport http apify "https://mcp.apify.com"`. Any agent that can call an HTTP endpoint can use the REST API directly, so it also works as a LinkedIn posts API.

#### Does LinkedIn Post Scraper return data in a format LLMs can use directly?

Yes. Typed, normalized JSON with consistent field names. No HTML parsing, no selectors. Pass it straight to an LLM, index it into a vector store, or feed it to an agent tool — no transformation step.

#### What happens when LinkedIn changes its layout or updates its anti-bot system?

The Actor is maintained. When LinkedIn changes, the Actor is updated — your calls keep returning the same JSON schema with no changes on your end.

#### Can I use LinkedIn Post Scraper without managing proxies or browser infrastructure?

Yes. Retries and the switch to a proxy run on the actor's side, and it needs no browser. You send one request and get structured JSON back. No proxy accounts, no headless browser setup, no maintenance.

#### Which LinkedIn post fields work best for AI training data and RAG indexing?

For RAG, the text-rich LinkedIn post data is the most useful: the post text, the author headline or About text, and the comment texts. For training data, use the numeric and boolean fields: reaction count, comment count, publish time, the repost flag and the comments-truncated flag. Fields are typed strings, integers, booleans and nested objects — no normalization needed.

***

### Your feedback

Found a bug or missing a field? Let us know through the Actor's Issues tab in the Apify Console. Every report is read, and fixes ship regularly.

# Actor input Schema

## `urls` (type: `array`):

LinkedIn links to scrape, one or many. Accepted: company, showcase or school pages (linkedin.com/company/..., /showcase/..., /school/...), public profiles (linkedin.com/in/...), and single posts (linkedin.com/posts/... or linkedin.com/feed/update/urn:li:activity:...). Other links are skipped.

## `limitPerSource` (type: `integer`):

How many posts to collect from each URL. Free plan users are limited to 20 posts per URL per run and 200 posts total per month; paid plans have no limit.

## `scrapeUntil` (type: `string`):

Only include posts published on or after this date (YYYY-MM-DD). Leave empty for no date limit.

## `deepScrape` (type: `boolean`):

Also open each post's own page for the exact publish time, full text, up to 10 comments, reaction types and media. Turn off for a faster run with fewer fields filled in. In both modes, when a page shows fewer posts than your limit, the Actor also looks for that author's older posts and checks each one on its own post page before keeping it.

## `rawData` (type: `boolean`):

For power users: also save every page the run downloaded, plus the parsed posts, as one file (raw_pages.json) in the key-value store. Meant for small runs, because the file grows quickly. Turn off for cleaner storage.

## `proxyConfiguration` (type: `object`):

LinkedIn pages are first requested without a proxy. After the first block, the Actor switches to Apify's residential proxy with a new session for every request; your setting here is used only if the residential proxy is not available. The look-up of older posts always uses a proxy: your setting, or the residential proxy if none is set. Turning the proxy off does not stop the residential fallback.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/company/google/"
  ],
  "limitPerSource": 10,
  "deepScrape": true,
  "rawData": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All saved LinkedIn posts, one row per post, in the overview view of the default dataset.

## `postsFile` (type: `string`):

The same posts collected in this run, bundled as a single linkedin_posts.json file in the key-value store.

## `rawPages` (type: `string`):

Every page downloaded during the run plus the parsed posts, saved as one file when the raw-data option is on.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.linkedin.com/company/google/"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialdataapi/linkedin-post-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://www.linkedin.com/company/google/"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("socialdataapi/linkedin-post-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.linkedin.com/company/google/"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call socialdataapi/linkedin-post-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,socialdataapi/linkedin-post-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/icM2ZDPnhNrZmVf8Q/builds/R3cpmhpAmxQFEhAI9/openapi.json
