Wayback Machine Search avatar

Wayback Machine Search

Pricing

from $0.80 / 1,000 archive outputs

Go to Apify Store
Wayback Machine Search

Wayback Machine Search

Search Wayback Machine snapshots for URLs, hosts, and domains. Export archive dates, status codes, MIME types, digests, page text, version timelines, reports, and monitoring alerts.

Pricing

from $0.80 / 1,000 archive outputs

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Share

🕰️ Trace a website's archived history

Wayback Machine Search helps SEO teams, researchers, site owners, and developers review the history of public URLs and domains in the Internet Archive Wayback Machine. It returns dated archive captures with original URLs, playback links, HTTP status, MIME type, content digests, sizes, optional page text, change evidence, timelines, summaries, and monitoring alerts. This gives you source-backed rows for archive research, audits, and change checks.

📦 Explore capture and change history

Returned data

The dataset uses recordType to identify snapshot, version, summary, or alert rows. Snapshot rows keep the submitted target, original archived URL, openable Wayback playback URL, source timestamp, ISO archive date, HTTP status, MIME type, content digest, and content length. They can also include readable archived text, text status, distance from a target date, and mechanical change evidence.

Version rows group successive captures into timeline intervals. Summary rows collect target counts, date ranges, coverage details, discovered paths, subdomains, emails, and the source filters used for the run. Alert rows keep the selected trigger, earlier archive state, and a short message. Fields that do not apply to a row are returned as null.

Changes are based on archive status, content digest, content length, or available fetched text. They are source-backed and deterministic. The Internet Archive may not have a capture for every page or date, so the returned history may be partial. This Actor does not crawl the current live web, create new Wayback captures, make visual screenshot diffs, or write AI summaries.

Run steps

  1. Add one or more URLs or domains in URLs or domains. You can submit up to 50 targets, and they share one scope and filter set.
  2. Choose Archive scope: exact URL, URL prefix, same host, or same domain and subdomains.
  3. Set optional archive dates, HTTP status, and MIME filters.
  4. Choose an output view: raw snapshots, changed snapshots, a version timeline, the closest snapshot to a date, a Markdown report, or monitoring alerts.
  5. Turn on Fetch archived page text when you need readable text. Add a phrase in History search phrase to focus on fetched archive text.
  6. Run the Actor and open the dataset or the optional Markdown report.

Set maxResults to a positive number when you want fewer rows. Leave it empty to return all available results until the source is exhausted. When text fetching is on, leave maxContentFetch empty to fetch all available results until the source is exhausted. A metadata-only run leaves Fetch archived page text off.

⚙️ Input

The public input requires outputMode and targets. All targets in one run use the same archive scope and filters. Settings that do not apply to the chosen view are ignored.

Input fields

FieldTypeWhat it does
outputModestringRequired. Choose snapshots, changes, timeline, closestDate, report, or monitoring.
targetDatestringDate for the closest archived capture. Use YYYY, YYYYMM, YYYYMMDD, YYYY-MM, or YYYY-MM-DD. Other views ignore it.
alertOnstringSelect none, anyNewArchiveRow, statusChange, contentChange, statusOrContent, or pageRemovedOrRestored for monitoring alerts. Other views ignore it.
targetsarray of stringsRequired. Add 1 to 50 URLs or domains to search.
maxResultsintegerOptional positive row limit for each target. Report and monitoring views also use it for snapshot details. Leave it empty to return all available results until the source is exhausted.
matchTypestringChoose exact, prefix, host, or domain to set how broadly each target matches archived URLs.
dateFromstringFirst archive date to include. Use YYYY, YYYYMM, YYYYMMDD, YYYY-MM, or YYYY-MM-DD.
dateTostringLast archive date to include. Use YYYY, YYYYMM, YYYYMMDD, YYYY-MM, or YYYY-MM-DD.
statusFilterstringInclude only captures with a three-digit HTTP status such as 200 or 404. Leave it empty for any status.
mimeFilterstringInclude only captures with a MIME type such as text/html. Leave it empty for any type.
historyQuerystringOptional phrase to find in fetched archived text. Leave it empty to keep all returned captures.
includeContentbooleanAdd readable text from eligible archived HTML or text captures. Leave it off for metadata-only results.
maxContentFetchintegerWhen text fetching is on, this optional positive number limits fetched archived pages. Leave it empty to fetch all available results until the source is exhausted. It has no effect when text fetching is off.

Example input

This small example is copied from a successful current-beta run:

{
"outputMode": "snapshots",
"alertOn": "statusOrContent",
"targets": [
"http://example.com:80/"
],
"maxResults": 2,
"matchType": "exact",
"statusFilter": "200",
"mimeFilter": "text/html",
"includeContent": false,
"maxContentFetch": 1
}

🧾 Output

The Actor writes dataset rows and can also create a Markdown report. The recordType value marks each row as snapshot, version, summary, or alert. Fields that do not apply are returned as null.

Output links

FieldTypeWhat it does
resultsstringLink to the dataset view with saved archive rows.
reportstringLink to the Markdown report when outputMode is report.

Shared dataset fields

FieldTypeWhat it does
recordTypestringIdentifies the row as a snapshot, version, summary, or alert.
targetstring or nullSubmitted URL or domain that produced the row.
originalUrlstring or nullOriginal URL from the archived capture.
archiveUrlstring or nullOpenable Wayback playback link for the capture.
waybackTimestampstring or nullSource Wayback timestamp in YYYYMMDDhhmmss format.
archiveDatestring or nullCapture time in ISO 8601 format.
statusCodeinteger or nullHTTP status recorded by Wayback.
mimeTypestring or nullMIME type recorded by Wayback.
contentDigeststring or nullWayback digest used to identify duplicate or changed captures.
contentLengthinteger or nullArchived content length when available.
contentStatusstring or nullWhether archived text was not requested, fetched, capped, unavailable, or skipped.
contentstring or nullReadable archived text when fetching was requested and succeeded.
distanceFromTargetDaysnumber or nullAbsolute distance from the requested date for closestDate rows.
changeobject or nullDeterministic change evidence compared with an earlier capture or version.
versionobject or nullTimeline interval represented by a version row.
diffobject or nullReadable-content differences when text comparison is available.
summaryobject or nullCounts, date ranges, coverage, discoveries, and source evidence for a summary.
alertobject or nullMonitoring details for a detected archive change.

All four dataset shapes include the shared fields above. Nested fields appear when their object is present.

Snapshot rows

Snapshot rows describe individual archived captures. The nested change and diff fields use these additional paths:

FieldTypeWhat it does
change.changedbooleanSays whether source-backed evidence changed.
change.magnitudestring or nullGives the measured change size: none, small, medium, or large.
change.categorystring or nullGroups the change as status, content, availability, or mixed.
change.cuestring or nullShort source-backed cue for the change.
change.typestringNames the mechanical change type, such as digestChange or statusChange.
change.previousArchiveDatestring or nullDate of the earlier capture used for comparison.
change.previousWaybackTimestampstring or nullWayback timestamp of the earlier capture.
change.evidencearray of stringsSource-backed facts that explain the change.
diff.addedarray of stringsRepresentative text excerpts that were added.
diff.removedarray of stringsRepresentative text excerpts that were removed.

This row is copied from a successful current-beta snapshots run:

{
"recordType": "snapshot",
"target": "http://example.com:80/",
"originalUrl": "http://www.example.com:80/",
"archiveUrl": "https://web.archive.org/web/20020328012821id_/http://www.example.com:80/",
"waybackTimestamp": "20020328012821",
"archiveDate": "2002-03-28T01:28:21.000Z",
"statusCode": 200,
"mimeType": "text/html",
"contentDigest": "UY3I2DT2AMWAY6DECFCFYMT5ZOTFHUCH",
"contentLength": 481,
"contentStatus": "notRequested",
"content": null,
"distanceFromTargetDays": null,
"change": {
"changed": true,
"magnitude": "large",
"category": "content",
"cue": "Archived content digest changed",
"type": "digestChange",
"previousArchiveDate": "2002-01-20T14:25:10.000Z",
"previousWaybackTimestamp": "20020120142510",
"evidence": [
"Digest changed from HT2DYGA5UKZCPBSFVCV3JOBXGW2G5UUA to UY3I2DT2AMWAY6DECFCFYMT5ZOTFHUCH"
]
},
"version": null,
"diff": null,
"summary": null,
"alert": null
}

Version rows

Version rows group successive captures into timeline intervals. A version row has every field in the shared dataset fields table. Its change and diff objects use the nested paths listed above, and its non-null version object adds:

FieldTypeWhat it does
version.numberintegerSequential version number within the target timeline.
version.startDatestringFirst capture date in the version interval.
version.endDatestringLast capture date in the version interval.
version.snapshotCountintegerNumber of captures in the version interval.
version.firstWaybackTimestampstringWayback timestamp for the first capture in the interval.
version.lastWaybackTimestampstringWayback timestamp for the last capture in the interval.

This row is copied from a successful current-beta timeline run:

{
"recordType": "version",
"target": "example.com",
"originalUrl": "http://www.example.com:80/",
"archiveUrl": "https://web.archive.org/web/20020528114741id_/http://www.example.com:80/",
"waybackTimestamp": "20020528114741",
"archiveDate": "2002-05-28T11:47:41.000Z",
"statusCode": 200,
"mimeType": "text/html",
"contentDigest": "UY3I2DT2AMWAY6DECFCFYMT5ZOTFHUCH",
"contentLength": 481,
"contentStatus": "notRequested",
"content": null,
"distanceFromTargetDays": null,
"change": {
"changed": true,
"magnitude": "large",
"category": "content",
"cue": "Archived content digest changed",
"type": "digestChange",
"previousArchiveDate": "2002-01-20T14:25:10.000Z",
"previousWaybackTimestamp": "20020120142510",
"evidence": [
"Digest changed from HT2DYGA5UKZCPBSFVCV3JOBXGW2G5UUA to UY3I2DT2AMWAY6DECFCFYMT5ZOTFHUCH"
]
},
"version": {
"number": 2,
"startDate": "2002-03-28T01:28:21.000Z",
"endDate": "2002-05-28T11:47:41.000Z",
"snapshotCount": 3,
"firstWaybackTimestamp": "20020328012821",
"lastWaybackTimestamp": "20020528114741"
},
"diff": null,
"summary": null,
"alert": null
}

Summary rows

Summary rows collect run-level counts and source context. A summary row has every field in the shared dataset fields table. Its non-null summary object uses:

FieldTypeWhat it does
summary.targetsarray of stringsTargets covered by the summary.
summary.snapshotCountintegerTotal snapshot rows represented by the summary.
summary.versionCountintegerTotal version rows represented by the summary.
summary.alertCountintegerTotal alert rows represented by the summary.
summary.dateRangeobjectOldest and newest archive dates in the summary.
summary.dateRange.firstArchiveDatestring or nullOldest archive date represented.
summary.dateRange.lastArchiveDatestring or nullNewest archive date represented.
summary.coveragearray of objectsPer-target archive coverage details.
summary.coverage[].targetstringTarget covered by the entry.
summary.coverage[].snapshotCountintegerSuccessful snapshots for the target.
summary.coverage[].firstArchiveDatestring or nullOldest capture for the target.
summary.coverage[].lastArchiveDatestring or nullNewest capture for the target.
summary.coverage[].completenessstringWhether returned coverage is complete, partial, or unknown.
summary.coverage[].reliabilitystringCoverage reliability: high, medium, low, or unknown.
summary.coverage[].observedGapsarray of stringsKnown gaps or source limits in the returned history.
summary.discoveryobjectDiscovered paths, subdomains, and emails.
summary.discovery.pathsarray of stringsDistinct archived paths found.
summary.discovery.subdomainsarray of stringsDistinct archived subdomains found.
summary.discovery.emailsarray of stringsEmail addresses found in fetched archived content.
summary.evidenceobjectReproducible source context for the summary.
summary.evidence.sourcestringSource used for archive data.
summary.evidence.filtersarray of stringsUser-visible filters applied to the summary.

This row is copied from a successful current-beta Markdown report run:

{
"recordType": "summary",
"target": null,
"originalUrl": null,
"archiveUrl": null,
"waybackTimestamp": null,
"archiveDate": null,
"statusCode": null,
"mimeType": null,
"contentDigest": null,
"contentLength": null,
"contentStatus": null,
"content": null,
"distanceFromTargetDays": null,
"change": null,
"version": null,
"diff": null,
"summary": {
"targets": [
"example.com"
],
"snapshotCount": 10,
"versionCount": 8,
"alertCount": 0,
"dateRange": {
"firstArchiveDate": "2002-01-20T14:25:10.000Z",
"lastArchiveDate": "2002-08-03T08:05:44.000Z"
},
"coverage": [
{
"target": "example.com",
"snapshotCount": 10,
"firstArchiveDate": "2002-01-20T14:25:10.000Z",
"lastArchiveDate": "2002-08-03T08:05:44.000Z",
"completeness": "partial",
"reliability": "medium",
"observedGaps": [
"Results stopped at the requested row limit"
]
}
],
"discovery": {
"paths": [],
"subdomains": [
"www.example.com"
],
"emails": []
},
"evidence": {
"source": "Internet Archive Wayback Machine",
"filters": [
"match:domain",
"status:200",
"mime:text/html"
]
}
},
"alert": null
}

Alert rows

Alert rows show a monitoring change in archive data. An alert row has every field in the shared dataset fields table. Its non-null alert object adds:

FieldTypeWhat it does
alert.triggerstringMonitoring condition that created the row.
alert.previousArchiveDatestring or nullEarlier capture date used for comparison.
alert.previousWaybackTimestampstring or nullWayback timestamp of the earlier capture.
alert.previousStatusCodeinteger or nullEarlier capture HTTP status when relevant.
alert.previousContentDigeststring or nullEarlier capture content digest when relevant.
alert.messagestringShort source-backed alert message.

This row is copied from a successful current-beta monitoring run:

{
"recordType": "alert",
"target": "github.com",
"originalUrl": "http://github.com:80/?",
"archiveUrl": "https://web.archive.org/web/20080618201317id_/http://github.com:80/?",
"waybackTimestamp": "20080618201317",
"archiveDate": "2008-06-18T20:13:17.000Z",
"statusCode": 200,
"mimeType": "text/html",
"contentDigest": "7HRNG6K4OGFHZZU4KVQO4ZMO7M7LYMLQ",
"contentLength": 3474,
"contentStatus": "notRequested",
"content": null,
"distanceFromTargetDays": null,
"change": {
"changed": true,
"magnitude": "small",
"category": "content",
"cue": "Archived content digest changed",
"type": "digestChange",
"previousArchiveDate": "2008-05-14T21:01:48.000Z",
"previousWaybackTimestamp": "20080514210148",
"evidence": [
"Digest changed from L4YKKNIYL4FNB5SJWPQ4YII5FJTLWHRF to 7HRNG6K4OGFHZZU4KVQO4ZMO7M7LYMLQ"
]
},
"version": null,
"diff": null,
"summary": null,
"alert": {
"trigger": "anyNewArchiveRow",
"previousArchiveDate": "2008-05-14T21:01:48.000Z",
"previousWaybackTimestamp": "20080514210148",
"previousStatusCode": 200,
"previousContentDigest": "L4YKKNIYL4FNB5SJWPQ4YII5FJTLWHRF",
"message": "New Wayback capture found for http://github.com:80/? at 2008-06-18."
}
}

💳 Pricing

This Actor uses pay-per-event pricing. The charged event is Archive output, and it applies when a successful snapshot, version, summary, or monitoring alert is saved. Check the Actor Pricing tab for current tier rates.

🔌 Integrations

Export dataset rows as JSON, CSV, Excel, XML, RSS, or HTML, or use the dataset and Markdown report with the Apify API, schedules, and webhooks.

❓ FAQ

What happens when no snapshots match my targets?

A run can save no rows when the source has no matching captures. Check the target scope, date range, status, and MIME filters.

What does closestDate return?

It returns the capture closest to the date you enter and reports the absolute distance in distanceFromTargetDays.

Why is content sometimes null?

Text is null when fetching is off or the source text is unavailable, capped, or skipped. Use contentStatus to see the text state.

How are changes and timeline different?

changes focuses on captures with source-backed changes. timeline groups successive captures into version rows with date spans and capture counts.

How does monitoring compare archive history?

Monitoring compares the latest saved archive state for the same target and filters. alertOn chooses the conditions that create alert rows.

Can I search the archived pages by keyword?

No. Search targets are URLs or domains. historyQuery can focus on a phrase in text fetched from returned captures, but it is not a full archive text index.

Does this crawl the live website or create a new capture?

No. It reads existing Internet Archive data. It does not crawl the current site or create a Wayback capture.

Do I need a Wayback Machine API key or login?

No. The Actor reads public archive data and does not ask for a buyer-supplied API secret or login.

📝 Changelog

1.0: Expanded archive history workflows

  • Added focused snapshot, change, timeline, closest-date, report, and monitoring views.
  • Added readable archive text, source-backed change evidence, coverage summaries, and monitoring alerts.

0.1: Initial release

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré