# LinkedIn Post Personalizer - AI Comment + DM Generator (`fetchcraft/linkedin-post-personalizer`) Actor

Paste a LinkedIn post and prospect info, get a personalized AI comment or DM. Optimized for B2B outbound that opens with substance (not "great post"). Tone presets: thoughtful, direct, warm, curious, contrarian. Bring your own LLM key. $0.05 to $0.10 per prospect.

- **URL**: https://apify.com/fetchcraft/linkedin-post-personalizer.md
- **Developed by:** [Emily Ward](https://apify.com/fetchcraft) (community)
- **Categories:** Lead generation, AI, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.90 / 1,000 dm opener generateds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LinkedIn Post Personalizer

![LinkedIn Post Personalizer - AI Comment + DM Generator](https://ai-sales-personalizer.vercel.app/og/linkedin-post-personalizer.png)

Personalize LinkedIn DMs at scale without scraping LinkedIn.

You paste each prospect's LinkedIn URL, the text of their most recent (or a relevant) post, and their role. The actor generates a 2-sentence DM opener, a <300-char connection note, a fit score, and a day-3 next-touch suggestion.

### Why no scraping

LinkedIn's ToS prohibits scraping. Their bot detection is aggressive. This actor never touches LinkedIn directly. You bring the post text, the actor brings the personalization.

### Pricing

$0.10 per `dm_opener_generated` event. After Apify's 20% cut and Anthropic costs, net is approximately $0.07 per opener.

For comparison: Lavender, the dominant LinkedIn-DM-personalization tool, runs $29 to $59/month per seat. At 60 DMs/month a buyer pays $6 on this actor vs $29 on Lavender, plus they pay only for what they generate.

### How to use

1. Pull your prospect list (e.g. from a Sales Navigator export or a LinkedIn search you saved manually).
2. For each prospect, copy the post text you want to reference.
3. Drop them all into the `prospects` input as JSON.
4. Run.
5. Paste the generated `dm_opener` or `connection_note` directly into LinkedIn.

### Output per prospect

- `dm_opener`: 2 sentences, references something specific in their post
- `connection_note`: under 300 characters, follows LinkedIn's connection-request limit
- `fit_score`: 0 to 100, how well their post + role aligns with your pitch
- `post_acknowledgement`: one sentence that responds to their post without being sycophantic
- `recommended_next_touch`: day-3 follow-up suggestion if they accept the connection but don't reply

### Buyer's typical workflow

This actor pairs well with three companion actors. Cover the four highest-leverage prospecting moves with one Apify wallet:

- **[AI Sales Personalizer](https://apify.com/fetchcraft/ai-sales-personalizer)** ($0.15/result). Homepage to personalized opener.
- **[Cold Email Rewriter](https://apify.com/fetchcraft/cold-email-rewriter)** ($0.10/rewrite). Draft to predicted reply rate + 3 variants.
- **[SEO Competitor Gap](https://apify.com/fetchcraft/seo-competitor-gap)** ($0.50/competitor). Find topical gaps to reference in outbound.

### Use cases

- **SDRs and AEs**: Turn a LinkedIn Sales Navigator export into a ready-to-paste DM batch without copy-pasting individual posts.
- **Founders doing outbound**: Replace "hey I saw your profile" with a DM that actually references something they wrote.
- **Recruiters**: Personalize connection requests to passive candidates at scale.
- **Agencies**: Add LinkedIn personalization to client outreach packages without buying another SaaS seat.

### What this actor does NOT do

- It does not scrape LinkedIn. You bring the post text and prospect data.
- It does not send messages. Use your LinkedIn account, Dux-Soup, or similar to paste and send.
- It does not find prospect post text for you. Use LinkedIn Sales Navigator, manual browsing, or a LinkedIn scraper (separate actor or tool) to collect the posts.

### FAQ

**Q: Why do I need to bring the post text?**
LinkedIn prohibits automated scraping. This actor processes data you provide rather than fetching from LinkedIn directly, which keeps you compliant with LinkedIn's ToS.

**Q: What format is the input?**
An array of prospect objects, each with a `url`, `post_text`, `role`, and optionally a `company_name`. Full schema in the actor's Input tab.

**Q: Does it work for cold connection requests?**
Yes. The `connection_note` field is under 300 characters specifically to fit LinkedIn's connection-request limit.

**Q: What if I don't have a recent post for a prospect?**
Pass their "About" section text, bio text, or any other text that signals their interests. The opener quality drops slightly without a recent post but is still personalised.

***

Tags: `linkedin` `sales` `personalization` `outreach` `sdr` `b2b` `cold-outreach` `ai` `claude` `lead-generation`

Made by Emily Ward, Founder of Cancel Costs. Questions: emily@cancelcosts.com

### Pairs well with

- **[ai-sales-personalizer](https://apify.com/fetchcraft/ai-sales-personalizer)**: Generate the email opener side-by-side with the LinkedIn DM. $0.10 to $0.20 per lead.
- **[cold-email-rewriter](https://apify.com/fetchcraft/cold-email-rewriter)**: A/B-test DM variants for inbox-fatigue mitigation. $0.05 per variant.
- **[contact-details-extractor](https://apify.com/fetchcraft/contact-details-extractor)**: Pull additional contact details from the prospect's linked website. $0.01 per site.

### Integrations

This actor works out of the box with every Apify-supported integration:

- **API**: call via Apify API or any official SDK (Python, JavaScript, PHP, .NET). Returns a clean dataset URL.
- **Schedule**: set a daily, weekly, or custom cron cadence in Apify Console. Combine with `notification` for fresh feeds.
- **Webhooks**: wire `ACTOR.RUN.SUCCEEDED` to Slack, Discord, Zapier, Make, n8n, Pipedream, or any HTTPS endpoint.
- **MCP**: this actor is discoverable through Apify's hosted MCP server at `mcp.apify.com` for Claude, Cursor, Cline, Windsurf, and other MCP clients.
- **n8n / Make / Zapier**: native HTTP-Request integration. Trigger the actor on schedule, pipe results to Google Sheets, Airtable, your CRM, or any database.

### Try it free

Every Apify user gets **$5/month in free platform credits** (around 250 events at this actor's per-event price). Run preview mode first to confirm output shape before scaling.

New to Apify? [Sign up here](https://apify.com/sign-up?fpr=fetchcraft) to get free credits on signup.

### What's New

- 2026-06-03: Metadata, categories, and SEO refreshed. Latest version live on Apify Store.

### Last Updated

2026-06-03

# Actor input Schema

## `prospects` (type: `array`):

List of objects, each REQUIRING three fields: linkedin\_url (the prospect's profile URL), post\_text (paste their post body, minimum 20 chars), contact\_role (their job title). Optional: name, company. The actor never scrapes LinkedIn - you provide the post text.

## `your_product_pitch` (type: `string`):

What you sell. Concrete beats vague. The AI uses this to compute fit score and tailor the DM.

## `tone` (type: `string`):

How the DM opener should read.

## `max_concurrency` (type: `integer`):

Number of prospects processed in parallel. Higher = faster, lower = avoids rate limits. Default 5 works for most lists.

## `llm_provider` (type: `string`):

Pick which LLM you want. Gemini is recommended (1500 free requests/day at https://aistudio.google.com/apikey). Groq also good (14400 free/day at https://console.groq.com/keys). Leave blank to use the actor owner's configured key (if any).

## `llm_api_key` (type: `string`):

Paste the API key for the provider you selected. Never leaves the Apify run, never logged. Free tier providers (Gemini, Groq) give thousands of free results per day.

## Actor input object example

```json
{
  "prospects": [
    {
      "linkedin_url": "https://www.linkedin.com/in/example/",
      "post_text": "Just shipped our new RevOps dashboard. Took 3 weeks of Postgres pain to get pipeline data clean enough to ship. Worth every hour.",
      "contact_role": "Head of RevOps"
    }
  ],
  "your_product_pitch": "We cut Postgres-heavy RevOps queries from 30 seconds to under 1 second using a usage-aware materialized-view layer. Self-serve, no DBA required.",
  "tone": "thoughtful",
  "max_concurrency": 5,
  "llm_provider": ""
}
```

# 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 = {
    "prospects": [
        {
            "linkedin_url": "https://www.linkedin.com/in/example/",
            "post_text": "Just shipped our new RevOps dashboard. Took 3 weeks of Postgres pain to get pipeline data clean enough to ship. Worth every hour.",
            "contact_role": "Head of RevOps"
        }
    ],
    "your_product_pitch": "We cut Postgres-heavy RevOps queries from 30 seconds to under 1 second using a usage-aware materialized-view layer. Self-serve, no DBA required."
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetchcraft/linkedin-post-personalizer").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 = {
    "prospects": [{
            "linkedin_url": "https://www.linkedin.com/in/example/",
            "post_text": "Just shipped our new RevOps dashboard. Took 3 weeks of Postgres pain to get pipeline data clean enough to ship. Worth every hour.",
            "contact_role": "Head of RevOps",
        }],
    "your_product_pitch": "We cut Postgres-heavy RevOps queries from 30 seconds to under 1 second using a usage-aware materialized-view layer. Self-serve, no DBA required.",
}

# Run the Actor and wait for it to finish
run = client.actor("fetchcraft/linkedin-post-personalizer").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 '{
  "prospects": [
    {
      "linkedin_url": "https://www.linkedin.com/in/example/",
      "post_text": "Just shipped our new RevOps dashboard. Took 3 weeks of Postgres pain to get pipeline data clean enough to ship. Worth every hour.",
      "contact_role": "Head of RevOps"
    }
  ],
  "your_product_pitch": "We cut Postgres-heavy RevOps queries from 30 seconds to under 1 second using a usage-aware materialized-view layer. Self-serve, no DBA required."
}' |
apify call fetchcraft/linkedin-post-personalizer --silent --output-dataset

```

## MCP server setup

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

```

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/tRHmKY3zJv9Xx1yrG/builds/hvObo1stFQhXSB3Vc/openapi.json
