AnyPost
All guides
6 min read

Test it now: replace x.com with anypost.md in any post URL.

Xx.comXanypost.md

Before

https://x.com/NousResearch/status/2060085673848193127

After

https://anypost.md/x.com/NousResearch/status/2060085673848193127?thread=full

Try the live preview

How to convert an X post or thread to Markdown

Turn any X/Twitter post or thread into clean, portable Markdown. One URL swap gives you the full text and thread order — without scraping the X website.

Why not scrape X?

The website is a reader UI, not a clean export.

Copy-pasting from x.com or running a scraper on the page sounds simple, but you usually get layout noise, missing thread context, or numbers that do not match what you saw in the app.

ApproachWhat you get
Scrape x.comDOM clutter, partial threads, unreliable stats
anypost.mdOrdered Markdown with post text and metadata

01 — UI chrome
X pages ship nav, sidebars, suggested posts, login prompts, and cookie banners. Scraping the DOM means cleaning noise before you get to the content.

02 — Incomplete threads
Anonymous visitors often do not see the full thread. X may show only the target post, hide earlier self-replies, or stop the chain behind a sign-in wall.

03 — Stale stats
Engagement numbers scraped from the page can be wrong or stale — rounded counts, layout A/B tests, and client-rendered numbers that change after load.

Step-by-step workflow

01 — Copy the X/Twitter status URL
Use the permalink for the post you care about, or any post in the thread chain.

02 — Replace x.com with anypost.md
Swap the domain in the URL bar and open the page. Prefix the path with x/ (twitter.com URLs work the same way).

Before: https://x.com/jack/status/20
After:  https://anypost.md/x/jack/status/20?thread=full

Add ?thread=full to include the full same-author thread. Paid API keys (apk_…) unlock thread unrolling and author metadata; free tier is single-post only (5/month).

03 — Copy the Markdown output
The page returns plain Markdown (text/plain). Select all, or use your browser’s copy — no JSON to parse.

04 — Use the Markdown wherever you need plain text
Drop it into a doc, note, CMS, email draft, RAG pipeline, or any workflow that works better with structured text than a live URL.

Good for

Markdown is easy to search, diff, archive, and reuse. AnyPost gives you the post body, author handle, timestamps, media links, and thread order in one copy-pasteable block.

  • Save a thread in your notes app or knowledge base without copy-pasting post by post.
  • Quote or cite the exact wording in a blog post, newsletter, or research doc.
  • Archive a conversation before it gets deleted or buried in the timeline.
  • Paste structured text into ChatGPT, Claude, Gemini, Cursor, or any editor that accepts Markdown.

What you get

AnyPost fetches through platform adapters and proxy paths where needed (X often requires render/proxy — not plain HTTP). Output is consistent whether you use domain swap or the API.

# Nous Research (@NousResearch)

Hermes Agent v0.15.0 - "The Velocity Release"

Changelog below [pic.twitter.com/33YL6GmGyq](https://t.co/33YL6GmGyq)

[video](https://pbs.twimg.com/amplify_video_thumb/2060080166341169156/img/o3_PB2CIyewh4ADe.jpg)

---
2026-05-28 · X · [Original post](https://x.com/NousResearch/status/2060085673848193127)

Long-form X Articles use the same status permalink — AnyPost pulls the article body when the adapter supports it.

Under the hood

The domain swap is not a separate scraper — it calls the same backend as /api/convert. Next.js rebuilds https://x.com/…, forwards options, then returns only the markdown field as text/plain.

Paid options on a swapped URL

Append your key and options to the anypost URL (browser or script):

https://anypost.md/x/jack/status/20?thread=full&apikey=apk_live_xxx

Same with author metadata:

https://anypost.md/x/jack/status/20?thread=full&userinfo=author&apikey=apk_live_xxx

Scripts: catch-all (plain Markdown)

Use the swapped path when you want raw Markdown in the response body (no JSON wrapper):

# Query param auth
curl -sS "https://anypost.md/x/jack/status/20?thread=full&apikey=apk_live_xxx"

# Header auth (same route)
curl -sS -H "Authorization: Bearer apk_live_xxx" \
  "https://anypost.md/x/jack/status/20?thread=full"

Local dev (frontend on :3000, backend on :8000):

curl -sS -H "Authorization: Bearer apk_live_xxx" \
  "http://localhost:3000/x/jack/status/20?thread=full"

Scripts: /api/convert (JSON)

When you need credits, postCount, or other fields, pass the full x.com URL:

curl -sS -H "Authorization: Bearer apk_live_xxx" \
  "https://anypost.md/api/convert?url=https%3A%2F%2Fx.com%2Fjack%2Fstatus%2F20&thread=full"
Entry pointResponseBest for
/x/…/status/… (swap)text/plain MarkdownBrowser, curl pipes, agents that want a document
/api/convert?url=…JSON + markdownApps that need metadata and structured errors

See Documentation for all query params. The AI agents block at the bottom of this page includes the installable SKILL.md (tweet.md-style).

Next

AI agents

Want to use AnyPost from an agent for X posts? Give it the skill below plus your API key, and it can read any tweet or thread.

The skill instructs your agent to replace any x.com URL with anypost.md. Markdown output is optimized for LLMs, saving tokens.

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