worldcat-search-api

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

191 stars

Best use case

worldcat-search-api is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

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

Teams using worldcat-search-api should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/worldcat-search-api/SKILL.md --create-dirs "https://raw.githubusercontent.com/wentorai/research-plugins/main/skills/literature/search/worldcat-search-api/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/worldcat-search-api/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How worldcat-search-api Compares

Feature / Agentworldcat-search-apiStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

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

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 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/)