# Tweet Archive > Paste a tweet URL to view it and get a permanent Wayback Machine snapshot, so > the tweet survives even if it's deleted from X. Free, no account required. How to use: 1) Paste a tweet URL on the homepage 2) View the tweet 3) A Wayback Machine capture is automatically requested in the background. Pricing: Free, unlimited, no account required. ## How it works - Reads tweets via X's free public syndication API. Regular tweets show in full; X Premium "long tweets" are truncated to a preview, the same limitation X's own oEmbed widget has. Callers with their own X API access can avoid this -- see x_bearer_token below. - Every view of a tweet's page schedules an archive.org (Wayback Machine) capture in the background, throttled so repeat views don't spam archive.org. - A tweet can have many archived versions, not just one: it's resubmitted whenever its text or media changes, and every past capture stays listed on the tweet's page. - If a tweet is later found removed from X, its content stops being shown and only the link to its most recent archived snapshot remains. - A daily background check revisits tweets that stop getting organic views, so archives stay current even without traffic. ## API AI agents and scripts can archive tweets directly, no key or account required. `POST /api/v1/tweets` Body: `{"urls": ["", ...]}`, 1-10 items per request. Returns a JSON array, same order as the input, one entry per URL: either the tweet (see shape below) or `{"input": "...", "error": "..."}` for anything unparseable or unfetchable. A bad item never fails the rest of the batch. Archiving happens in the background after the response -- snapshots may still be empty right away; poll the GET endpoint below. Without a token, text over ~280 characters gets trimmed (see "How it works" above). If you have your own X API access, pass it: it costs nothing extra for a normal-length tweet, and it means the tweet gets archived in full instead of truncated -- a better permanent record for anyone who looks it up later, not just for you. Two optional fields apply to the whole request: - `x_bearer_token`: your own X API Bearer Token, for full-length tweets. Only spent when actually needed -- the free API runs first, and your token is only used if that result is truncated or fails outright, so a normal-length tweet costs you nothing even if you supply one. - `agent`: a name to self-identify as (e.g. "my-bot/1.0"), recorded on the archive for attribution. Falls back to your User-Agent if omitted. `GET /api/v1/tweets/{id}` Read-only status/poll endpoint, no side effects. 404 if the ID has never been seen. `POST /api/v1/tweets/{id}/thread/check` and `.../thread/ingest` Pull in the tweets around `{id}`, not just that one tweet: what it's replying to (ancestors -- always free, no key, walked backward one tweet at a time) and/or the author's own continuation tweets (forward -- needs `x_bearer_token`; `check` pays for exactly one X API search call to find the author's latest reply in the conversation, then walks backward from it for free, so a whole thread costs about one search call regardless of length). `check` returns a free preview (every discovered tweet's text, whether it's truncated, and a real cost estimate for upgrading the truncated ones); `ingest` actually archives everything -- calling it at all is the confirmation, no separate confirm flag. Full request/response shapes are in /SKILL.md. Response shape (one tweet): ``` { "id": "2095401070080184644", "status": "live" | "removed", "tweet": { ...raw syndication payload... } | null, "truncated": false, "note": "present only when truncated -- explains how to get the full text", "archive_url": "https://x-dot-com-archive.vercel.app/tweets/2095401070080184644", "first_archived_at": "2026-09-01T09:00:00.000Z", "removed_at": null, "removed_snapshot": null, "snapshots": [ { "wayback_url": "...", "archived_at": "...", "screenshot_url": "..." | null, "event": "created" | "edited" } ] } ``` `snapshots` is newest-first; `snapshots[0]` is the latest capture, `snapshots.length` is the count. `tweet` is `null` once a tweet has been removed from X. `first_archived_at` is when we first archived it (not the tweet's own X creation time). `removed_at`/`removed_snapshot` are set once removed -- `removed_snapshot` is the archived version live right before that; both null while live, and `removed_at` can be null even when `status` is `"removed"` for tweets removed before this field existed. No authentication and no rate limiting yet -- be a reasonable citizen. Rate limiting is planned; this section will be updated when it ships. A ready-to-use skill file for agent frameworks: /SKILL.md An OpenAPI 3.1 spec (for GPT Actions and similar tool-calling frameworks): /openapi.json Human/agent-readable docs with examples: /agents