Search & SEO · Coming soon

Wayback Machine Snapshots & Archived Text

Add a URL, a URL prefix or a domain. Get one row per capture with date, snapshot link, HTTP status and digest. You can also get the archived title and text.

Built and tested. Prices will be shown after release.

Coming soon to the Apify StoreFollow us on Apify

What you get, for example

inputUrlapify.com
matchTypeexact
originalUrlhttps://www.apify.com/

How it will work: 3 steps

  1. Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: apify.com in URLs or domains. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

Add a URL, a URL prefix or a whole domain. The Actor reads the Internet Archive Wayback Machine index and returns one row for each capture: date, snapshot link, HTTP status, MIME type and content digest. It can also return the archived page title and visible text.

Good for

  • SEO page history: see when a page was first captured, how its HTTP status changed (200 → 301 → 404), and what the old title and text said.
  • Recover deleted content: get the visible text of an old version of a page by date.
  • OSINT and site mapping: list the archived URLs of a site or all its subdomains with collapse: urlkey.
  • Change detection: keep only captures where content changed with collapse: digest.

Not a good fit

  • It does not take screenshots and does not save images, scripts or PDFs. Text is extracted only from successful (2xx) HTML or plain-text captures.
  • It does not search archive.org collections, books or media items. It works with the Wayback Machine web capture index only.
  • The archive does not have every page or every day. Missing captures mean the archive has none, not that the page did not exist.
  • E-mail addresses and phone numbers in archived text are replaced with [email removed] and [phone removed]. Phone masking covers international numbers (+44 20 7946 0958) and common national formats ((555) 123-4567, 555-123-4567, 020 7946 0958); unusual formats can stay.

Who uses it

SEO specialists

See when a page was first saved and how its status changed.

Researchers

Read the text of an old page version by date.

Security analysts

List archived URLs of a site and its subdomains.

Price

Prices will be shown after release.

Questions

Do I need a Wayback Machine account or key?

No. It uses the public index and archived pages. No login, key or cookies.

Why do I get fewer captures than I asked for?

maxSnapshots is a maximum. The archive may have fewer captures for your filters.

Does it take screenshots?

No. It does not save images, scripts or PDFs.

Is the archived content mine to reuse?

Pages belong to their publishers. You are responsible for how you use the results.

How fresh is the data?

Rows show what the Wayback Machine index has at run time. New captures can take hours or days to appear in the index.

I come from another Wayback Actor. How do the fields map?

queryUrl → inputUrl, archiveDate → capturedAt, archiveUrl → snapshotUrl, contentLength → length, contentDigest → digest, content → text. statusCode here is a number or null, not a string. A URL with no captures returns a not_found row instead of nothing.

Details

Step by step on Apify
  1. Open the Input tab.
  2. Keep the prefilled URLs value apify.com, or add your own site, for example example.com.
  3. Keep Max captures per URL at the prefill 20 (the default without prefill is 100).
  4. Click Start.
  5. Open the Output tab and check the Snapshots view: capturedAt, snapshotUrl and statusCode.
Use cases
TaskInputYou getKey fieldsNext step
Page history by monthurls, collapse: monthcapture rowcapturedAt, statusCode, snapshotUrlspreadsheet export
Old title and texturls, includeContent: true, statusFilter: 2xxcapture row with texttitle, text, textLengthcontent diff, LLM
All archived URLs of a siteurls: ["*.example.com"], collapse: urlkeyone row per URLoriginalUrl, capturedAtcrawl list, link audit
Content changes onlyurls, collapse: digestchanged capturesdigest, capturedAtchange log
Tips for better results
  • Use collapse digest to keep only captures where content changed.
  • Use collapse urlkey to list the archived URLs of a site.
  • Set a date range to keep the run small.
Limits and good to know
  • Page text for up to 300 captures per run, at most one archived page every 2 seconds; only the first 3 MB of a page are read (then textTruncated: true)
  • The Actor is polite to the archive: at most 1 request per second. The first "too many requests" answer stops all lookups; saved rows stay
  • URLs with no captures are slow to confirm: the archive can take 10–40 seconds per such URL
  • A partial row means the capture is real but the archive did not return its page text. You pay for the row, not for the text
  • A run with 100 URLs takes about 15–20 minutes (default timeout 30 minutes). 100 URLs × 3 captures with text (283 texts) took about 17 minutes
  • If one URL fails (for example a very large site the archive cannot list in time), it gets a free error row and the other URLs go on. The run still SUCCEEDS with reason: SOME_URLS_FAILED when fewer than half of the URLs failed
  • If the archive keeps failing, the run stops after two failed URLs in a row. Inputs not looked up get a free error row with statusReason: Not looked up, and the run ends as FAILED with the saved rows kept

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "inputUrl": "apify.com",
  "matchType": "exact",
  "originalUrl": "https://www.apify.com/",
  "urlKey": "com,apify)/",
  "timestamp": "20190102020849",
  "capturedAt": "2019-01-02T02:08:49Z",
  "snapshotUrl": "https://web.archive.org/web/20190102020849/https://www.apify.com/",
  "statusCode": 200,
  "mimeType": "text/html",
  "digest": "27TX5UTLMOMOW6O2BSAYXOR4RR73LSCN",
  "length": 10491,
  "title": "Web Scraping, Data Extraction and Automation - Apify",
  "text": "Library Docs Pricing Case studies About Contact Log in Sign up Go to app The web…",
  "textLength": 6840,
  "textTruncated": true,
  "contentStatus": "ok",
  "status": "complete",
  "statusReason": null,
  "errorCode": null,
  "sourceUrl": "https://web.archive.org/cdx/search/cdx?url=apify.com&output=json&fl=urlkey%2Ctimestamp%2Coriginal%2Cmimetype%2Cstatuscode%2Cdigest%2Clength&from=2019&to=2024&collapse=timestamp%3A4&filter=statuscode%3A2..&limit=10&showResumeKey=true",
  "fetchedAt": "2026-10-17T10:33:45Z"
}
Data fields (21)
FieldTypeMeaning
inputUrlstringYour URL or domain as given.
matchTypestringHow the input was matched: exact, prefix, host or domain.
statusstringRow result: complete, partial (index data complete but archived text missing), not_found (no captures) or error. See statusReason.
statusReasonstringPlain-English reason for partial, not_found, error or skipped-text rows; null otherwise.
errorCodestringMachine code for errors, e.g. RATE_LIMITED, SOURCE_UNAVAILABLE, SOURCE_TIMEOUT, SOURCE_EXCLUDED (site excluded from the archive, free row); null otherwise.
originalUrlstringThe exact URL the archive captured (scheme, www and port as crawled).
urlKeystringArchive index key (SURT form) of the URL.
timestampstringCapture time as the 14-digit Wayback timestamp yyyyMMddhhmmss (UTC).
capturedAtstringCapture time as ISO 8601 UTC.
snapshotUrlstringLink to open this capture in the Wayback Machine.
statusCodeintegerHTTP status the archived server returned; null for revisit records without a status.
mimeTypestringMIME type of the capture, e.g. text/html; warc/revisit marks a duplicate of an earlier capture.
digeststringSHA-1 content digest (base32). Same digest = same archived content.
lengthintegerSize of the compressed archive record in bytes (not the page size).
titlestringArchived page title (only with page text).
textstringVisible text of the archived page, cut to Max text characters (only with page text).
textLengthintegerFull length of the extracted text in characters before cutting.
textTruncatedbooleantrue when text was cut to Max text characters.
contentStatusstringPage text result: not_requested, ok, empty (no visible text, not charged), skipped_not_text, skipped_not_2xx, skipped_limit, unavailable or error.
sourceUrlstringWayback CDX index request that returned this row.
fetchedAtstringWhen this row was fetched from the archive (ISO 8601 UTC).
Input settings (11)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
URLs or domains requiredurlsarray["apify.com"]
MatchmatchTypestring"exact"
From datefromstring
To datetostring
Deduplicatecollapsestring"none"
HTTP statusstatusFilterstring"any"
HTML pages onlyonlyHtmlbooleanfalse
OrdersortOrderstring"oldest"
Max snapshots per URLmaxSnapshotsinteger20
Include archived page textincludeContentbooleanfalse
Max text charactersmaxContentCharsinteger5000

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure