Test it now: replace x.com with anypost.md in any post URL.
Before
https://x.com/NousResearch/status/2060085673848193127
After
https://anypost.md/x.com/NousResearch/status/2060085673848193127?thread=full
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.
| Approach | What you get |
|---|---|
| Scrape x.com | DOM clutter, partial threads, unreliable stats |
| anypost.md | Ordered 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 point | Response | Best for |
|---|---|---|
/x/…/status/… (swap) | text/plain Markdown | Browser, curl pipes, agents that want a document |
/api/convert?url=… | JSON + markdown | Apps 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
- Feed context to AI models — paste threads into ChatGPT, Claude, and Cursor without brittle links.
- Archive posts into Obsidian —
?format=obsidianwith YAML frontmatter. - Convert any post to Markdown — same trick for Reddit, Bluesky, Threads, and more.
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
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/