Systems Lab

Agent skill

linkedin-post-research

Search LinkedIn posts by keywords using Crustdata API directly, deduplicate and sort by engagement.

dormantNeeds a keyActs undeclared696 words

Filed under LinkedIn and social.

From edupegoretti/fluidz-skills · 116 skills · 0 · pushed 2026-03-11

What it does when it runs

Search LinkedIn posts by keywords using Crustdata API directly, deduplicate and sort by engagement. Outputs to CSV or JSON. Use when researching LinkedIn content around specific topics.

Read from the skill and the 2 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • CRUSTDATA_API_KEY
  • CRUSTDATA_API_TOKEN
Hosts it reaches
  • api.crustdata.com
  • www.linkedin.com
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shellwrites files

Ask about linkedin-post-research

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/edupegoretti/fluidz-skills.git /tmp/fluidz-skills
git -C /tmp/fluidz-skills sparse-checkout set "skills/capabilities/linkedin-post-research"
mkdir -p ~/.claude/skills/linkedin-post-research
cp -R "/tmp/fluidz-skills/skills/capabilities/linkedin-post-research/." ~/.claude/skills/linkedin-post-research/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs CRUSTDATA_API_KEY, CRUSTDATA_API_TOKEN, which you have to obtain separately.

Reproduced in full from edupegoretti/fluidz-skills/blob/a2cf697e2e8ec2ea517d85496e2d5c7f5dc44cd3/skills/capabilities/linkedin-post-research/SKILL.md, which is licensed MIT (repository). 696 words, 19 headings.

LinkedIn Post Research

Search LinkedIn for posts matching keywords via the Crustdata API, deduplicate results, and output sorted by engagement.

Quick Start

Requires requests and CRUSTDATA_API_TOKEN environment variable.

# Single keyword search
python3 skills/linkedin-post-research/scripts/search_posts.py \
  --keyword "AI sourcing" \
  --time-frame past-week

# Multiple keywords, output CSV
python3 skills/linkedin-post-research/scripts/search_posts.py \
  --keyword "talent sourcing tools" \
  --keyword "recruiting automation" \
  --keyword "AI sourcing" \
  --time-frame past-week \
  --output csv \
  --output-file results.csv

# Keywords from file, multiple pages
python3 skills/linkedin-post-research/scripts/search_posts.py \
  --keywords-file keywords.txt \
  --time-frame past-week \
  --pages 3 \
  --output json \
  --output-file results.json

# Summary only (prints to stderr)
python3 skills/linkedin-post-research/scripts/search_posts.py \
  --keyword "recruiting stack" \
  --output summary

Inputs

  • Keywords: Search terms — pass via --keyword flags or --keywords-file (one per line)
  • Time frame: past-day, past-week, past-month, past-quarter, past-year, all-time (default: past-month)
  • Pages: Number of pages per keyword (default: 1, ~5 posts/page). Max 20.
  • Sort by: relevance or date (default: relevance)

CLI Reference

FlagDefaultDescription
--keyword, -krequiredKeyword to search (repeatable)
--keywords-file, -fFile with one keyword per line (lines starting with # are ignored)
--time-frame, -tpast-monthTime filter
--sort-by, -srelevanceSort order
--pages, -p1Pages per keyword (~5 posts per page)
--limit, -lExact number of posts per API call (1-100)
--output, -ojsonOutput format: json, csv, summary
--output-filestdoutWrite output to file
--max-workers6Max parallel API calls

How It Works

  1. Takes keywords via CLI args or file
  2. Calls Crustdata's /screener/linkedin_posts/keyword_search API in parallel for all (keyword × page) combinations
  3. Deduplicates posts across keywords by backend_urn
  4. Sorts by total_reactions descending
  5. Outputs JSON, CSV, or summary

Output Schema (JSON)

{
  "author": "Jane Smith",
  "keyword": "AI sourcing",
  "reactions": 142,
  "comments": 28,
  "date": "2026-02-20",
  "post_preview": "First 200 chars of the post text...",
  "url": "https://www.linkedin.com/posts/...",
  "backend_urn": "urn:li:activity:123456789",
  "num_shares": 12,
  "reactions_by_type": "{\"LIKE\": 100, \"EMPATHY\": 30, \"PRAISE\": 12}",
  "is_repost": false
}

Output Columns (CSV)

ColumnDescription
authorLinkedIn post author name
keywordWhich search keyword matched this post
reactionsTotal reaction count
commentsTotal comment count
datePost date (YYYY-MM-DD)
post_previewFirst ~200 characters of the post
urlDirect link to the LinkedIn post
backend_urnUnique post identifier
num_sharesNumber of shares

Crustdata API Details

Endpoint: GET https://api.crustdata.com/screener/linkedin_posts/keyword_search

Parameters:

  • keyword — Search term
  • page — Page number (1-based, ~5 posts per page)
  • sort_byrelevance or date
  • date_posted — Time filter (past-day, past-week, etc.)
  • limit — Exact number of posts to return (1-100)

Auth: Authorization: Token <CRUSTDATA_API_TOKEN>

Credit usage: 1 credit per post returned.

Rate limits: Searches run in parallel (default 6 workers). The script handles 429 responses with automatic retry.

Environment Variables

VariableRequiredDescription
CRUSTDATA_API_TOKENYesCrustdata API token

Cost

~1 credit per post returned. Searching 10 keywords × 1 page = ~50 posts = ~50 credits.

Chaining with Other Skills

After getting the post list, common next steps:

  1. Extract commenterslinkedin-commenter-extractor — pass post URLs to find warm leads
  2. Research authors → web search on high-engagement post authors
  3. Qualify leadslead-qualification — score extracted people against ICP

Example pipeline:

# Step 1: Search posts
python3 skills/linkedin-post-research/scripts/search_posts.py \
  --keyword "AI sourcing" --keyword "recruiting automation" \
  --time-frame past-week --output json --output-file posts.json

# Step 2: Extract post URLs for commenter extraction
cat posts.json | python3 -c "
import json, sys
posts = json.load(sys.stdin)
# Filter: keep posts with 5+ comments
for p in posts:
    if p['comments'] >= 5:
        print(p['url'])
" > post_urls.txt

# Step 3: Extract commenters from those posts
while read url; do
  python3 skills/linkedin-commenter-extractor/scripts/extract_commenters.py --post-url "\$url" --output json
done < post_urls.txt

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what linkedin-post-research does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.