# Wayback Machine Scraper: Website History & Snapshots — Eldwren (`cybermax/wayback-machine`) Actor

Wayback Machine scraper and website history checker: get a site's first and last archive capture, archive age, years online, every snapshot (status, type, digest, link) or every archived URL of a domain. Official Internet Archive CDX API. $3 per 1,000 histories; snapshots $0.80 per 1,000.

- **URL**: https://apify.com/cybermax/wayback-machine.md
- **Developed by:** [CyberMax](https://apify.com/cybermax) (community)
- **Categories:** SEO tools, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Eldwren: Wayback Machine Scraper — Website History, Snapshots & Archived URLs

#### How old is a website, what did it look like, and which URLs did it have?

Give it domains or URLs; get the site's Wayback Machine history in one record (first and last capture, archive age, years online, gap years, status codes, snapshot links), or every snapshot of a page, or every URL of a domain the Internet Archive holds. Built on the archive's official CDX API. $3 per 1,000 histories; snapshots and archived URLs $0.80 per 1,000.

**[▶ Try it now with a prefilled input](https://apify.com/cybermax/wayback-machine)** · history $0.003 per URL, snapshot rows $0.0008 · never-archived URLs and archive errors free · Apify's free plan includes $5 of credit a month

**Built for:** domain investors and buyers checking a domain's past · SEO teams recovering old URLs for redirects · due-diligence and fraud teams checking how long a business has been online · researchers and journalists · AI agents asking "how old is this site?"

**Real output** (real run on Apify, 25 Oct 2026, the prefilled input: apify.com, 4 s, $0.003):

| Field | Value |
|---|---|
| First capture | 2007-05-31 ([snapshot](https://web.archive.org/web/20070531101538/http://www.apify.com:80/)) |
| Last capture | 2026-10-16 (8 days ago) |
| Archive age | 19.4 years |
| Years with captures | 18 (2007–2026), gap years 2009, 2010 |
| Months archived | 127 |
| Monthly status codes | 200 × 103, 301 × 10 |

Snapshots mode, one per year (same run day, 12 rows, $0.0096):

| Captured | URL | Status | Type | Bytes |
|---|---|---|---|---|
| 2007-05-31 | http://www.apify.com:80/ | 200 | text/html | 1,013 |
| 2008-09-19 | http://www.apify.com:80/ | 200 | text/html | 1,029 |
| 2011-02-10 | http://apify.com/ | 200 | text/html | 2,801 |

```json
{"urls": ["apify.com"], "mode": "summary"}
```

### Ready-made inputs (one click)

| Job | Input | Result |
|---|---|---|
| **How old is this site?** | `{"urls": ["apify.com"]}` | One history record. |
| **Bulk domain age check** | `{"urls": ["a.com", "b.com", "c.com"]}` | One record per domain; never-archived domains free. |
| **Every version of a page** | `{"urls": ["example.com/pricing"], "mode": "captures", "collapse": "digest"}` | One row each time the page content changed. |
| **All old URLs of a domain** | `{"urls": ["example.com"], "mode": "urls", "maxResultsPerUrl": 5000}` | Every archived URL, for a redirect map. |
| **Every PDF the domain ever had** | `{"urls": ["example.com"], "mode": "urls", "mimeFilter": "application/pdf"}` | Archived PDF URLs with raw download links. |
| **New snapshots alert** | `{"urls": ["competitor.com/pricing"], "mode": "captures", "monitor": true}` | On a schedule: only captures newer than last time. |

### Use cases

- **Domain due diligence:** archive age, years online and gaps (parked or dropped years) before buying a domain or trusting a new vendor.
- **SEO migrations and lost pages:** list every URL a domain ever had and redirect the ones that still earn links.
- **Competitor history:** every version of a competitor's pricing or product page, with links to the archived copies.
- **Evidence and research:** dated, linkable snapshots of what a page said and when.
- **Recover lost files:** archived PDFs, images and documents with raw (`id_`) download links.

### Why Eldwren

| | Eldwren | Typical Wayback scraper on the Store |
|---|---|---|
| Three jobs in one | History summary, snapshots, archived URLs | Usually one |
| Ready answers | First/last capture, archive age, years online, gap years, versions | Raw rows only |
| Thinning | One per hour/day/month/year or per content change | Limited |
| Filters | Date range, status (2xx, !404), MIME type, prefix/host/domain match | Varies |
| Reliability | Back-off and retries on archive rate limits; failures free | Recent failure rates up to 5% on some rivals (Store stats, 25 Oct 2026) |
| Price | $0.003 per history, $0.0008 per row, no start fee | $1 to $5 per 1,000 rows (median about $3.25), some with a $0.02 start fee (Store prices on 25 Oct 2026) |

### Input

| Field | What it does |
|---|---|
| `urls` | Domains or page URLs (required). |
| `mode` | `summary` (default), `captures` or `urls`. |
| `maxResultsPerUrl` | Row limit per input (captures/urls). |
| `collapse` | `none`, `hour`, `day` (default), `month`, `year`, `digest`. |
| `from`, `to` | Date range, e.g. `2015` or `2020-06-01`. |
| `statusFilter`, `mimeFilter` | e.g. `2xx`, `!404`; `text/html`, `application/pdf`. |
| `matchType` | `exact`, `prefix`, `host`, `domain`. |
| `monitor`, `monitorKey` | Only new captures since the last monitor run. |

### Output

**Summary:** `target`, `archived`, `firstCapture`, `lastCapture`, `firstCaptureUrl`, `lastCaptureUrl`, `lastStatus`, `archiveAgeYears`, `daysSinceLastCapture`, `monthsWithCaptures`, `yearsWithCaptures`, `firstYear`, `lastYear`, `gapYears`, `monthsCapturedByYear`, `monthlyStatusCodes`, `distinctMonthlyVersions`.

**Snapshots / archived URLs:** `target`, `url`, `timestamp`, `capturedAt`, `statusCode`, `mimeType`, `bytes`, `digest`, `archiveUrl`, `rawArchiveUrl`.

### Pricing

- **$0.003 per URL summarized** (history mode).
- **$0.0008 per snapshot or archived URL** listed.
- Free: never-archived URLs, archive errors, unchanged URLs in monitor mode. No start fee.

### Run it on a schedule

Apify Console → **Schedules** → **Create new** → cron `0 9 * * *` → **Add Actor** → Eldwren with `"mode": "captures"` and `"monitor": true`. Through the API:

```json
POST https://api.apify.com/v2/schedules?token=YOUR_TOKEN
{
  "name": "eldwren-rival-pricing-snapshots",
  "cronExpression": "0 9 * * *",
  "timezone": "America/New_York",
  "isEnabled": true,
  "actions": [{
    "type": "RUN_ACTOR",
    "actorId": "cybermax/wayback-machine",
    "runInput": {
      "body": "{\"urls\":[\"competitor.com/pricing\"],\"mode\":\"captures\",\"collapse\":\"digest\",\"monitor\":true}",
      "contentType": "application/json"
    }
  }]
}
```

### Integrations

**API (synchronous):** `POST https://api.apify.com/v2/acts/cybermax~wayback-machine/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON returns the rows.

**Make / Zapier:** Apify app → "Run an Actor" (`cybermax/wayback-machine`, run synchronously) → "Get dataset items" → map `firstCapture`, `archiveAgeYears` into your CRM or sheet.

**n8n:** Apify node, or HTTP Request:

```
POST https://api.apify.com/v2/acts/cybermax~wayback-machine/run-sync-get-dataset-items?token=YOUR_TOKEN
{"urls": ["example.com"], "mode": "summary"}
```

**Google Sheets:**

```
=IMPORTDATA("https://api.apify.com/v2/acts/cybermax~wayback-machine/runs/last/dataset/items?format=csv&fields=target,firstCapture,lastCapture,archiveAgeYears,yearsWithCaptures&token=YOUR_TOKEN")
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("cybermax/wayback-machine").call(run_input={"urls": ["apify.com", "example.com"]})
for r in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(r["target"], r.get("firstCapture"), r.get("archiveAgeYears"))
```

**AI agents (MCP):** `https://mcp.apify.com/?tools=cybermax/wayback-machine` (Authorization: `Bearer YOUR_TOKEN`). Typical prompts: "How long has acme-shop.com been online?", "List every URL example.com had in 2019".

### When NOT to use it

- **Page text of old snapshots:** Eldwren returns capture data and links; open `archiveUrl` (or `rawArchiveUrl`) to read the page, or pass those links to [Inkpluck](https://apify.com/cybermax/article-extract).
- **Sites excluded from the archive** by their owner return `excluded: true` (free).
- **Exact capture counts for huge domains:** history mode samples one capture per month to stay fast.

### FAQ

**Why not browse web.archive.org?** Fine for one page. Eldwren answers for hundreds of domains at once, adds the archive age and gaps, and filters by date, status and file type.

**Is "archive age" the domain's registration date?** No: it's when the Internet Archive first saw the site, a strong signal of how long it has been live. For WHOIS registration dates use [DomainDNA](https://apify.com/cybermax/domain-intel).

**Can an AI agent use it (MCP)?** Yes. Add `https://mcp.apify.com/?tools=cybermax/wayback-machine` as an MCP server in Claude, Cursor, VS Code or any MCP client.

**Why is it sometimes slow?** The archive answers big domains slowly and rate-limits bursts. Eldwren keeps parallel requests low and backs off, so runs finish instead of failing.

**Is it legal to use?** Eldwren uses the Internet Archive's public CDX API, which the archive provides for programmatic access. Archived pages belong to their owners. This is general information, not legal advice.

### Start now

**[▶ Try Eldwren with a prefilled input](https://apify.com/cybermax/wayback-machine)** · $3 per 1,000 histories. Questions? Open an issue on the Store page and it gets answered the same day.

### Also from CyberMax

- [Namewhere — company name to domain](https://apify.com/cybermax/company-to-domain): find a company's website, then check its history.
- [DomainDNA — tech stack, WHOIS & domain age](https://apify.com/cybermax/domain-intel): what a site runs on and when it was registered.
- [Sitemoss — sitemap URL extractor](https://apify.com/cybermax/sitemap-url-extractor): today's URLs, to compare with the archived ones.
- [Bouncefern — bulk URL status & redirect checker](https://apify.com/cybermax/url-status-checker): check which old URLs still redirect.

### Changelog

- 2026-10-25: First release: history summary, snapshots and archived-URL modes on the official CDX API, collapse, date/status/MIME filters, resume-key paging, back-off, monitor mode.

© 2026 CyberMax. All rights reserved.

# Actor input Schema

## `urls` (type: `array`):

One per line: a domain (example.com) or a page (example.com/pricing). The scheme and www. are ignored, as in the Wayback Machine.

## `mode` (type: `string`):

summary is charged per URL with captures ($0.003); snapshots and archived URLs are charged per row ($0.0008).

## `maxResultsPerUrl` (type: `integer`):

For snapshots and archived URLs: stop after this many rows per input.

## `collapse` (type: `string`):

Snapshots mode: thin out captures. 'Content change' returns a capture only when the page content changed.

## `from` (type: `string`):

Optional, e.g. 2015 or 2020-06-01.

## `to` (type: `string`):

Optional, e.g. 2023-12-31.

## `statusFilter` (type: `string`):

Optional: 200, 2xx, 3xx, !404 (comma-separated).

## `mimeFilter` (type: `string`):

Optional, e.g. text/html or application/pdf (archived URLs mode: find every archived PDF of a domain).

## `matchType` (type: `string`):

Archived URLs mode defaults to domain.

## `timeoutSecs` (type: `integer`):

The archive is slow for very large domains; requests are retried with back-off.

## `maxConcurrency` (type: `integer`):

Kept low to stay within the archive's rate limits.

## `monitor` (type: `boolean`):

For scheduled runs. Summary mode returns a URL only when it has a capture newer than last time; snapshots and archived-URL modes return only rows newer than the last monitor run. Nothing new = nothing charged.

## `monitorKey` (type: `string`):

Optional name for this watchlist's saved state.

## Actor input object example

```json
{
  "urls": [
    "apify.com"
  ],
  "mode": "summary",
  "maxResultsPerUrl": 20,
  "collapse": "day",
  "matchType": "exact",
  "timeoutSecs": 90,
  "maxConcurrency": 2,
  "monitor": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "apify.com"
    ],
    "maxResultsPerUrl": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cybermax/wayback-machine").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["apify.com"],
    "maxResultsPerUrl": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cybermax/wayback-machine").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "apify.com"
  ],
  "maxResultsPerUrl": 20
}' |
apify call cybermax/wayback-machine --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cybermax/wayback-machine"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/KbAi7ungjtyCmTE2M/builds/Hu6yQKOM08Z4NBz2L/openapi.json
