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
npx skills add anypost-md/skillFrom this repo: npx skills add . --path .cursor/skills/anypost-md
Or copy from anypost.md/i/skill.md · path .cursor/skills/anypost-md/
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
Authorizationheader 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.
| Param | Default | Values |
|---|---|---|
format | markdown | markdown, obsidian |
thread | off | off, full, or 2–100 (author's own thread; paid + key) |
comments | off | off, on (10 replies), or 2–50 (paid + key) |
userinfo | off | off, author, all (+2 credits; paid + key) |
apikey | — | apk_… (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.
| format | When to use |
|---|---|
markdown (default) | Readable notes with stats, media, quotes, and full long-form articles. |
obsidian | Vault 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:

[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.
| Pack | Price | Credits | Per credit | Approx. usage (with metadata) |
|---|---|---|---|---|
| Starter | $5 | 500 | $0.0100 | ~166 posts |
| Pro | $19 | 2,200 | $0.0086 | ~733 posts |
| Scale | $49 | 6,000 | $0.0082 | ~2,000 posts |
| Agency | $99 | 20,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.
| Status | Meaning |
|---|---|
400 | Bad request — usually a missing or malformed url. |
401 | Unauthorized — invalid or missing apk_ API key. |
402 | Credits required — paid options without a key, free tier exhausted, or balance too low. |
404 | Not found — the post is private, deleted, or unknown. |
422 | Unsupported platform — no adapter for this URL yet. |
429 | Rate limited — back off and retry (Retry-After header). |
503 | Overloaded — 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).