social-fetch
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), Wayback Machine (older posts), paid APIs (ScrapeCreators / Apify — only if env keys present). Triggers on "/social-fetch <url>," "fetch this tweet," "fetch this post," "what does this LinkedIn say," "read this thread," "pull this post." Used by deep-research (citing specific posts), jab-hook (inspiration account analysis), business-brainstorm (competitor / operator commentary).
NPX Install
npx skill4agent add coreyhaines31/makerskills social-fetchTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →/social-fetch — Pull any social post by URL
Step 1 — Detect platform
| URL pattern | Platform |
|---|---|
| x (Twitter) |
| |
| linkedin-profile |
| |
| tiktok |
| bluesky |
| |
| mastodon |
| threads |
| hn |
| → defer to |
Step 2 — Pick strategy chain
references/strategies.md- Free strategies first (direct APIs, agent-browser)
- Paid only as fallback (ScrapeCreators / Apify) — and only if the env key is set
- Bluesky / Mastodon / HN / Reddit are free + reliable (public APIs)
- X / LinkedIn / Instagram / TikTok / Threads need paid or scraping fallback for full data
Step 3 — Execute strategy
- Try it
- If success: parse → normalize → return
- If failure (404, 402, auth wall, empty response): note the failure and try the next strategy
$SCRAPECREATORS_API_KEYreferences/auth-keys.mdStep 4 — Normalize output
references/output-schema.md{
"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": []
}bookmarksnull0Step 5 — Optional enrichments
| Flag | Behavior |
|---|---|
| Fetch top-level replies (1 hop). Costs extra API quota. |
| If the post is part of a thread by the same author, fetch the whole thread. |
| Include the raw API/scrape response in the output (for debugging) |
| Download media files (images/videos) to |
Step 6 — Cache (optional)
~/Documents/social-fetches/_cache/{platform}-{id}.json--no-cache--with-replies--threadComposes with
- — cite specific posts in research briefs. When research surfaces a relevant tweet/post URL, fetch and include in the brief.
deep-research - — pull recent posts from inspiration accounts for deeper format analysis (currently uses agent-browser inline; should call this skill instead).
jab-hook - — pull competitor / operator commentary as evidence during scoring.
business-brainstorm - — capture a post into
second-brainwith theraw//tweet-prefix; the structured output makes for cleaner raw files than a screenshot or copy-paste.bookmark- - — for YouTube URLs (or any video — Loom, Vimeo, Riverside, MP4), route there instead.
watch-video
Known limits
- X: free strategies return tweet preview only (text, author, basic engagement). Full thread + replies need or
$SCRAPECREATORS_API_KEY.$APIFY_API_TOKEN - LinkedIn: agent-browser works for profile recent-activity (after dismissing the modal). Specific post URLs () often need paid fallback.
linkedin.com/posts/... - Instagram / TikTok / Threads: heavy anti-bot. Paid fallback strongly recommended.
- Bluesky / Mastodon / HN / Reddit: free + reliable.
- Private / deleted posts: nothing helps. Try Wayback Machine for deleted content.
references/auth-keys.mdNotes on quality
- Strategy chain, not single-source. Every platform has a fallback ladder (native oEmbed → agent-browser → SCS API → Apify). If one step fails, degrade gracefully to the next. Never fail hard on the first attempt.
- Structured output over screenshots. Downstream skills (jab-hook, deep-research, second-brain) need JSON with author + text + engagement fields, not an image. Even when the underlying strategy is a screenshot, extract text before returning.
- Cache aggressively, invalidate honestly. 24h TTL on prevents API burn when the same post is referenced across multiple skills in a session.
~/Documents/social-fetches/_cache//--with-repliesskip cache because replies age fast.--thread - Respect paid-key economics. ScrapeCreators / Apify calls cost real money. Prompt before hitting paid strategies if the user hasn't confirmed they want depth. Free strategies first, always.
- Media download is opt-in. Default is post text only; downloads images/videos. Silent media downloads eat disk quickly.
--media - Private / deleted content is a hard stop. No strategy chain rescues private accounts or deleted posts. Suggest Wayback Machine for deleted content and stop.
- Rate-limits are per-platform. X free strategies hit rate limits fast; LinkedIn agent-browser burns session fingerprints. Space out calls in loops or the workflow degrades to worse-than-manual.