AnyPost

Documentation

URL swap, agents, params, formats, and pricing. AnyPost turns social post URLs into clean Markdown.

URL rewrite

Swap the platform domain for anypost.md and prefix the path with the platform slug. A GET returns the post body as plain text Markdown (text/plain), not JSON.

https://x.com/jack/status/20              → https://anypost.md/x/jack/status/20
https://reddit.com/r/sub/comments/…       → https://anypost.md/reddit/r/sub/comments/…
https://bsky.app/profile/user/post/abc    → https://anypost.md/bluesky/profile/user/post/abc

Supported today: X, Reddit, Threads, Bluesky, Mastodon, Hacker News, YouTube, Substack. Coming soon: LinkedIn, Instagram, Medium (rewrite URLs work, but conversion returns 422 unsupported_platform until adapters ship).

Paid options (thread, comments, userinfo) require an API key — pass Authorization: Bearer apk_… or ?apikey=apk_… on the request.

AI agents

Want to use AnyPost from an agent? Give it the skill below plus your API key, and it can read any supported post.

The skill instructs your agent to rewrite social URLs to anypost.md (for X, replace x.com with anypost.md/x/…). Our Markdown output is optimized for LLMs, saving tokens.

Install the skill (npx skills add anypost-md/skill), then paste your apk_live_… or apk_test_… key from Login after purchase. Domain swap returns plain Markdown; /api/convert returns JSON with markdown, credits, platform, and postCount.

Quick rule for system prompts:

When you need the contents of a social post, rewrite its URL to
anypost.md/<platform>/<path> and GET it. You'll receive clean Markdown text.
For X threads, use anypost.md/x/.../status/...?thread=full&apikey=apk_…
or GET /api/convert?url=https://x.com/... with Authorization: Bearer apk_…

The full SKILL.md (frontmatter, triggers, examples) is below — same file as /i/skill.md.

SKILL.md

bash
npx skills add anypost-md/skill

From this repo: npx skills add . --path .cursor/skills/anypost-md

Or copy from anypost.md/i/skill.md · path .cursor/skills/anypost-md/

Full agent docs

Authentication

Paid conversions require an agent API key (apk_live_… after checkout, or apk_test_… in development). Two methods are supported on every convert request:

# Header (recommended)
-H "Authorization: Bearer apk_live_your_key"

# Query parameter (domain swap or /api/convert)
?apikey=apk_live_your_key

Login for Humans (Google via Firebase) creates your account and issues an API key once; store it in your agent or app — convert does not read browser cookies.

Keep secret keys server-side. Prefer the Authorization header over ?apikey= in URLs you might share.

Query params

Append to any anypost.md/<platform>/… URL (or to /api/convert?url=… with the same params). Free tier: a single post only (5 / month) — no thread, comments, or userinfo, and no apikey.

ParamDefaultValues
formatmarkdownmarkdown, obsidian
threadoffoff, full, or 2100 (author's own thread; paid + key)
commentsoffoff, on (10 replies), or 250 (paid + key)
userinfooffoff, author, all (+2 credits; paid + key)
apikeyapk_… (or Authorization: Bearer header)

All options default to off when omitted — set thread=full or userinfo=all explicitly for paid runs. thread unrolls the author's own posts where the platform supports it (best on Bluesky and Mastodon). comments adds a Comments section (Reddit, Hacker News, Bluesky, Mastodon). /api/convert also requires url (encoded source post URL).

Output formats

Append ?format= to any conversion URL. Omit it for markdown.

formatWhen to use
markdown (default)Readable notes with stats, media, quotes, and full long-form articles.
obsidianVault import: YAML frontmatter (source, author, tags) + a heading per post.

Inline media is rewritten to Markdown using public preview URLs — photos as images, videos and GIFs as labeled links:

![image](https://pbs.twimg.com/media/HJJrdtlWkAAiNAQ.jpg)
[video](https://pbs.twimg.com/tweet_video_thumb/abc123.jpg)
[animated_gif](https://pbs.twimg.com/tweet_video_thumb/HI6NThtWMAEYPhf.jpg)

Use markdown for agents, notes, and browsers; obsidian when importing into a vault.

Long-form articles

Use the normal post permalink (not a separate article URL). AnyPost pulls the full body where the platform adapter supports it — notably X posts and Substack articles. X long-form articles cost 10 credits (12 with author metadata); other posts stay 1 credit each.

https://x.com/trq212/status/2052809885763747935
→ https://anypost.md/x/trq212/status/2052809885763747935

The converted body is plain Markdown (domain swap) or the markdown field in the JSON response (/api/convert).

Pricing & credits

1 credit per item returned — the post itself, each additional post in a thread, and each scraped comment when only one paid option is on. X long-form articles, Reddit posts with comments, and thread + comments together each cost 10 credits flat. Author metadata adds a flat +2 credits when userinfo is on. Free use stays single-post only on Starter platforms.

PackPriceCreditsPer creditApprox. usage (with metadata)
Starter$5500$0.0100~166 posts
Pro$192,200$0.0086~733 posts
Scale$496,000$0.0082~2,000 posts
Agency$9920,000$0.00495~6,666 posts

Platform access: X tweets, Reddit, Bluesky, Mastodon, Hacker News, and YouTube work on all paid plans. X long-form articles, Substack, and Threads require Pro, Scale, or Agency (premium proxy paths).

Credit packs never expire. Examples: a 10-post thread with author metadata costs 12 credits; thread + comments with metadata costs 12 credits; an X long-form article or Reddit post with comments and metadata costs 12 credits; a Hacker News post with 8 comments (no thread) costs 9 credits (11 with metadata).

Error handling

AnyPost uses conventional HTTP status codes. Codes in the 2xx range indicate success; 4xx / 5xx indicate a problem with the request.

StatusMeaning
400Bad request — usually a missing or malformed url.
401Unauthorized — invalid or missing apk_ API key.
402Credits required — paid options without a key, free tier exhausted, or balance too low.
404Not found — the post is private, deleted, or unknown.
422Unsupported platform — no adapter for this URL yet.
429Rate limited — back off and retry (Retry-After header).
503Overloaded — too many concurrent conversions; retry shortly.

/api/convert returns JSON: {"code": "…", "message": "…"}.

Domain swap (anypost.md/<platform>/…) returns a plain-text error line on failure (same status codes).