capabilities

Linkedin Post Research

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.

Gooseby Athina AI
Run in Gooseworks
Install
Terminal
npx gooseworks install --claude

# Then in your agent:
/gooseworks <prompt> --skill linkedin-post-research
About This Skill

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

What's included

·
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)
·
keyword — Search term

Newsletter

Learn to build GTM systems with AI

2-3 compounding systems per week using Claude Code, OpenClaw, and more.