Skip to content
Back to skills

Worldcat Search Api

ASecurity

Search the world's largest library catalog via OCLC WorldCat API

  • 3,639 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added June 6, 2026
researchpythongobashgitapidocumentation

Works with

  • cli
  • api

Security analysis

A100/100

Scanned June 6, 2026

npx -y skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill worldcat-search-api --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Worldcat Search Api?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Worldcat Search Api
[![Security: A β€” Skills Directory](https://www.skillsdirectory.com/api/skills/brycewang-stanford-worldcat-search-api/badge)](https://www.skillsdirectory.com/skills/brycewang-stanford-worldcat-search-api)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: worldcat-search-api
description: "Search the world's largest library catalog via OCLC WorldCat API"
metadata:
  openclaw:
    emoji: "πŸ›οΈ"
    category: "literature"
    subcategory: "search"
    keywords: ["worldcat", "library catalog", "OCLC", "book search", "holdings", "interlibrary loan"]
    source: "https://developer.api.oclc.org/"
---

# WorldCat Search API

## Overview

WorldCat is the world's largest network of library content, aggregating catalogs from 10,000+ libraries across 170+ countries. The Search API provides access to 500M+ bibliographic records β€” books, journals, dissertations, media, and more β€” with holdings information showing which libraries own each item. Essential for interlibrary loan discovery, collection analysis, and comprehensive bibliographic searches. Requires a WSKey (free for non-commercial use).

## Authentication

```bash
# Register at https://platform.worldcat.org/
# Obtain a WSKey (API key) for your application

# OAuth 2.0 client credentials flow
curl -X POST "https://oauth.oclc.org/token" \
  -u "$WSKEY_CLIENT_ID:$WSKEY_SECRET" \
  -d "grant_type=client_credentials&scope=wcapi"
```

## API Endpoints

### Base URL

```
https://www.worldcat.org/api/search/
```

### Search Bibliographic Records

```bash
# Keyword search
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.worldcat.org/api/search?q=machine+learning&limit=25"

# Search by title
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.worldcat.org/api/search?q=ti:attention+is+all+you+need"

# Search by author
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.worldcat.org/api/search?q=au:hinton+geoffrey"

# Search by ISBN
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.worldcat.org/api/search?q=bn:9780262035613"

# Combined filters
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.worldcat.org/api/search?q=su:artificial+intelligence+AND+yr:2020-2026&itemType=book"
```

### Search Indexes

| Index | Prefix | Example |
|-------|--------|---------|
| Keyword | (none) | `q=neural+networks` |
| Title | `ti:` | `q=ti:deep+learning` |
| Author | `au:` | `q=au:goodfellow` |
| Subject | `su:` | `q=su:machine+learning` |
| ISBN | `bn:` | `q=bn:9780262035613` |
| ISSN | `n:` | `q=n:0028-0836` |
| OCLC Number | `no:` | `q=no:1234567` |
| Publisher | `pb:` | `q=pb:MIT+Press` |
| Year | `yr:` | `q=yr:2024` or `yr:2020-2026` |
| Language | `la:` | `q=la:eng` |

### Query Parameters

| Parameter | Description | Example |
|-----------|-------------|---------|
| `q` | Search query with indexes | `q=ti:BERT+AND+au:devlin` |
| `limit` | Results per page (max 50) | `limit=25` |
| `offset` | Pagination offset | `offset=50` |
| `itemType` | Format filter | `book`, `journal`, `thesis`, `audiobook` |
| `itemSubType` | Subtype filter | `digital`, `printbook` |
| `heldByInstitutionID` | Holdings filter | Institution registry ID |
| `orderBy` | Sort order | `bestMatch`, `mostWidelyHeld`, `datePublished` |

### Get Record by OCLC Number

```bash
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.worldcat.org/api/search/brief-bibs/{oclc_number}"
```

### Holdings / Library Locations

```bash
# Find libraries holding a specific item
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.worldcat.org/api/search/brief-bibs/{oclc_number}/holdings?lat=42.36&lon=-71.06&distance=50"
```

## Response Structure

```json
{
  "numberOfRecords": 1250,
  "briefRecords": [
    {
      "oclcNumber": "1234567890",
      "title": "Deep Learning",
      "creator": "Ian Goodfellow; Yoshua Bengio; Aaron Courville",
      "date": "2016",
      "publisher": "MIT Press",
      "language": "eng",
      "generalFormat": "Book",
      "specificFormat": "PrintBook",
      "isbns": ["9780262035613"],
      "catalogingInfo": {
        "catalogingAgency": "DLC"
      },
      "totalHoldingCount": 3542
    }
  ]
}
```

## Python Usage

```python
import os
import requests

CLIENT_ID = os.environ["OCLC_WSKEY_ID"]
CLIENT_SECRET = os.environ["OCLC_WSKEY_SECRET"]
BASE_URL = "https://www.worldcat.org/api/search"


def get_token() -> str:
    """Obtain OAuth token from OCLC."""
    resp = requests.post(
        "https://oauth.oclc.org/token",
        auth=(CLIENT_ID, CLIENT_SECRET),
        data={"grant_type": "client_credentials", "scope": "wcapi"},
    )
    resp.raise_for_status()
    return resp.json()["access_token"]


def search_worldcat(query: str, limit: int = 25,
                    item_type: str = None) -> list:
    """Search WorldCat bibliographic records."""
    token = get_token()
    params = {"q": query, "limit": limit}
    if item_type:
        params["itemType"] = item_type

    resp = requests.get(
        BASE_URL,
        headers={"Authorization": f"Bearer {token}"},
        params=params,
    )
    resp.raise_for_status()
    data = resp.json()

    results = []
    for rec in data.get("briefRecords", []):
        results.append({
            "oclc": rec.get("oclcNumber"),
            "title": rec.get("title"),
            "creator": rec.get("creator"),
            "date": rec.get("date"),
            "publisher": rec.get("publisher"),
            "format": rec.get("generalFormat"),
            "holdings": rec.get("totalHoldingCount", 0),
            "isbns": rec.get("isbns", []),
        })
    return results


def find_nearby_holdings(oclc_number: str,
                         lat: float, lon: float,
                         distance_km: int = 50) -> list:
    """Find libraries near a location that hold a specific item."""
    token = get_token()
    resp = requests.get(
        f"{BASE_URL}/brief-bibs/{oclc_number}/holdings",
        headers={"Authorization": f"Bearer {token}"},
        params={"lat": lat, "lon": lon, "distance": distance_km},
    )
    resp.raise_for_status()
    return resp.json().get("briefRecords", [])


# Example: find widely-held ML textbooks
books = search_worldcat("su:machine learning AND yr:2020-2026",
                        item_type="book", limit=10)
for b in books:
    print(f"[{b['date']}] {b['title']} β€” {b['publisher']} "
          f"(held by {b['holdings']} libraries)")
```

## Use Cases

1. **Interlibrary loan**: Find nearest library holding a needed item
2. **Collection gap analysis**: Compare institutional holdings against a bibliography
3. **Dissertation discovery**: Search theses across global repositories
4. **Edition tracking**: Find all editions/translations of a work
5. **Bibliographic verification**: Confirm ISBNs, publication dates, and publishers

## Access Tiers

| Tier | Access | Rate Limit |
|------|--------|------------|
| WSKey (free) | Search + brief records | Moderate |
| Enterprise | Full MARC records + analytics | Higher |

## References

- [WorldCat Search API Documentation](https://developer.api.oclc.org/)
- [OCLC Developer Network](https://platform.worldcat.org/)
- [WorldCat.org](https://www.worldcat.org/)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.