API v2.4 — Stable

API /api-access

Interact with 4.2 million archived web pages programmatically. Search, retrieve, and analyze the golden age of the internet through our comprehensive REST API.

https://api.1990webarchive.com/v2
💡 All API responses are returned in JSON format. Use Accept: application/json headers for all requests.

🔑 Authentication

Authenticate your API requests using an API key. Include your key in the Authorization header as a Bearer token. Keys can be generated from your dashboard.

⚠️ Never expose your API key in client-side code, public repositories, or unsecured channels. Keys can be revoked instantly from your dashboard.
HTTP Request
GET /v2/search?q=geocities HTTP/2
Host: api.1990webarchive.com
Authorization: Bearer sk_live_1990a3b7c9d2e4f6...
Content-Type: application/json

Key Types

Type Prefix Description
Live Key sk_live_ Full access to production API with billing applied
Test Key sk_test_ Sandbox access — no data charges, read-only access
Webhook Key sk_wh_ Webhook signing key for verifying incoming events

🌐 Base URL

All API endpoints are relative to the base URL below:

https://api.1990webarchive.com/v2
https://sandbox-api.1990webarchive.com/v2
💡 The sandbox environment uses the same API but returns simulated data for testing. No credits are consumed.

📄 Retrieve Page

GET /pages/:id Retrieve page

Retrieve the full archived HTML content of a page, including all inline resources.

ParameterTypeRequiredDescription
id string required The archive ID (e.g., 1990-arc-8f3a2b1c)
render string optional raw (default) or rendered — renders with original 90s styles
include_assets boolean optional Include linked GIFs, MIDIs, and CSS (default: false)
cURL
$ curl -X GET \
  https://api.1990webarchive.com/v2/pages/1990-arc-8f3a2b1c?render=raw&include_assets=true \
  -H "Authorization: Bearer sk_live_..."

📅 Search by Era

GET /search/era/:era Browse by decade

Browse archived pages filtered by a specific decade. Returns a curated collection of representative pages from that era.

ParameterTypeRequiredDescription
era string required Decade identifier: 1990s through 1999s
category string optional Filter by category: personal, business, fan, education, government
has_audio boolean optional Filter to pages with MIDI audio (default: false)
has_animation boolean optional Filter to pages with animated GIFs (default: false)
cURL
$ curl -X GET \
  https://api.1990webarchive.com/v2/search/era/1990s?category=personal&has_audio=true \
  -H "Authorization: Bearer sk_live_..."

📚 Collections

GET /collections List collections

List all curated collections available in the archive.

JSON Response — 200 OK
{
  "collections": [
    {
      "id": "geo-cities-restored",
      "name": "GeoCities Restored",
      "description": "180,000+ restored GeoCities personal homepages",
      "page_count": 182431,
      "era": "1990s",
      "thumbnail": "https://cdn.1990webarchive.com/collections/geo-cities/thumb.png"
    },
    {
      "id": "dot-com-boom",
      "name": "Dot-Com Boom",
      "description": "Business and e-commerce sites from 1995–2000",
      "page_count": 45210,
      "era": "1990s",
      "thumbnail": "https://cdn.1990webarchive.com/collections/dot-com/thumb.png"
    },
    {
      "id": "web-ring-foundations",
      "name": "Web Ring Foundations",
      "description": "Sites connected through the classic WebRing system",
      "page_count": 28900,
      "era": "1990s",
      "thumbnail": "https://cdn.1990webarchive.com/collections/web-ring/thumb.png"
    }
  ]
}
GET /collections/:id/pages Get collection pages

Get all pages within a curated collection.

cURL
$ curl -X GET \
  https://api.1990webarchive.com/v2/collections/geo-cities-restored/pages?page=1&per_page=20 \
  -H "Authorization: Bearer sk_live_..."

🖼️ Media

GET /media/:id/screenshot Get screenshot

Retrieve the pixel-perfect screenshot of an archived page, rendered in its original dimensions and style.

ParameterTypeRequiredDescription
width integer optional Output width in pixels (default: 1024)
format string optional png (default) or webp
GET /media/:id/audio Get audio asset

Retrieve the MIDI or WAV audio file embedded in an archived page, extracted and preserved in its original format.

🎵 Fun fact: We've preserved over 340,000 MIDI files from archived pages. Many still play in modern browsers with the ?embed=1 parameter.

🏷️ Metadata

GET /pages/:id/metadata Get page metadata

Get technical metadata about an archived page, including original HTML, technology stack, and preservation details.

JSON Response — 200 OK
{
  "id": "1990-arc-8f3a2b1c",
  "original_url": "http://geocities.com/area51/hangar/2271/",
  "archived_date": "1996-03-15T08:22:00Z",
  "content_type": "text/html",
  "content_length": 8742,
  "technology": {
    "html_version": "HTML 2.0",
    "has_frames": false,
    "has_tables": true,
    "has_javascript": false,
    "has_applet": false,
    "has_midi_audio": true,
    "has_animated_gif": true,
    "has_counter": true,
    "guestbook": false,
    "web_ring": true
  },
  "preservation": {
    "crawl_id": "1990-crawl-441",
    "verified": true,
    "integrity_hash": "sha256:a1b2c3d4e5f6...",
    "signed": true,
    "timestamp_url": "https://ts.1990webarchive.com/1990-arc-8f3a2b1c"
  }
}

📸 Snapshots

GET /snapshots/:id/full Full snapshot

Retrieve a complete rendered snapshot of a page as it appeared at the time of archiving, including all stylesheets, fonts, and assets.

GET /snapshots/:id/comparison Side-by-side comparison

Get a side-by-side comparison view of a page's HTML from two different archival dates, useful for tracking design evolution.

🕷️ Crawl

POST /crawl Initiate crawl

Initiate a new crawl of a live URL to add it to the archive. Supports recursive crawling with configurable depth and scope.

ParameterTypeRequiredDescription
url string required The URL to crawl
depth integer optional Link depth (1–3, default: 1)
scope string optional same_domain (default) or all
name string optional Custom crawl name label
cURL
$ curl -X POST \
  https://api.1990webarchive.com/v2/crawl \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "depth": 2,
    "scope": "same_domain",
    "name": "My Test Crawl"
  }'

⏱️ Rate Limits

API requests are rate-limited based on your plan tier. Headers in every response indicate your current usage.

Free
60
requests / minute
Pro
1,000
requests / minute
Enterprise
10,000
requests / minute
💡 Rate limit headers are returned in every response: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset.
Response Headers — 200 OK
HTTP/2 200 OK
Content-Type: application/json
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 987
X-RateLimit-Reset: 1709251200
X-Request-Cost: 1

Error Handling

The API uses standard HTTP status codes and returns detailed error objects in JSON format.

StatusCodeDescription
400 BAD_REQUEST Invalid query parameters or malformed request body
401 UNAUTHORIZED Missing or invalid API key
403 FORBIDDEN API key lacks permission for this endpoint
404 NOT_FOUND No results found for the query or the page ID doesn't exist
429 RATE_LIMITED Too many requests — check X-RateLimit-Reset
500 INTERNAL_ERROR Unexpected server error — contact support
503 SERVICE_UNAVAILABLE Archive is undergoing maintenance
JSON Error Response — 400
{
  "status": "error",
  "code": "BAD_REQUEST",
  "message": "Invalid era: '1980s' is not within archive range (1990–1999)",
  "details": {
    "field": "era",
    "valid_values": ["1990s", "1991s", "1992s", "1993s", "1994s", "1995s", "1996s", "1997s", "1998s", "1999s"]
  },
  "request_id": "req_1990x7f8a2b"
}
🚨 Always handle rate limits gracefully. Implement exponential backoff when receiving 429 responses. The X-RateLimit-Reset header contains the Unix timestamp when your limit resets.

📦 SDKs & Client Libraries

Official SDKs are available for popular languages. Community-maintained libraries for additional languages are also listed below.

🟢
Node.js

Official SDK

npm i 1990-archiver
🐍
Python

Official SDK

pip install one_ninety
Java

Community

mvn:1990-archiver-java
🦀
Rust

Community

cargo add 1990-archiver
🔷
C# / .NET

Community

dotnet add 1990Archiver
🐹
Go

Official SDK

go get 1990-archiver
💡 All SDKs support the complete API surface including search, retrieve, crawl, and webhooks. See individual SDK README for installation and usage docs.

🔔 Webhooks

Configure webhook endpoints to receive real-time notifications for crawl completions, archive additions, and page updates.

Available Events

  • crawl.completed Fired when a crawl initiated via POST /crawl finishes processing
  • page.archived Fired when a new page is added to the archive (scheduled crawl results)
  • page.updated Fired when an existing archived page is re-captured with new content
  • archive.snapshot_ready Fired when a rendered snapshot of a page is fully processed and available
  • rate_limit.warning Fired when usage exceeds 80% of your rate limit for the current minute
Webhook Payload — 200 OK
{
  "id": "evt_1990abc123",
  "type": "crawl.completed",
  "timestamp": "1990-03-15T08:22:00Z",
  "data": {
    "crawl_id": "1990-crawl-441",
    "url": "http://geocities.com/area51/hangar/2271/",
    "pages_crawled": 12,
    "new_archives": 11,
    "errors": 0
  }
}
Verification: All webhook payloads are signed with your webhook key (sk_wh_...). Use the X-Signature header to verify authenticity before processing.

Start Using the API Today

Get your API key and start archiving. Free tier includes 1,000 requests per month.