The version of the page they took down
The Web Archive API returns historical website snapshots from the Wayback Machine and Common Crawl as clean JSON.
7 active endpoints. Every call is 1 credit.
- POST/web-archive/v1/snapshots
- POST/web-archive/v1/available
- POST/web-archive/v1/history
- POST/web-archive/v1/domain_captures
- POST/web-archive/v1/batch
- POST/web-archive/v1/cc_search
- POST/web-archive/v1/cc_indexes
What Web Archive endpoints does ReefAPI ship?
7 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Web Archive API
3 of 7 endpoints, ready to run
Every archived capture of a URL with its timestamp, HTTP status, MIME type, content digest and a direct link to the archived copy.
{ "ok": true, "meta": { "api": "web-archive", "endpoint": "snapshots", "mode": "live", "latency_ms": 22377.1, "record_count": 10, "cache_hit": false }, "data": { "snapshots": [ { "timestamp": "20020120142510", "datetime": "2002-01-20T14:25:10Z", "original": "http://example.com:80/", "urlkey": "com,example)/", "mimetype": "text/html", "statuscode": "200", "digest": "HT2DYGA5UKZCPBSFVCV3JOBXGW2G5UUA", "length": 1792, "snapshot_url": "https://web.archive.org/web/20020120142510/http://example.com:80/" }, { "timestamp": "20020328012821", "datetime": "2002-03-28T01:28:21Z", "original": "http://www.example.com:80/", "urlkey": "com,example)/", "mimetype": "text/html", "statuscode": "200", "digest": "UY3I2DT2AMWAY6DECFCFYMT5ZOTFHUCH", "length": 481, "snapshot_url": "https://web.archive.org/web/20020328012821/http://www.example.com:80/" }, { "timestamp": "20020524041628", "datetime": "2002-05-24T04:16:28Z", "original": "http://www.example.com:80/", "urlkey": "com,example)/", "mimetype": "text/html", "statuscode": "200", "digest": "UY3I2DT2AMWAY6DECFCFYMT5ZOTFHUCH", "length": 481, "snapshot_url": "https://web.archive.org/web/20020524041628/http://www.example.com:80/" } ], "count": 10, "resume_key": "eJxLzs_VSa1IzC3ISdXUVzAyMDAysDAwBmJTExMAf3MHlA", "has_more": true } }
How the Web Archive API works
Web Archive is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Proving what a page said on a date
Terms changed, a claim was removed, a price was different. The screenshot nobody took is the archive's problem, not yours.
{"url": "https://example.com/terms", "timestamp": "20240101"}The single closest capture to a date, with a direct link to the archived copy. This is the fast path — one answer, about a second.
{"url": "https://example.com/terms", "collapse": "digest"}The full capture list when you need to see when it actually changed. Collapsing by digest turns hundreds of identical captures into the handful of moments the content moved.
Each capture carries a content digest, so the dates on which the page genuinely changed are identifiable without fetching every version.
curl -X POST https://api.reefapi.com/web-archive/v1/snapshots \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"url":"github.com","limit":10,"collapse":"digest"}'{
"ok": true,
"data": { … },
"meta": {
"api": "web-archive",
"endpoint": "snapshots",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Wayback CDX field formats, and how a snapshot URL is built from them
Every capture row is a CDX record, and the two things people get wrong are the timestamp format and the fact that CDX types are strings where you would expect numbers. These are the formats as measured against github.com. The engine returns the raw CDX field plus a derived datetime and a ready-made snapshot_url, so there is nothing to assemble by hand.
| Field | Format as returned | Notes |
|---|---|---|
| timestamp | 14 digits, YYYYMMDDhhmmss, UTC - "20080514210148" | from / to accept an ISO date or any 4-14 digit prefix of this, inclusive |
| datetime | ISO-8601 with Z - "2008-05-14T21:01:48Z" | the same instant as timestamp, derived for convenience |
| snapshot_url | https://web.archive.org/web/<timestamp>/<original> | already assembled per row |
| statuscode | a string, "200" or "404" - never an integer | the status the crawler got at capture time, not the URL's status today |
| digest | base32 SHA-1 of the response body | identical digest means a byte-identical capture; this is what collapse=digest keys on |
| urlkey | SURT form - "com,github)/" | host reversed and comma-separated; this is what collapse=urlkey groups by |
| length | integer, size of the archived record in bytes | the stored record size, not the rendered page weight |
| Common Crawl collection | CC-MAIN-YYYY-WW - "CC-MAIN-2026-34" | 127 indexes were listed on 2026-08-26; 2026-34 covers 2026-08-07 to 2026-08-20 |
collapse is the one parameter that rejects a bad value: collapse "bogus" returns INVALID_PARAM with the nine allowed values in error.detail.allowed. match, status and mime silently ignore anything they do not recognize, so a typo there quietly widens your result set instead of failing.
What the archive can give you, and how slow it is when it is busy
Measured against both the single-capture and the full-history paths. The performance rows are the important ones and they are not about us.
Each snapshot returns its timestamp, HTTP status, MIME type and a content digest along with a direct archive link. The digest is the useful field: it identifies the dates on which the content actually changed, so you can jump to those instead of diffing hundreds of identical captures.
Deep history queries are heavy and the upstream rate-limits them. A history call we measured came back after a long wait reporting zero captures with an explicit throttled flag and a partial flag set. That is the honest shape — it did not fabricate a profile and it did not present an incomplete answer as a complete one — but it does mean deep history is best-effort and needs a retry, not a request path.
Asking for the closest capture to a date answered in about a second. Asking for the full capture list took the better part of a minute on the same URL. If you only need one version, ask for one version — the difference is entirely in which upstream index has to be scanned.
Alongside the Internet Archive, Common Crawl is queryable by collection, which matters because the two have different coverage and different blind spots. A page missing from one is regularly present in the other.
A URL with no captures may never have been crawled rather than never have existed — coverage skews heavily towards linked, popular and long-lived pages. The archive is strong evidence of what was there and weak evidence about what was not.
What people build with Web Archive
The jobs this data is most often used for.
endpoints
credit per call
OSINT researchers call snapshots to see how a page or claim looked at a point in time.
Brand-monitoring tools use history to track how a competitor's pricing or messaging changed.
Compliance teams use available to retrieve the archived version of a page for evidence.
What Web Archive data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 184 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/web-archive/v1/snapshots \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"url":"github.com","limit":10,"collapse":"digest"}'import requests
r = requests.post(
"https://api.reefapi.com/web-archive/v1/snapshots",
headers={"x-api-key": REEF_KEY},
json={
"url": "github.com",
"limit": 10,
"collapse": "digest"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Web Archive.
Get a free key →What happens when a URL was never archived?▾
You get a successful response saying so, not an error. A measured available call on a domain with no captures returned ok:true, meta.record_count 0, available:false and closest:null. batch behaves the same way per row: a three-URL sweep returned archived:true with a closest object for two of them and archived:false with closest:null for the third, plus meta.archived_count 2 against meta.requested 3. Check the boolean, never the HTTP status.
Does "closest" mean the snapshot before my date?▾
No. Closest means nearest in either direction, and it often lands after the date you asked for. A measured available call on github.com with timestamp 20120601 returned the capture at 20120612150442, eleven days later. requested_timestamp is echoed back so you can measure the gap yourself. If you need a capture that is definitely no later than a date, use snapshots with to set to that date and take the last row.
Why are years, status_codes and mime_types empty on the history action?▾
Because those three are built from a sampled scan that the engine drops rather than let a call hang. When that happens the response says so: meta.breakdown_partial true, data.partial true, and a note reading "first/last_seen are exact (pinpoint CDX); years/status/mime are a capture-per-day sample (cap 1000) - BREAKDOWN OMITTED". The edges stay exact either way - a measured run on github.com still returned first_seen 20080514210148, last_seen 20260826102004 and span_days 6677 while total_captures read 0. Rely on first_seen, last_seen and span_days; treat the breakdown as best-effort.
How do I page past the first batch of captures?▾
limit maxes at 1,000 per call and paging is by opaque resume key, not by offset. snapshots and domain_captures return meta.has_more and meta.resume_key; feed that string back as resume_key for the next page. It is a Wayback token rather than a page number, so you cannot jump to page five or compute a total up front. Narrow with from / to, status or mime when you need a bounded set rather than a full walk.
Why is domain_captures full of 404s?▾
Because it lists every URL the archive ever recorded under the domain, including ones that were already dead when they were crawled. A measured five-row page for github.com contained the 2008 homepage capture at status 200 and https://github.com/!!! at 404 in the same list. Pass status 200 to keep only successful captures, or status "!200" - the leading exclamation mark negates - to inspect only the failures. Rows are already one per unique URL, so the count is pages, not captures.
How is this different from the internet-archive engine?▾
Different halves of archive.org. This engine reads the Wayback capture index (CDX) plus Common Crawl, and answers "what did this URL look like on this date, and when did it change". The internet-archive engine reads the archive.org item library - books, audio, film, software - and answers "find me this item and its files". They share a hostname and nothing else: there are no identifiers, mediatypes or collections here, and no timestamps or digests there.
When should I use cc_search instead of snapshots?▾
For corroboration, and for fields Wayback does not carry. Common Crawl rows add languages ("eng"), encoding ("UTF-8"), warc_filename and warc_offset, which let you pull the exact record out of Common Crawl's own WARC files. Coverage differs in kind: Common Crawl runs as periodic bulk crawls, so a measured lookup on github.com returned captures on 2026-08-07 and 2026-08-09 with different digests inside collection CC-MAIN-2026-34. Call cc_indexes first to choose a collection, or omit it to use the newest.
How do I find only the dates a page actually changed?▾
collapse=digest. It drops consecutive captures whose content hash is identical, so what remains is one row per version rather than one row per crawl. The other collapse values group instead of dedupe: timestamp:4 gives one capture per year, :6 per month, :8 per day and :10 per hour, while urlkey or original give one row per URL, which is what you want with match set to prefix or domain.
What is the Web Archive API?▾
Web Archive API is a ReefAPI endpoint group for web archive It returns live JSON through POST requests under /web-archive/v1.
Is the Web Archive API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Web Archive calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Web Archive login or account?▾
No login to Web Archive is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Web Archive data?▾
The page example is captured from a live snapshots call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Web Archive API use?▾
Web Archive actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Web Archive from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call web-archive actions with the same key, credit pool and JSON envelope used by normal REST requests.
18 Developer Tools APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Web Archive, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.