How it will work: 3 steps
- 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.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
apify.comin URLs or domains. Each start is one run. - 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
- Open the Input tab.
- Keep the prefilled URLs value
apify.com, or add your own site, for exampleexample.com. - Keep Max captures per URL at the prefill
20(the default without prefill is100). - Click Start.
- Open the Output tab and check the Snapshots view:
capturedAt,snapshotUrlandstatusCode.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Page history by month | urls, collapse: month | capture row | capturedAt, statusCode, snapshotUrl | spreadsheet export |
| Old title and text | urls, includeContent: true, statusFilter: 2xx | capture row with text | title, text, textLength | content diff, LLM |
| All archived URLs of a site | urls: ["*.example.com"], collapse: urlkey | one row per URL | originalUrl, capturedAt | crawl list, link audit |
| Content changes only | urls, collapse: digest | changed captures | digest, capturedAt | change 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
partialrow 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
errorrow and the other URLs go on. The run still SUCCEEDS withreason: SOME_URLS_FAILEDwhen 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
errorrow withstatusReason: 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.
{
"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)
| Field | Type | Meaning |
|---|---|---|
inputUrl | string | Your URL or domain as given. |
matchType | string | How the input was matched: exact, prefix, host or domain. |
status | string | Row result: complete, partial (index data complete but archived text missing), not_found (no captures) or error. See statusReason. |
statusReason | string | Plain-English reason for partial, not_found, error or skipped-text rows; null otherwise. |
errorCode | string | Machine code for errors, e.g. RATE_LIMITED, SOURCE_UNAVAILABLE, SOURCE_TIMEOUT, SOURCE_EXCLUDED (site excluded from the archive, free row); null otherwise. |
originalUrl | string | The exact URL the archive captured (scheme, www and port as crawled). |
urlKey | string | Archive index key (SURT form) of the URL. |
timestamp | string | Capture time as the 14-digit Wayback timestamp yyyyMMddhhmmss (UTC). |
capturedAt | string | Capture time as ISO 8601 UTC. |
snapshotUrl | string | Link to open this capture in the Wayback Machine. |
statusCode | integer | HTTP status the archived server returned; null for revisit records without a status. |
mimeType | string | MIME type of the capture, e.g. text/html; warc/revisit marks a duplicate of an earlier capture. |
digest | string | SHA-1 content digest (base32). Same digest = same archived content. |
length | integer | Size of the compressed archive record in bytes (not the page size). |
title | string | Archived page title (only with page text). |
text | string | Visible text of the archived page, cut to Max text characters (only with page text). |
textLength | integer | Full length of the extracted text in characters before cutting. |
textTruncated | boolean | true when text was cut to Max text characters. |
contentStatus | string | Page text result: not_requested, ok, empty (no visible text, not charged), skipped_not_text, skipped_not_2xx, skipped_limit, unavailable or error. |
sourceUrl | string | Wayback CDX index request that returned this row. |
fetchedAt | string | When 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.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| URLs or domains required | urls | array | ["apify.com"] |
| Match | matchType | string | "exact" |
| From date | from | string | |
| To date | to | string | |
| Deduplicate | collapse | string | "none" |
| HTTP status | statusFilter | string | "any" |
| HTML pages only | onlyHtml | boolean | false |
| Order | sortOrder | string | "oldest" |
| Max snapshots per URL | maxSnapshots | integer | 20 |
| Include archived page text | includeContent | boolean | false |
| Max text characters | maxContentChars | integer | 5000 |