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, Medium (paid fetch, Medium requires an API key), LinkedIn (public guest posts; Pro+ plan), Instagram (public posts and reels; Pro+ plan).
Paid options (thread, comments, userinfo) require an API key, pass
Authorization: Bearer apk_… or ?apikey=apk_… on the request.
WebMCP
AnyPost registers WebMCP tools on every page. Browser agents discover convert_post and list_supported_platforms while your tab is open, then call them with JSON input. The same conversion runs as domain swap and /api/convert.
Tools registered on every page
| Tool | Purpose |
|---|---|
convert_post | { url, format?, thread?, comments?, userinfo? } → Markdown result |
list_supported_platforms | Live platform list, plan gates, HTTP fallbacks |
Tools register automatically when you load any page on anypost.md in a
WebMCP-capable browser. The tab must stay open, unlike /api/convert, WebMCP
tools are not available headlessly.
WebMCP vs classic MCP
Classic MCP runs as a separate server that your IDE or agent connects to through its MCP settings. It is best for headless workflows, CI, local tools, databases, analytics, and documentation lookups. The agent does not need an open website tab.
WebMCP is page-native. The website registers tools inside the browser through
document.modelContext.registerTool(), and a browser agent can call those tools
only while the anypost.md tab is open.
| Method | Where tools live | Best for |
|---|---|---|
| Classic MCP | Separate MCP server | IDE agents, backend jobs, CI, external services |
| WebMCP | Open browser page | Browser agents acting on the current site |
Enable in Chrome (preview)
- Install Chrome 146+ Canary.
- Open
chrome://flagsand enable WebMCP (or the origin trial for your build). - Reload anypost.md or Live preview.
- Ask your browser agent to call
convert_postwith a post URL.
WebMCP is an early browser preview (Chrome Canary, tools permission). Headless agents should keep using domain swap, /api/convert, or the anypost-md skill.
Auth and billing
WebMCP execute handlers call the same /api/convert route as the preview UI.
If you logged in with Login for Agents and saved an apk_ key, paid options
(thread=full, comments=on, userinfo) work automatically. Free tier stays
single-post only (10/day in production).
When to use WebMCP vs HTTP
| Method | Best for |
|---|---|
WebMCP (convert_post) | Browser agents with an open anypost.md tab |
| Domain swap | curl, scripts, any HTTP client, returns text/plain |
| /api/convert | Server-side agents, JSON with markdown field |
| /i/skill.md | Cursor, Codex, OpenClaw, installable agent skill |
Spec: WebMCP draft
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 (curl -fsSL https://anypost.md/i/skill.md into your agent's skills folder, see install page), 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 in the
anypost-md agent skill file.
Markdown → social (Compose)
Compose at /compose is a free browser editor — not part of the
apk_ API. Write markdown, preview for LinkedIn, X, Instagram, and other
networks, then copy paste-ready posts. Guest drafts stay in local storage.
Use it when an agent or human already has Markdown and needs platform-ready
copy. Browse all free tools at /free-tools, including the
/llms.txt generator for your domain's AI index, the
/DESIGN.md generator for agent-ready design-system docs, and the
/JSON-LD extractor to audit Schema.org markup on your pages, and the
/website font finder to list font-family rules from a page URL or paste.
Skill URLs
Live on anypost.md
https://anypost.md/i/skill.mdGitHub raw (main branch)
https://raw.githubusercontent.com/AnyPostMD/anypost/main/skills/anypost-md/SKILL.mdInstall with npx skills (recommended)
Same flow as npx skills add anthropics/skills --skill …. Installs from the open AnyPostMD/anypostrepo into your agent's skills folder.
npx skills add AnyPostMD/anypost --skill anypost-md -yGlobal (all projects): npx skills add AnyPostMD/anypost --skill anypost-md -g -y
Quick install (live URL)
Downloads to skills/ — copy the folder into your agent's path below. Paste your API key at Login for Agents.
mkdir -p skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o skills/anypost-md/SKILL.mdInstall from GitHub raw
Same SKILL.md as in the public repo — useful before deploy or for pinned installs.
mkdir -p skills/anypost-md && curl -fsSL https://raw.githubusercontent.com/AnyPostMD/anypost/main/skills/anypost-md/SKILL.md -o skills/anypost-md/SKILL.mdGlobal install: mkdir -p skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o skills/anypost-md/SKILL.md
Per-agent
Cursor
mkdir -p .cursor/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .cursor/skills/anypost-md/SKILL.mdClaude Code
mkdir -p .claude/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .claude/skills/anypost-md/SKILL.mdCodex (ChatGPT)
mkdir -p .agents/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .agents/skills/anypost-md/SKILL.mdOpenCode
mkdir -p .opencode/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .opencode/skills/anypost-md/SKILL.mdOpenClaw
mkdir -p skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o skills/anypost-md/SKILL.mdWindsurf
mkdir -p .windsurf/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .windsurf/skills/anypost-md/SKILL.mdGemini CLI
mkdir -p .gemini/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .gemini/skills/anypost-md/SKILL.mdFactory
mkdir -p .factory/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .factory/skills/anypost-md/SKILL.mdKiro
mkdir -p .kiro/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .kiro/skills/anypost-md/SKILL.mdSkill file: anypost-md agent skill file (SKILL.md)
Agents: curl https://anypost.md/i/skill.md and install into your agent's skills directory.
Humans: run mkdir -p skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o skills/anypost-md/SKILL.md or open /i/skill.
After install, read SKILL.md and add your apk_ key for paid options (threads, comments, author metadata).
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, Threads, LinkedIn). /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 supports long-form content, notably X posts and Substack articles. Medium articles cost 6 credits (8 with author metadata) and require an API key. 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. Medium
articles cost 6 credits flat (API key required). 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 (not Medium).
| 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 by plan, one row per source; roadmap items marked coming soon.
| Platform | Starter | Pro | Scale | Agency |
|---|---|---|---|---|
| X (tweets) | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | |
| Bluesky | ✓ | ✓ | ✓ | ✓ |
| Mastodon | ✓ | ✓ | ✓ | ✓ |
| Hacker News | ✓ | ✓ | ✓ | ✓ |
| YouTube | ✓ | ✓ | ✓ | ✓ |
| Medium | ✓ | ✓ | ✓ | ✓ |
| X long-form articles | — | ✓ | ✓ | ✓ |
| Substack | — | ✓ | ✓ | ✓ |
| Threads | — | ✓ | ✓ | ✓ |
| — | ✓ | ✓ | ✓ | |
| — | ✓ | ✓ | ✓ | |
| — | ✓ | ✓ | ✓ | |
| — | ✓ | ✓ | ✓ | |
| TikTok | — | ✓ | ✓ | ✓ |
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, or this URL is not supported 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).