Export an X Long-Form Article as Markdown
Convert X's long-form articles and note tweets to clean Markdown — headings, links, and media references intact.

X's long-form posts are real articles — they deserve a real export path. Thirdwatch's Tweet to Markdown converts public X posts — including long-form articles — to clean Markdown with author and engagement metadata, through a guest path that needs no login.
Skip the setup: Run this as a ready-to-go task on Apify — pre-loaded with the configuration from this guide.
Why export a long-form article
Long-form posts on X are some of the platform's best writing and none of them have a copyable surface — the composer wraps them in a custom viewer. Screenshots aren't archival.
The converter handles the article format specifically: the Markdown row contains the full body, and isArticle tells you it was long-form.
The converter resolves each status URL through X's guest API and renders the body as Markdown, so the archive path is a URL list in and Markdown rows out.
How does this compare to the alternatives?
| Approach | Cost model | Output | Effort |
|---|---|---|---|
| Copy-paste into a doc | Free | Unformatted text | One post at a time |
| X API v2 | Paid tiers, auth | JSON you must convert yourself | App approval + keys |
| Thirdwatch Tweet to Markdown | Pay per post | Clean Markdown + engagement | Paste a URL, run |
Why this Actor
- Long-form support — note tweets and X articles, not just 280-character posts.
- Clean Markdown output: links, headings, and media references preserved.
- No login or cookies — the guest path is used.
- Engagement counts (replies, reposts, likes) land on every row.
- Batch input converts a reading list in one run.
How to do it in 3 steps
Step 1: Configure the input
Set the inputs as shown below — urls takes the targets, each entry is an x.com or twitter.com status URL.
Step 2: Run the Actor
Run it from the console, the API, or the linked saved task. One dataset row is written per post.
Step 3: Use the output
Each row carries the post body as markdown, the author handle and display name, timestamp, engagement counts, and an isArticle flag for long-form posts.
{
"urls": [
"https://x.com/jack/status/20"
]
}Each dataset row looks like:
{
"id": "20",
"url": "https://x.com/jack/status/20",
"author": "jack",
"authorName": "jack",
"createdAt": "2006-03-21T20:50:14.000Z",
"isArticle": false,
"markdown": "just setting up my twttr",
"replyCount": 12000,
"retweetCount": 95000,
"favoriteCount": 180000
}What to watch for
Public posts only — protected accounts and deleted tweets return error rows. The guest path occasionally rate-limits; retry error rows rather than treating them as permanent failures.
Related use cases
- Convert an X Post to Clean Markdown
- Convert a Batch of X Posts to Markdown in One Run
- Feed X Posts to an LLM as Clean Markdown
- Snapshot a Post's Engagement Alongside Its Markdown
- All Thirdwatch use-case guides
Run the Tweet to Markdown on Apify Store — pay per result, free to try, no credit card to test.
Frequently asked questions
Does it handle long-form X articles?
Yes — long-form posts and note tweets convert fully, and `isArticle` flags them on the row.
Do I need an X account or API key?
No — the Actor uses the public guest path, so there is no auth to manage.
What about protected or deleted posts?
They return `error` rows — public posts only.
Are links and media preserved?
Links become Markdown links and media attachments are referenced in the body; the row is meant for text-first pipelines.
Why did a post fail once but work on retry?
The guest path is occasionally rate-limited; transient failures come back as `error` rows worth a retry.
Can I convert a whole thread?
Pass each status URL in the thread — each becomes its own Markdown row, ordered by your input list.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.