Discover/David Rumsey API
live

David Rumsey APIdavidrumsey.com

Search and retrieve metadata from the David Rumsey Map Collection. Access IIIF URLs, georeferencing status, image dimensions, and map details via 2 endpoints.

This API takes change requests — .
Endpoints
2
Updated
3d ago

What is the David Rumsey API?

The David Rumsey Historical Map Collection API provides access to one of the largest digitized historical map archives through 2 endpoints. Use search_maps to query the collection by keyword and retrieve paginated results including IIIF image service URLs, full-resolution image URLs, and georeferencing status. Use get_map_details to pull comprehensive metadata for a specific map by its unique item ID, including publisher, scale, physical dimensions, and IIIF manifest URL.

This call costs3 credits / call— charged only on success
Try it
Page number for pagination (starts at 1).
Search keyword to query the map collection.
Number of results per page (1-100).
api.parse.bot/scraper/e62c82ea-9333-413b-9115-6db7e68e5acf/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/e62c82ea-9333-413b-9115-6db7e68e5acf/search_maps' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

Typed, relational, agent-ready

A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.

  • Fully typed · autocompletes
  • Objects link to objects
  • Typed errors & pagination

Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:

uv add parse-sdk
uv run parse init
uv run parse add --marketplace davidrumsey-com-api

uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.

"""
David Rumsey Map Collection API Client

Search and retrieve detailed metadata from the David Rumsey Historical Map Collection.
Get your API key from: https://parse.bot/settings
"""

import os
import requests
from typing import Optional


class ParseClient:
    """Client for David Rumsey Map Collection API"""

    def __init__(self, api_key: Optional[str] = None):
        """Initialize the Parse API client"""
        self.base_url = "https://api.parse.bot"
        self.scraper_id = "e62c82ea-9333-413b-9115-6db7e68e5acf"
        self.api_key = api_key or os.getenv("PARSE_API_KEY")
        if not self.api_key:
            raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")

    def _call(self, endpoint: str, method: str = "POST", **params) -> dict:
        """Make an API call to the Parse endpoint"""
        url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
        headers = {
            "X-API-Key": self.api_key,
            "Content-Type": "application/json"
        }

        if method == "GET":
            response = requests.get(url, headers=headers, params=params)
        elif method == "POST":
            response = requests.post(url, headers=headers, json=params)
        else:
            raise ValueError(f"Unsupported HTTP method: {method}")

        response.raise_for_status()
        return response.json()

    def search_maps(
        self,
        keyword: str = "San Francisco",
        page: int = 1,
        page_size: int = 20
    ) -> dict:
        """
        Search the David Rumsey Historical Map Collection by keyword.

        Args:
            keyword: Search keyword to query the map collection
            page: Page number for pagination (starts at 1)
            page_size: Number of results per page (1-100)

        Returns:
            Dictionary containing total_results, page, page_size, and results array
        """
        return self._call(
            "search_maps",
            method="GET",
            keyword=keyword,
            page=page,
            page_size=page_size
        )

    def get_map_details(self, item_id: str) -> dict:
        """
        Get detailed metadata for a specific map item by its unique ID.

        Args:
            item_id: Unique item identifier in format RUMSEY~8~1~XXXXXX~XXXXXXXX

        Returns:
            Dictionary containing comprehensive map metadata including IIIF URLs
        """
        return self._call("get_map_details", method="GET", item_id=item_id)


def main():
    """Practical workflow example: search for maps and get details on georeferenced ones"""

    client = ParseClient()

    print("=" * 60)
    print("David Rumsey Map Collection - Search and Details Example")
    print("=" * 60)

    # Step 1: Search for maps about California
    print("\n1. Searching for maps about 'California Gold Rush'...")
    search_results = client.search_maps(
        keyword="California Gold Rush",
        page=1,
        page_size=5
    )

    print(f"   Found {search_results['total_results']} total maps")
    print(f"   Showing {len(search_results['results'])} results on page {search_results['page']}\n")

    # Step 2: Process each search result
    georeferenced_count = 0
    maps_to_examine = []

    for idx, map_item in enumerate(search_results['results'], 1):
        print(f"\n   Result {idx}: {map_item['title']}")
        print(f"   - Date: {map_item['date']}")
        print(f"   - Author: {map_item['author']}")
        print(f"   - Type: {map_item['type']}")
        print(f"   - Image Size: {map_item['image_width']}x{map_item['image_height']}")
        print(f"   - Georeferenced: {map_item['georeferenced']}")

        if map_item['georeferenced']:
            georeferenced_count += 1
            maps_to_examine.append(map_item['item_id'])

    print(f"\n2. Found {georeferenced_count} georeferenced maps from search results")

    # Step 3: Get detailed information for georeferenced maps
    if maps_to_examine:
        print("\n3. Fetching detailed information for georeferenced maps...\n")

        for item_id in maps_to_examine[:3]:  # Limit to first 3 for demo
            print(f"   Fetching details for: {item_id}")
            details = client.get_map_details(item_id)

            print(f"   Full Title: {details['full_title']}")
            if details.get('obj_width_cm') and details.get('obj_height_cm'):
                print(f"   Physical Size: {details['obj_width_cm']}cm × {details['obj_height_cm']}cm")
            if details.get('scale'):
                print(f"   Scale: {details['scale']}")
            print(f"   IIIF Manifest: {details['iiif_manifest_url']}")
            print(f"   Full Resolution: {details['full_resolution_image_url']}")
            print(f"   Status: {details['georeferencer_status']}")
            print()

    print("=" * 60)
    print("Example workflow completed successfully!")
    print("=" * 60)


if __name__ == "__main__":
    main()
All endpoints · 2 totalmissing one? ·

Search the David Rumsey Historical Map Collection by keyword. Returns paginated results with metadata including title, date, author, item ID, IIIF image service URL, full-resolution image URL, download URL, image dimensions, and georeferencing status for each map.

Input
ParamTypeDescription
pageintegerPage number for pagination (starts at 1).
keywordstringSearch keyword to query the map collection.
page_sizeintegerNumber of results per page (1-100).
Response
{
  "type": "object",
  "fields": {
    "page": "integer",
    "results": "array of map result objects",
    "page_size": "integer",
    "total_results": "integer"
  },
  "sample": {
    "page": 1,
    "results": [
      {
        "date": "1876",
        "type": "Atlas Map",
        "title": "New railroad map of the United States and Dominion of Canada.",
        "author": "Andreas, A. T. (Alfred Theodore), 1839-1900; Baskin, Forster and Company",
        "item_id": "RUMSEY~8~1~22982~790006",
        "list_no": "0019.006",
        "image_width": 11043,
        "download_url": "https://www.davidrumsey.com/rumsey/download.pl?image=/D0079/0019006.sid",
        "image_height": 6624,
        "georeferenced": true,
        "iiif_manifest_url": "https://www.davidrumsey.com/luna/servlet/iiif/m/RUMSEY~8~1~22982~790006/manifest",
        "georeferencer_status": "georeferenced",
        "iiif_image_service_url": "https://www.davidrumsey.com/luna/servlet/iiif/RUMSEY~8~1~22982~790006",
        "full_resolution_image_url": "https://www.davidrumsey.com/luna/servlet/iiif/RUMSEY~8~1~22982~790006/full/full/0/default.jpg"
      }
    ],
    "page_size": 3,
    "total_results": 7413
  }
}

About the David Rumsey API

Searching the Collection

The search_maps endpoint accepts a keyword string and returns paginated results controlled by page and page_size (1–100 items per page). Each result object includes the map's title, author, date, item_id, iiif_image_service_url, full_resolution_image_url, download_url, image dimensions, and georeferencing status. The item_id follows the format RUMSEY~8~1~XXXXXX~XXXXXXXX and serves as the key to fetch deeper metadata.

Retrieving Map Details

The get_map_details endpoint takes a required item_id and returns a richer metadata record. Fields include title, author, date, publisher, scale, type, list_no, image_no, note, image dimensions, iiif_image_service_url, iiif_manifest_url, full_resolution_image_url, download_url, and georeferencing data. The IIIF manifest URL is particularly useful for integrating the map into viewers like OpenSeadragon or Universal Viewer.

IIIF and Georeferencing

Every map result exposes a iiif_image_service_url, enabling tile-based rendering at arbitrary zoom levels through any IIIF-compliant image viewer. The get_map_details response additionally provides a iiif_manifest_url for full presentation metadata. Georeferencing status indicates whether a map has been spatially registered, which is relevant for overlaying historical maps onto modern basemaps in GIS applications.

Coverage and Scope

The collection spans several centuries of cartographic history with global geographic coverage. Keyword search surfaces maps by place name, cartographer, date, or subject. Pagination via page and total_results lets you iterate the full result set for a given query. Physical dimension fields (scale, image width/height) support research workflows that need to reason about map resolution or reproduction quality.

Reliability & maintenance

The David Rumsey API is a managed, monitored endpoint for davidrumsey.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when davidrumsey.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.

This isn't an official davidrumsey.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.

Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Overlay georeferenced historical maps onto modern web maps using the IIIF image service URL for tile rendering
  • Build a research tool that surfaces David Rumsey maps by place name keyword and displays full-resolution images
  • Filter maps by georeferencing status to identify candidates for spatial analysis in a GIS pipeline
  • Populate a digital humanities database with structured map metadata including author, date, publisher, and scale
  • Integrate IIIF manifest URLs into deep-zoom viewers like Universal Viewer or Mirador for scholarly annotation
  • Compare physical and digital image dimensions across maps to assess scan resolution for reproduction projects
  • Enumerate a cartographer's full output by searching their name and paginating through all matching results
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min

One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.

Frequently asked questions
Does David Rumsey provide an official developer API?+
The David Rumsey Map Collection exposes a LUNA Servlet-based search interface and supports IIIF image and presentation APIs for tile access and manifests. There is no formally documented REST developer API with key-based access published at a dedicated developer portal.
What does the `get_map_details` endpoint return beyond what `search_maps` provides?+
get_map_details adds fields not present in search results: publisher, scale, type, list_no, image_no, note, and a iiif_manifest_url. The manifest URL is absent from search_maps results, making get_map_details the right call when you need to feed a IIIF-compliant viewer or need bibliographic detail beyond title, author, and date.
Can I retrieve a list of all maps in the collection without a keyword?+
The search_maps endpoint accepts an optional keyword parameter, so you can call it without a keyword to browse the collection. Pagination is controlled via page and page_size, and total_results tells you the full set size. Iterating all results without a keyword will surface the entire indexed collection across pages.
Does the API expose collection-level browse categories, curator notes, or user annotations?+
Not currently. The API covers per-map metadata and search results. Individual map notes are returned in the note field of get_map_details, but collection folders, curator-defined categories, and any user annotation layers are not exposed. You can fork this API on Parse and revise it to add an endpoint targeting those browse structures.
Is there a known limitation on how many results a single search query can return?+
page_size is capped at 100 per request. For queries with large result sets, you need to paginate using the page parameter and total_results to determine how many pages exist. There is no single-call method to retrieve more than 100 maps at once.
Page content last updated . Spec covers 2 endpoints from davidrumsey.com.
Related APIs in Maps GeoSee all →
geonames.org API
Search for places worldwide and get their exact coordinates, timezone information, and elevation data, or reverse lookup locations by coordinates to discover nearby areas. Access postal codes, country details, and geographic names across the globe to build location-aware applications and services.
portofrotterdam.com API
Track live vessel movements and monitor port performance metrics including container throughput and anchorage statistics for the Port of Rotterdam. Access nautical notices and search detailed port information to stay updated on shipping operations and port conditions.
expatistan.com API
Compare cost of living across cities and countries worldwide, view rankings, and analyze expense data to make informed decisions about relocating or understanding living costs globally. Search for specific cities and access the latest pricing information on housing, food, transportation, and other essential expenses.
citymapper.com API
Get real-time transit information including live stop arrivals, service status, and line details across major cities worldwide. Search for nearby transit options and stay informed with service alerts to plan your commute efficiently.
marinetraffic.com API
Track maritime vessels in real-time by searching for ships by name, MMSI, or IMO number, viewing their current positions and navigational status, and accessing detailed specifications and photos. Filter vessels by type to get the maritime intelligence you need for shipping, logistics, or maritime awareness.
mbta.com API
Track real-time subway, bus, and commuter rail departures across Greater Boston, check schedules and service alerts, and find detailed information about routes and stops. Plan your commute with up-to-the-minute MBTA transit data and never miss your connection.
plugshare.com API
Search for EV charging stations worldwide by location and radius. Retrieve real-time availability, connector types, user reviews, and amenity details for any station. Filter by residential or commercial property type to find chargers at apartment complexes, parking facilities, and more.
bart.gov API
Track live BART train departures and arrival estimates across all Bay Area stations in real-time. Find your nearest station and see exactly when the next train is arriving on every platform.