Install any skill in seconds. Free to start, no credit card required.
Get Started Free →When you or another skill needs to fetch the content of a social media post by URL — tweet, X thread, LinkedIn post, Instagram post, TikTok video, Bluesky post, Reddit thread, Mastodon status, Threads post, Hacker News thread. Returns normalized structured data (author, posted_at, text, engagement counts, media URLs, replies if requested) regardless of platform. Tries strategies in order: direct API (Bluesky, Mastodon, HN, Reddit), agent-browser with modal dismissal (LinkedIn, X preview), Waybac
.claude/skills/coreyhaines31-social-fetch/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 246% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 154% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 333% | 0% |
Normalized fetcher for social posts across platforms. Detects platform from URL, tries strategies in order, returns the same JSON shape regardless of source.
| URL pattern | Platform | |---|---| | x.com/<user>/status/<id> or twitter.com/<user>/status/<id> | x (Twitter) | | linkedin.com/posts/<slug> or linkedin.com/feed/update/urn:li:activity:<id> | linkedin | | linkedin.com/in/<handle> (profile, recent activity) | linkedin-profile | | instagram.com/p/<id> or instagram.com/reel/<id> | instagram | | tiktok.com/@<user>/video/<id> | tiktok | | bsky.app/profile/<handle>/post/<rkey> | bluesky | | reddit.com/r/<sub>/comments/<id>/... | reddit | | <mastodon-instance>/@<user>/<id> (e.g. mastodon.social, hachyderm.io) | mastodon | | threads.net/@<user>/post/<id> | threads | | news.ycombinator.com/item?id=<id> | hn | | youtube.com/watch?v=<id> or youtu.be/<id> | → defer to watch-video |
If the URL doesn't match any pattern, ask the user what platform it is.
Read references/strategies.md for the per-platform strategy chain. Each platform has 2–5 strategies tried in order.
Key principles:
For each strategy in the chain:
After exhausting the chain, return a clear error: which strategies were tried, why each failed, and what's needed to unlock (e.g., "Add $SCRAPECREATORS_API_KEY for X — see references/auth-keys.md").
Return this shape regardless of platform (see references/output-schema.md for the full spec + platform-specific examples):
json{ "platform": "x", "url": "https://x.com/example/status/1234567890", "fetched_at": "2026-06-17T14:35:00Z", "raw_source": "scrapecreators", "author": { "handle": "@example", "name": "the user Ganim", "verified": true }, "posted_at": "2026-06-17T16:53:00Z", "text": "The 80/20 of a useful AI second brain: ...", "media": [], "engagement": { "likes": 51, "reposts": 13, "replies": 9, "bookmarks": 7, "views": 32700 }, "is_thread": true, "thread": [], "replies": [] }
Fields with no equivalent on a platform (e.g., bookmarks on Mastodon) get null, not 0. Missing data is different from zero data.
Based on flags / asks:
| Flag | Behavior | |---|---| | --with-replies | Fetch top-level replies (1 hop). Costs extra API quota. | | --thread | If the post is part of a thread by the same author, fetch the whole thread. | | --raw | Include the raw API/scrape response in the output (for debugging) | | --media | Download media files (images/videos) to ~/Documents/social-fetches/<platform>-<id>/ |
Default: just the post itself, no replies, no media download (just URLs).
If ~/Documents/social-fetches/_cache/ exists, cache successful fetches there by {platform}-{id}.json for 24h. Saves API quota when the same post is referenced repeatedly across skills.
Skip cache if --no-cache flag is set or for --with-replies / --thread (likely-stale).
deep-research — cite specific posts in research briefs. When research surfaces a relevant tweet/post URL, fetch and include in the brief.jab-hook — pull recent posts from inspiration accounts for deeper format analysis (currently uses agent-browser inline; should call this skill instead).business-brainstorm — pull competitor / operator commentary as evidence during scoring.second-brain — capture a post into raw/ with the tweet- / bookmark- prefix; the structured output makes for cleaner raw files than a screenshot or copy-paste.watch-video — for YouTube URLs (or any video — Loom, Vimeo, Riverside, MP4), route there instead.$SCRAPECREATORS_API_KEY or $APIFY_API_TOKEN.linkedin.com/posts/...) often need paid fallback.If a platform consistently fails on free strategies and the user uses it often, prompt to set up the paid key (see references/auth-keys.md).
~/Documents/social-fetches/_cache/ prevents API burn when the same post is referenced across multiple skills in a session. --with-replies / --thread skip cache because replies age fast.--media downloads images/videos. Silent media downloads eat disk quickly.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 7,266 | 15,457 | +113% | 1 | 1 | 0% | 1,314 | 4,541 | +246% | 0 | 0 | — |
case-02 | fail→fail | 24,838 | 4,540 | -82% | 1 | 1 | 0% | 5,268 | 2,431 | -54% | 0 | 0 | — |
case-03 | fail→pass | 8,587 | 11,099 | +29% | 1 | 1 | 0% | 1,585 | 4,020 | +154% | 0 | 0 | — |
case-04 | fail→pass | 7,496 | 4,680 | -38% | 1 | 1 | 0% | 1,513 | 2,477 | +64% | 0 | 0 | — |
case-05 | fail→fail | 7,015 | 11,979 | +71% | 1 | 1 | 0% | 1,198 | 3,944 | +229% | 0 | 0 | — |
case-06 | pass→pass | 5,890 | 4,856 | -18% | 1 | 1 | 0% | 881 | 2,506 | +184% | 0 | 0 | — |
case-07 | fail→pass | 9,948 | 8,119 | -18% | 1 | 1 | 0% | 1,746 | 3,340 | +91% | 0 | 0 | — |
case-08 | fail→pass | 5,221 | 7,391 | +42% | 1 | 1 | 0% | 718 | 3,111 | +333% | 0 | 0 | — |
case-09 | fail→fail | 10,217 | 8,207 | -20% | 1 | 1 | 0% | 1,690 | 2,264 | +34% | 0 | 0 | — |
case-10 | fail→fail | 8,991 | 19,351 | +115% | 1 | 1 | 0% | 1,466 | 3,650 | +149% | 0 | 0 | — |
case-11 | fail→pass | 7,635 | 8,421 | +10% | 1 | 1 | 0% | 1,135 | 3,386 | +198% | 0 | 0 | — |
case-12 | pass→pass | 11,663 | 6,370 | -45% | 1 | 1 | 0% | 2,279 | 3,056 | +34% | 0 | 0 | — |
case-13 | pass→pass | 14,876 | 11,890 | -20% | 1 | 1 | 0% | 2,492 | 3,907 | +57% | 0 | 0 | — |
case-14 | fail→pass | 7,347 | 9,638 | +31% | 1 | 1 | 0% | 1,292 | 3,692 | +186% | 0 | 0 | — |
case-15 | fail→pass | 6,437 | 13,177 | +105% | 1 | 1 | 0% | 1,150 | 3,467 | +201% | 0 | 0 | — |
case-16 | fail→pass | 14,813 | 16,035 | +8% | 1 | 1 | 0% | 2,914 | 4,175 | +43% | 0 | 0 | — |
case-17 | pass→pass | 3,134 | 3,205 | +2% | 1 | 1 | 0% | 463 | 2,272 | +391% | 0 | 0 | — |
case-18 | fail→pass | 9,428 | 6,914 | -27% | 1 | 1 | 0% | 1,570 | 2,895 | +84% | 0 | 0 | — |
case-19 | pass→pass | 4,187 | 6,993 | +67% | 1 | 1 | 0% | 544 | 2,920 | +437% | 0 | 0 | — |
case-20 | fail→fail | 5,224 | 4,213 | -19% | 1 | 1 | 0% | 696 | 2,417 | +247% | 0 | 0 | — |
case-21 | pass→pass | 4,827 | 6,477 | +34% | 1 | 1 | 0% | 662 | 2,836 | +328% | 0 | 0 | — |
case-22 | fail→pass | 3,790 | 4,873 | +29% | 1 | 1 | 0% | 600 | 2,613 | +336% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.