# Wayback Machine Scraper: Domain Age, History and Archived URLs (`keelandcharter/wayback-domain-history`) Actor

Check any domain or URL in the Internet Archive Wayback Machine: first and last capture, domain age, years active, content changes, a capture timeline with snapshot links, or every archived URL under a domain. For domain due diligence, SEO audits and dead link recovery.

- **URL**: https://apify.com/keelandcharter/wayback-domain-history.md
- **Developed by:** [Keel & Charter](https://apify.com/keelandcharter) (community)
- **Categories:** SEO tools, Developer tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 url summaries

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

## Wayback Machine Domain History

When did a site first go live, how long has it been active, and what did it look like? Built by Keel & Charter.

This Actor reads the Internet Archive's public CDX index and turns it into clean rows you can sort, filter and export. No browser, no page downloads, just the index, so runs are fast and cheap.

### Three modes

**Summary** (one row per domain or URL)

- archived: true or false
- first_captured_at, last_captured_at
- months_with_captures, years_active, months_captured_by_year
- content_versions_seen (how often the page content changed month to month)
- first_snapshot_url, latest_snapshot_url

**Timeline** (one row per capture)

- captured_at, status_code, mime_type, size_bytes, content_digest
- snapshot_url, ready to open in the Wayback Machine
- Pick one capture per year, month or day, only captures where the content changed, or every capture.

**Archived pages** (one row per unique URL under a domain or path)

- original_url, first_seen_capture_at, status_code, mime_type, snapshot_url
- Handy for rebuilding a lost sitemap, finding old landing pages or recovering dead links.

### Who uses it

- Domain buyers and brokers checking a name's real age and past use before a purchase.
- SEO teams auditing redirects, old URLs and content history.
- Researchers, journalists and compliance teams who need dated proof of what a page showed.
- AI agents that need a quick "how old is this site" fact with a source link.

### How to use it

1. Add domains or URLs, one per line: `stripe.com`, `https://example.com/pricing`.
2. Pick a mode. Optional: year range, only successful captures, max rows per input.
3. Run, then export JSON, CSV or Excel, or call it from the API, Make, Zapier, n8n or an MCP client.

### Example input

```json
{
  "urls": [
    "stripe.com",
    "python.org/downloads"
  ],
  "mode": "summary",
  "collapse": "month",
  "onlySuccessful": true
}
```

### Example output

One row per result. A row from a real run:

```json
{
  "input": "stripe.com",
  "type": "summary",
  "archived": true,
  "first_captured_at": "1996-12-18T23:42:05+00:00",
  "last_captured_at": "2026-10-01T01:00:54+00:00",
  "months_with_captures": 225,
  "years_active": [
    "1996",
    "1997",
    "1998",
    "1999",
    "2000",
    "2001",
    "..."
  ],
  "months_captured_by_year": {
    "1996": 1,
    "1997": 1,
    "1998": 1,
    "1999": 5,
    "2000": 5,
    "2001": 4
  },
  "content_versions_seen": 207,
  "first_snapshot_url": "https://web.archive.org/web/19961218234205/http://www.stripe.com:80/",
  "latest_snapshot_url": "https://web.archive.org/web/20261001010054/https://stripe.com/"
}
```

### Pricing

Pay per event, no subscription and no separate compute charge:

| Event | Price |
|---|---|
| URL summary (summary mode) | $0.004 per domain or URL |
| Capture row (timeline mode) | $0.0008 per row ($0.80 per 1,000) |
| Archived page (pages mode) | $0.0008 per URL ($0.80 per 1,000) |
| Actor start | $0.00005 per run |

Example: summaries for 250 domains cost about $1.00. Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached.

Pricing may change; any change follows Apify's notice rules.

### Good to know

- Uses only the public CDX API at web.archive.org. Requests go out one at a time with a pause between inputs and automatic backoff when the archive is busy.
- Returns archive metadata only. It does not copy page content and collects no personal data.
- The archive is a nonprofit service and can be slow at peak times. If an input times out, the run says so and you can retry it later.
- Not affiliated with the Internet Archive. If you rely on the Wayback Machine, consider supporting it at archive.org/donate.

Questions or ideas? Open an issue and Keel & Charter will take a look.

### FAQ

**How do I check a domain's age?**
Use summary mode. first_captured_at is the oldest archive capture, a good proxy for when the site went live, and years_active shows gaps in use.

**Can I recover old URLs for redirects?**
Yes. Pages mode lists every unique archived URL under a domain or path, with a snapshot link for each.

**Do I need an API key?**
No. The public Wayback Machine CDX index is used.

### More from Keel & Charter

- [Greenhouse, Lever, Ashby and Workable Jobs Scraper](https://apify.com/keelandcharter/ats-jobs-feed)
- [Workday Jobs Scraper](https://apify.com/keelandcharter/workday-jobs-feed)
- [Bulk WHOIS and Domain Lookup (RDAP, DNS, SPF, DMARC)](https://apify.com/keelandcharter/domain-rdap-dns-lookup)
- [South Carolina Short Term Rental Regulations](https://apify.com/keelandcharter/sc-short-term-rental-rules)

# Actor input Schema

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

One per line, for example 'stripe.com' or 'https://example.com/pricing'.

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

summary: one row per input with first seen, last seen and yearly coverage. timeline: one row per capture. pages: every archived page under the domain or path.

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

Timeline mode only. Keep one capture per year, month or day, only captures where the content changed, or every capture.

## `fromYear` (type: `integer`):

Optional start year, for example 2015.

## `toYear` (type: `integer`):

Optional end year.

## `onlySuccessful` (type: `boolean`):

Skip redirects and errors.

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

Timeline and pages modes. 0 means no limit for timeline and 1,000 for pages.

## Actor input object example

```json
{
  "urls": [
    "stripe.com",
    "python.org/downloads"
  ],
  "mode": "summary",
  "collapse": "month",
  "onlySuccessful": true,
  "maxResultsPerUrl": 0
}
```

# Actor output Schema

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

All rows returned by the run, in the default dataset. Use the Summary, Timeline or Pages view.

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

Summary rows: first and last capture, years active, content versions.

## `timeline` (type: `string`):

Capture rows with snapshot links.

## `pages` (type: `string`):

Unique archived URLs found under a domain or path.

# 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": [
        "stripe.com",
        "python.org/downloads"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("keelandcharter/wayback-domain-history").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": [
        "stripe.com",
        "python.org/downloads",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("keelandcharter/wayback-domain-history").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": [
    "stripe.com",
    "python.org/downloads"
  ]
}' |
apify call keelandcharter/wayback-domain-history --silent --output-dataset

```

## MCP server setup

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

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/IHc3dqBjoLg8H4BDG/builds/ic3uFg2DqUdt5NERP/openapi.json
