Umich APIquod.lib.umich.edu ↗
Browse, search, and retrieve metadata from U-M Library Digital Collections. Access item details, full text, and IIIF image data across all collections.
What is the Umich API?
This API exposes 7 endpoints for accessing the University of Michigan Library Digital Collections, covering collection listings, cross-collection search, item metadata, full text, and IIIF image information. Use search_all_collections to run keyword queries across all digitized holdings, or get_item_detail to retrieve structured bibliographic metadata — including author, publication, subject terms, and rights — for any specific item.
curl -X GET 'https://api.parse.bot/scraper/cf828251-187b-4069-a1bb-10ea0cccbcc4/list_collections' \ -H 'X-API-Key: $PARSE_API_KEY'
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 quod-lib-umich-edu-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.
from parse_apis.umich_digital_collections_api import UMichLibrary, Collection, CollectionSummary, Item, ItemDetail
library = UMichLibrary()
# List all available collections
for coll_summary in library.collections.list(limit=5):
print(coll_summary.id, coll_summary.title, coll_summary.description[:80])
# Get full details on a specific collection
collection = library.collection(id="alajournals")
detail = collection.search(query="lincoln", limit=3)
# Search within a collection and access items
for item in collection.search(query="lincoln", limit=3):
print(item.id, item.title)
# Cross-collection search
for item in library.items.search(query="university", limit=5):
print(item.id, item.title, item.url)
# Navigate from collection to item detail via sub-resource
item_detail = library.collection(id="alajournals").items.get(item_id="0064218.1910.001")
print(item_detail.title, item_detail.collection_id, item_detail.url)
for entry in item_detail.toc:
print(entry.label, entry.url)
# Get full text of an item
fulltext = item_detail.fulltext()
print(fulltext.id, fulltext.collection_id, fulltext.text[:200])
# Get image metadata for a page
img_meta = item_detail.image_metadata(image_id="00000001")
print(img_meta.width, img_meta.height, img_meta.id)
for tile in img_meta.tiles:
print(tile.width, tile.height, tile.scale_factors)
List all digital collections from the University of Michigan Library. Returns an array of collections with titles, descriptions, and IDs. Supports optional filtering by format, access level, or subject. No pagination - all matching collections are returned in a single response.
| Param | Type | Description |
|---|---|---|
| access_filter | string | Filter by access level (passed as byAccess query param to the upstream site) |
| format_filter | string | Filter by format type (passed as byFormat query param to the upstream site) |
| subject_filter | string | Filter by subject area (passed as bySubject query param to the upstream site) |
{
"type": "object",
"fields": {
"total": "integer count of collections returned",
"collections": "array of collection objects with id, title, url, description, and metadata"
},
"sample": {
"data": {
"total": 221,
"collections": [
{
"id": "alajournals",
"url": "https://quod.lib.umich.edu/a/alajournals",
"title": "Abraham Lincoln Association Serials",
"metadata": {},
"description": "Between 1940 and 1952..."
}
]
},
"status": "success"
}
}About the Umich API
Collection Discovery and Search
The list_collections endpoint returns an array of collection objects, each with an id, title, url, description, and associated metadata. You can narrow results using three optional filter parameters: access_filter, format_filter, and subject_filter. Once you have a collection ID, get_collection_detail returns that collection's statistics (item count), description, and a search_options array of browse and search links available for that collection.
For search, search_collection accepts a required query and collection_id and returns paginated results (up to 50 per page) including item id, title, url, and metadata fields. The search_all_collections endpoint runs the same keyword query across all text collections simultaneously, returning a results array with the same shape.
Item-Level Data
get_item_detail takes a collection_id and item_id (obtainable from any search result) and returns the item's full bibliographic metadata object — fields include Title, Author, Publication, Subject terms, and Rights/Permissions — plus a toc array of page- or section-level links. get_item_fulltext retrieves the text content extracted from the item page; for scanned books, page-level text may require navigating individual page URLs from the TOC.
IIIF Image Metadata
get_image_metadata returns the IIIF Image API info.json for a specific page image, identified by collection_id, item_id, and an eight-digit zero-padded image_id (e.g., 00000001 for page 1). The response includes pixel width and height, a sizes array of pre-rendered dimensions, and a tiles array with tile width, height, and scaleFactors — sufficient to construct IIIF-compliant tile requests for any page.
The Umich API is a managed, monitored endpoint for quod.lib.umich.edu — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when quod.lib.umich.edu 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 quod.lib.umich.edu 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?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a full-text search interface over a specific U-M historical collection using
search_collectionwith paginated results - Aggregate bibliographic metadata across all collections with
search_all_collectionsfor downstream citation analysis - Retrieve IIIF image dimensions and tile configurations via
get_image_metadatato render zoomable page images in a custom viewer - Enumerate available collections and their item counts via
list_collectionsandget_collection_detailfor a library discovery portal - Extract subject terms and rights metadata from
get_item_detailto build a rights-aware digitized materials catalog - Pull table of contents entries from the
tocarray inget_item_detailto enable chapter-level navigation in a reading application - Ingest full-text content via
get_item_fulltextfor indexing digitized books and manuscripts in a search engine
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 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.
Does the University of Michigan Library provide an official developer API for its digital collections?+
What does `get_item_detail` return beyond the item title?+
get_item_detail returns a structured metadata object with fields such as Author, Publication, Subject terms, and Rights/Permissions, plus a toc array of labeled section or page links with URLs. It also echoes the collection_id and provides the canonical url for the item.Does pagination work the same way across search endpoints?+
search_collection and search_all_collections accept an optional page integer (starting at 1) and return up to 50 results per page. search_collection also returns a total integer for the full result count; search_all_collections does not currently expose a total field in its response.Does the API support downloading full page images or PDFs?+
get_image_metadata, which provides the data needed to construct tile URLs for a IIIF viewer. Direct image binary download or PDF generation endpoints are not included. You can fork the API on Parse and revise it to add an endpoint that constructs and returns full image or PDF download URLs based on the IIIF data.Is there a limitation on which collections support full-text search?+
search_all_collections explicitly targets text collections, so collections containing only images or non-text materials may not appear in cross-collection search results. search_collection scoped to a specific collection ID works within whatever search capability that collection exposes. Collections without indexed text will return limited or no results for keyword queries.