Search LinkedIn posts by keywords, sorted by engagement or date. Use when researching what people are saying about a topic on LinkedIn, finding high-engagement content, identifying thought leaders, or discovering warm leads through post engagement. Returns author, post text, reactions, comments, shares, post URL, and date. No LinkedIn cookies or login required.
npx gooseworks install --all # then, in Claude Code, Cursor, or Codex: /gooseworks use the linkedin-post-research skill
Search LinkedIn for posts matching keywords via Apify. Returns posts sorted by engagement or date, with author info, full text, reaction counts, and direct URLs.
No LinkedIn cookies. No login. Just keywords in, posts out.
Load this skill when:
Required for searching LinkedIn posts. Set in .env:
APIFY_API_TOKEN=your_token_hereNo LinkedIn cookies, login, or session tokens needed. That's the only setup.
apimaestro/linkedin-posts-search-scraper-no-cookies Apify actoractivity_id# Single keyword search
python3 skills/capabilities/linkedin-post-research/scripts/search_posts.py \
--keyword "AI sourcing" --max-items 20
# Multiple keywords
python3 skills/capabilities/linkedin-post-research/scripts/search_posts.py \
--keyword "AI sourcing" --keyword "recruiting automation" --max-items 30
# Sort by date (most recent first)
python3 skills/capabilities/linkedin-post-research/scripts/search_posts.py \
--keyword "AI agents" --sort-by date_posted --max-items 20
# Output as CSV
python3 skills/capabilities/linkedin-post-research/scripts/search_posts.py \
--keyword "AI agents" --output csv --output-file results.csv
# Summary table
python3 skills/capabilities/linkedin-post-research/scripts/search_posts.py \
--keyword "AI agents" --output summary| Flag | Default | Description |
|---|---|---|
--keyword, -k | required | Keyword to search (can be repeated for multiple keywords) |
--max-items | 50 | Max posts to return per keyword |
--sort-by | relevance | Sort order: relevance or date_posted |
--output, -o | json | Output format: json, csv, summary |
--output-file | stdout | Write output to file |
--token | env var | Apify API token (overrides APIFY_API_TOKEN env var) |
--timeout | 120 | Max seconds to wait for Apify run |
Actor: apimaestro/linkedin-posts-search-scraper-no-cookies
API call:
curl -X POST "https://api.apify.com/v2/acts/apimaestro~linkedin-posts-search-scraper-no-cookies/runs?token=$APIFY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keyword": "AI agents",
"maxItems": 50,
"sortBy": "date_posted"
}'Polling for results:
# Check run status
curl "https://api.apify.com/v2/acts/apimaestro~linkedin-posts-search-scraper-no-cookies/runs/{RUN_ID}?token=$APIFY_API_TOKEN"
# When status is SUCCEEDED, fetch results
curl "https://api.apify.com/v2/datasets/{DATASET_ID}/items?token=$APIFY_API_TOKEN"{
"author": "Jane Smith",
"author_headline": "VP of Sales at Acme Corp",
"author_profile_url": "https://www.linkedin.com/in/janesmith",
"keyword": "AI sourcing",
"reactions": 142,
"comments": 28,
"shares": 12,
"reactions_by_type": {"LIKE": 100, "EMPATHY": 30, "PRAISE": 12},
"date": "2026-04-01",
"post_preview": "First 200 chars of the post text...",
"full_text": "Complete post text...",
"url": "https://www.linkedin.com/posts/...",
"activity_id": "7447040447966826496",
"hashtags": ["#AI", "#sales"],
"is_repost": false,
"content_type": "text"
}| Column | Description |
|---|---|
| author | Post author name |
| author_headline | Author's LinkedIn headline |
| author_profile_url | Author's LinkedIn profile URL |
| keyword | Which search keyword matched |
| reactions | Total reaction count |
| comments | Comment count |
| shares | Share count |
| date | Post date (YYYY-MM-DD) |
| post_preview | First ~200 characters |
| url | Direct link to the LinkedIn post |
| activity_id | Unique post identifier |
| hashtags | Comma-separated hashtags |
Apify charges per compute usage. ~50 posts costs approximately $0.01-0.05 depending on the actor's pricing tier. The script prints cost info after each run.
| Error | Fix |
|---|---|
APIFY_API_TOKEN not set | Ask user to add it to .env |
| Apify run fails or times out | Retry once. If still fails, try a broader keyword. |
| 0 results | Keyword may be too specific. Try broader terms. |
Render a 'model comparison grid' video from a config — a fal-style "same prompt, N contenders" showcase — a dark real-DOM stage where per beat a monospace prompt fades in centered, docks to a small top strip, then a labeled 2-4 panel grid (static images OR muted video clips, mixable per cell) staggers in and holds for comparison, plus a minimal end card — frame-stepped via Playwright (video cells are frame-seeked deterministically) and encoded with FFmpeg. Deterministic assembly, FREE (cell media comes from create-image-fal / create-video-fal, music from create-music-elevenlabs), text stays pixel-crisp. Use for the model-comparison-grid format.
Render a punchy ~12s vertical (9:16) music-only direct-response OFFER ad as a 4-beat kinetic-typography film — HEADLINE slam → real PRODUCT drop → CLAIM/proof → CTA pill — from one config of copy slots, a real product photo, a brand palette, fonts, bpm, and beat split. DETERMINISTIC + FREE (a bundled Remotion project; springs + interpolate, no AI-gen for visuals). Backgrounds are engine gradient divs off the palette, props are inline SVG, the ONLY composited bitmap is the REAL product photo (objectFit:contain, never stretched), and ALL headline/claim/CTA/URL/wordmark text is typeset in the engine — never AI-rendered (the format's credibility guard). A driver binds the config to Remotion input props, renders the 9:16 master, and derives a 1:1 center-crop with ffmpeg. Two gating checks run before render (claim verbs must match the product's physical format; the claim beat needs an edge-entry mechanism prop). Use for the motion-graphics-offer-ad format.
Assemble a myth-vs-fact kinetic-typography explainer video ad (≈29.5s, 9:16) from N myth/fact pairs + hook / turn / punch copy + palette + a brand end-card PNG + a VO track — a hook, 3 red-strike MYTH cards that flip to teal-check FACT cards (per-line strikethrough that crosses EVERY wrapped line), a "what actually works" turn, an optional proof reveal, a punch line, and a static end card. DETERMINISTIC assembly with ZERO AI-gen visuals — HTML hyperframes rendered frame-exact via Playwright (`window.renderAt(t)`, animation a pure function of beat-local time), Whisper beat-snap to VO word onsets, concat at a uniform fps, karaoke `.ass` captions burned last (suppressed on the proof + end-card beats), and a VO + optional music mix (music −20 dB, `amix normalize=0`, tail fade). FREE (Python + Playwright + ffmpeg); the recipe supplies the copy / palette / end-card / VO and gates the paid VO / music / Whisper calls to their own capabilities. Use for the myth-vs-fact format.