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.
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.
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:
Search
Search across the entire archive of archived web pages. Supports full-text search, era filtering, and content-type filtering.
Search the archive for pages matching your query. Supports keyword, URL, title, and author filters.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| q | string | required | Search query string (keyword, phrase, or URL) |
| era | string | optional | Filter by decade: 1990s, 1991s, 1992s ... 1999s |
| type | string | optional | Content type: html, gif, midi, flash |
| site | string | optional | Filter by domain: geocities.com, angelfire.com, etc. |
| page | integer | optional | Page number (default: 1, max: 100) |
| per_page | integer | optional | Results per page (default: 20, max: 100) |
| sort | string | optional | Sort order: relevance, date_desc, date_asc |
$ curl -X GET \ https://api.1990webarchive.com/v2/search?q=welcome+counter \ -H "Authorization: Bearer sk_live_..." \ -H "Accept: application/json" \ -G --data-urlencode "era=1990s" \ -G --data-urlencode "site=geocities.com" \ -G --data-urlencode "page=1" \ -G --data-urlencode "per_page=50"
Response
{
"status": "success",
"query": {
"q": "welcome counter",
"era": "1990s",
"site": "geocities.com"
},
"pagination": {
"current_page": 1,
"per_page": 50,
"total_results": 12847,
"total_pages": 257
},
"results": [
{
"id": "1990-arc-8f3a2b1c
"url": "http://geocities.com/area51/hangar/2271/",
"title": "Welcome to my World!!",
"archived_date": "1996-03-15T08:22:00Z",
"site": "geocities.com",
"era": "1990s",
"match_score": 0.94,
"has_screenshot": true,
"has_audio": true,
"snapshot_url": "https://api.1990webarchive.com/v2/snapshots/8f3a2b1c/full"
},
{
"id": "1990-arc-7d2e9f4a",
"url": "http://geocities.com/Colosseum/Diamond/6849/",
"title": "Welcome to my Cool Page!!",
"archived_date": "1997-08-22T14:05:00Z",
"site": "geocities.com",
"era": "1990s",
"match_score": 0.89,
"has_screenshot": true,
"has_audio": false,
"snapshot_url": "https://api.1990webarchive.com/v2/snapshots/7d2e9f4a/full"
}
]
}
Find archived versions of a given URL, even if the site is no longer online.
$ curl -X POST \ https://api.1990webarchive.com/v2/search/reverse \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "url": "http://geocities.com/area51/hangar/2271/", "include_deleted": true }'
Retrieve Page
Retrieve the full archived HTML content of a page, including all inline resources.
| Parameter | Type | Required | Description |
|---|---|---|---|
| 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 -X GET \ https://api.1990webarchive.com/v2/pages/1990-arc-8f3a2b1c?render=raw&include_assets=true \ -H "Authorization: Bearer sk_live_..."
Search by Era
Browse archived pages filtered by a specific decade. Returns a curated collection of representative pages from that era.
| Parameter | Type | Required | Description |
|---|---|---|---|
| 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 -X GET \ https://api.1990webarchive.com/v2/search/era/1990s?category=personal&has_audio=true \ -H "Authorization: Bearer sk_live_..."
Collections
List all curated collections available in the archive.
{
"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 all pages within a curated collection.
$ curl -X GET \ https://api.1990webarchive.com/v2/collections/geo-cities-restored/pages?page=1&per_page=20 \ -H "Authorization: Bearer sk_live_..."
Media
Retrieve the pixel-perfect screenshot of an archived page, rendered in its original dimensions and style.
| Parameter | Type | Required | Description |
|---|---|---|---|
| width | integer | optional | Output width in pixels (default: 1024) |
| format | string | optional | png (default) or webp |
Retrieve the MIDI or WAV audio file embedded in an archived page, extracted and preserved in its original format.
?embed=1 parameter.
Metadata
Get technical metadata about an archived page, including original HTML, technology stack, and preservation details.
{
"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
Retrieve a complete rendered snapshot of a page as it appeared at the time of archiving, including all stylesheets, fonts, and assets.
Get a side-by-side comparison view of a page's HTML from two different archival dates, useful for tracking design evolution.
Crawl
Initiate a new crawl of a live URL to add it to the archive. Supports recursive crawling with configurable depth and scope.
| Parameter | Type | Required | Description |
|---|---|---|---|
| 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 -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.
X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset.
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.
| Status | Code | Description |
|---|---|---|
| 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 |
{
"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"
}
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.
Official SDK
npm i 1990-archiver
Official SDK
pip install one_ninety
Community
mvn:1990-archiver-java
Community
cargo add 1990-archiver
Community
dotnet add 1990Archiver
Official SDK
go get 1990-archiver
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 /crawlfinishes 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
{
"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
}
}
sk_wh_...). Use the X-Signature header to verify authenticity before processing.
Pagination
All list endpoints support cursor-based pagination. Use the page and per_page parameters to navigate results.
# Page 1 — 50 results per page GET /v2/search?q=webmaster?page=1&per_page=50 # Page 2 — next set of 50 results GET /v2/search?q=webmaster?page=2&per_page=50 # Page 100 — maximum page GET /v2/search?q=webmaster?page=100&per_page=50
pagination object in every response to track your position. The total_pages field tells you the maximum page number available for the query.