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, 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

ToolPurpose
convert_post{ url, format?, thread?, comments?, userinfo? } → Markdown result
list_supported_platformsLive 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.

MethodWhere tools liveBest for
Classic MCPSeparate MCP serverIDE agents, backend jobs, CI, external services
WebMCPOpen browser pageBrowser agents acting on the current site

Enable in Chrome (preview)

  1. Install Chrome 146+ Canary.
  2. Open chrome://flags and enable WebMCP (or the origin trial for your build).
  3. Reload anypost.md or Live preview.
  4. Ask your browser agent to call convert_post with 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

MethodBest for
WebMCP (convert_post)Browser agents with an open anypost.md tab
Domain swapcurl, scripts, any HTTP client, returns text/plain
/api/convertServer-side agents, JSON with markdown field
/i/skill.mdCursor, 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.

Install 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.

bash
npx skills add AnyPostMD/anypost --skill anypost-md -y

Global (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.

bash
mkdir -p skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o skills/anypost-md/SKILL.md

Install from GitHub raw

Same SKILL.md as in the public repo — useful before deploy or for pinned installs.

bash
mkdir -p skills/anypost-md && curl -fsSL https://raw.githubusercontent.com/AnyPostMD/anypost/main/skills/anypost-md/SKILL.md -o skills/anypost-md/SKILL.md

Global install: mkdir -p skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o skills/anypost-md/SKILL.md

Per-agent

Cursor

bash
mkdir -p .cursor/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .cursor/skills/anypost-md/SKILL.md

Claude Code

bash
mkdir -p .claude/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .claude/skills/anypost-md/SKILL.md

Codex (ChatGPT)

bash
mkdir -p .agents/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .agents/skills/anypost-md/SKILL.md

OpenCode

bash
mkdir -p .opencode/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .opencode/skills/anypost-md/SKILL.md

OpenClaw

bash
mkdir -p skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o skills/anypost-md/SKILL.md

Windsurf

bash
mkdir -p .windsurf/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .windsurf/skills/anypost-md/SKILL.md

Gemini CLI

bash
mkdir -p .gemini/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .gemini/skills/anypost-md/SKILL.md

Factory

bash
mkdir -p .factory/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .factory/skills/anypost-md/SKILL.md

Kiro

bash
mkdir -p .kiro/skills/anypost-md && curl -fsSL https://anypost.md/i/skill.md -o .kiro/skills/anypost-md/SKILL.md

Skill 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).

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)
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.

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 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).

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 by plan, one row per source; roadmap items marked coming soon.

PlatformStarterProScaleAgency
X (tweets)
Reddit
Bluesky
Mastodon
Hacker News
YouTube
Medium
X long-form articles
Substack
Threads
LinkedIn
Instagram
Facebook
Pinterest
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.

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, or this URL is not supported 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).