Updated Sep 28, 2026
X hands you an archive with real gaps in it. Deleted tweets are not in there. DMs with suspended accounts are not in there. Media gets downscaled. Worth knowing before you treat the download as your record of what happened, and worth doing before you assume X will be there in a few years.
Top-level structure of the export. Each entry is a file or directory with its format badge and what it contains.
tweets.jsJSONlikes.jsJSONbookmarks.jsJSONdirect_messages.jsJSONaccount.jsJSONlists/JSONad-engagement-events.jsJSONad-impressions.jsJSONpersonalization.jsJSONmanifest.jsJSONX has had long stretches where the archive request simply never completed. Reports of requests sitting for weeks without a link are common, and the confirmation email itself is unreliable enough that people have been locked out of the flow entirely.
The practical advice is not to schedule this for the week before you might need it. If X is going to be part of your history, take the copy now, while it works, and take another one in six months.
Most of the archive is JavaScript, not JSON. The first line of tweets.js looks something like window.YTD.tweets.part0 = [...], which is a variable assignment wrapping a JSON array.
X does this so you can drop the file into a browser and read it without a parser. It is a reasonable idea and it means your archive is slightly awkward to work with, which is a trade-off you only notice once you need the data.
Export first, delete second, and wait until the link actually works before you delete anything. TechCrunch covered this while people were leaving X in bulk, and the practical point stands: once the account is gone, the archive cannot be retrieved.
There is no version of the order that is safe to get wrong.
If you want the short checklist instead of the full guide, use the service page.
Yes. They are in direct_messages.js, or in a direct-messages/ folder with one JSON file per conversation on older accounts. DMs with suspended accounts are excluded.
No. The archive is a snapshot of what existed when you requested it. Anything you deleted beforehand is not recoverable through this, or through anything else.
Strip the assignment: sed 's/window.YTD.tweets.part0 = //' tweets.js > tweets.json. Swap the variable name for likes.js and bookmarks.js. Or just open the index.html in the archive, which is readable as-is.
Either the other account has been suspended, or you deleted the conversation. X keeps DMs server-side until the relevant deletion happens on both ends, so a one-sided delete is not the full story.
Usually not. The archive carries downscaled versions. Originals are sometimes still reachable from the individual post URL, but they are not in the ZIP.
Minutes on a small account, days on a large one. X publishes no fixed deadline, and if it has not arrived after a few days, re-request rather than wait.
No. It makes a copy and changes nothing about your account.
Yes, and more of it than you might want. ad-impressions.js is every ad you were shown, ad-engagement-events.js is every one you clicked or replied to, and personalization.js is the list of interests X built to target you with.
No, the official export is account-wide. For one post, the permalink still works. For one conversation, you would be scrolling and screenshotting, which is not a backup but is what you have.
No. That is with your payment provider. Apple, Google and card issuers all have their own data exports, and for subscriptions that one is usually the only record.
Last verified: Sep 28, 2026. Steps checked against help.x.com. Report an outdated step →