# OverDrive API

> OverDrive returns public library ebook and audiobook availability as a workflow and API.

OverDrive, also known as Libby, finds ebook and audiobook editions in a public library catalog using a title and library name. Check library availability can also use an author and format to return copies owned, current availability, holds, and estimated wait.

- Page: https://fous.com/tools/overdrive
- Handle: `@overdrive`
- Category: [Entertainment](https://fous.com/tools/category/entertainment)
- Source website: https://overdrive.com
- Last verified: Sep 29, 2026

## Methods

### Check library availability

Operation `check_library_availability`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

Find ebook and audiobook editions a public library owns, with copies, holds, and estimated wait when unavailable. Searches public catalog listings; results may omit titles beyond the first ten title-search pages.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `title` | string | yes | `"Lessons in Chemistry"` | Book title, for example Lessons in Chemistry. |
| `author` | string | no | `"Bonnie Garmus"` | Optional author name, for example Bonnie Garmus. |
| `format` | string | no | `"audiobook"` | Choose any, ebook, or audiobook; for example audiobook. |
| `library` | string | yes | `"New York Public Library"` | Public library name or city, for example New York Public Library or Seattle. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "title",
    "library"
  ],
  "properties": {
    "title": {
      "type": "string",
      "description": "Book title, for example Lessons in Chemistry.",
      "examples": [
        "Lessons in Chemistry",
        "This title does not exist xqzqxy"
      ]
    },
    "author": {
      "type": "string",
      "description": "Optional author name, for example Bonnie Garmus.",
      "examples": [
        "Bonnie Garmus"
      ]
    },
    "format": {
      "enum": [
        "any",
        "ebook",
        "audiobook"
      ],
      "type": "string",
      "default": "any",
      "description": "Choose any, ebook, or audiobook; for example audiobook.",
      "examples": [
        "audiobook"
      ]
    },
    "library": {
      "type": "string",
      "description": "Public library name or city, for example New York Public Library or Seattle.",
      "examples": [
        "New York Public Library",
        "Seattle"
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "title": "Lessons in Chemistry",
      "author": "Bonnie Garmus",
      "library": "New York Public Library"
    },
    {
      "title": "Lessons in Chemistry",
      "format": "audiobook",
      "library": "Seattle"
    },
    {
      "title": "This title does not exist xqzqxy",
      "library": "Seattle"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `editions` | array |  | Matching editions in the public catalog. |
| `editions[].title` | string | `"Lessons in Chemistry"` |  |
| `editions[].author` | string or null | `"Bonnie Garmus"` |  |
| `editions[].format` | string | `"ebook"` |  |
| `editions[].catalog_link` | string | `"https://nypl.overdrive.com/media/6384649"` |  |
| `editions[].copies_owned` | integer or null | `17` |  |
| `editions[].available_now` | boolean | `false` |  |
| `editions[].number_of_holds` | integer or null | `72` |  |
| `editions[].cover_image_link` | string or null | `"https://img1.od-cdn.com/ImageType-400/0111-1/{66227E65-A2C4-42E1-883A-43B8272BBE13}IMG400.JPG"` |  |
| `editions[].copies_available_now` | integer or null | `0` |  |
| `editions[].estimated_wait_weeks` | number or null | `8.7` |  |
| `library_name` | string | `"New York Public Library"` | Public library collection name. |

**Example input**

```json
{
  "title": "Lessons in Chemistry",
  "author": "Bonnie Garmus",
  "library": "New York Public Library"
}
```

**Example output**

```json
{
  "editions": [
    {
      "title": "Lessons in Chemistry",
      "author": "Bonnie Garmus",
      "format": "ebook",
      "catalog_link": "https://nypl.overdrive.com/media/6384649",
      "copies_owned": 17,
      "available_now": false,
      "number_of_holds": 72,
      "cover_image_link": "https://img1.od-cdn.com/ImageType-400/0111-1/{66227E65-A2C4-42E1-883A-43B8272BBE13}IMG400.JPG",
      "copies_available_now": 0,
      "estimated_wait_weeks": 8.7
    },
    {
      "title": "Lessons in Chemistry",
      "author": "Bonnie Garmus",
      "format": "audiobook",
      "catalog_link": "https://nypl.overdrive.com/media/6397003",
      "copies_owned": 81,
      "available_now": true,
      "number_of_holds": 1,
      "cover_image_link": "https://img2.od-cdn.com/ImageType-400/1191-1/{5AC0CB3C-7696-490C-9FBE-9D2E53167A7F}IMG400.JPG",
      "copies_available_now": 1,
      "estimated_wait_weeks": null
    }
  ],
  "library_name": "New York Public Library"
}
```

## Quick start

Replace `YOUR_API_KEY` with a Fous API key. To create one, open Developers at the bottom of Fous Studio, turn on Developer mode, then go to API keys (https://app.fous.com/keys). Change the values in `input` to run the same tool on new data.

```bash
curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 180 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@overdrive",
  "visibility": "public",
  "operation": "check_library_availability",
  "version": 1,
  "input": {
    "title": "Lessons in Chemistry",
    "author": "Bonnie Garmus",
    "library": "New York Public Library"
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
import json
import urllib.error
import urllib.request

api_key = "YOUR_API_KEY"

body = json.loads("{\n  \"api\": \"@overdrive\",\n  \"visibility\": \"public\",\n  \"operation\": \"check_library_availability\",\n  \"version\": 1,\n  \"input\": {\n    \"title\": \"Lessons in Chemistry\",\n    \"author\": \"Bonnie Garmus\",\n    \"library\": \"New York Public Library\"\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
const apiKey = "YOUR_API_KEY";

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(180_000),
  body: JSON.stringify({
  "api": "@overdrive",
  "visibility": "public",
  "operation": "check_library_availability",
  "version": 1,
  "input": {
    "title": "Lessons in Chemistry",
    "author": "Bonnie Garmus",
    "library": "New York Public Library"
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

## Use from an AI assistant

Connect this tool to Claude Code, Claude Desktop, Cursor, VS Code, Codex and any MCP client as its own MCP server. Each method is a typed tool whose arguments are the method’s input.

- Server URL: `https://api.fous.com/mcp/tools/overdrive`
- Authorization: `Authorization: Bearer <Fous API key>`

**Tools**

- `check_library_availability`: Check library availability. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `fous_get_run`: the result of a run that was still going, by its `request_id`. Free.

Claude Code:

```bash
claude mcp add --scope user --transport http fous-overdrive https://api.fous.com/mcp/tools/overdrive --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"
```

To give the assistant every tool, connect `https://api.fous.com/mcp`: it finds one with `fous_search_tools` and runs it with `fous_run_tool`. Setup for other clients: https://fous.com/llms-full.txt.

## Use cases

- Check whether a library has a book available now
- Compare ebook and audiobook editions at a public library
- Estimate the wait for an unavailable title
- Review holds and copies owned for matching editions

## FAQ

### Can I run it with my own inputs?

Yes. Change the inputs in Studio and press Run, or send new inputs from your code, or ask a connected AI assistant.

### Can I call this OverDrive tool as an API?

Yes. Send a POST request to /v1/query with your Fous API key and the inputs, and get JSON back.

### How much does it cost?

Each completed run costs 1 credit. Failed runs without a completed receipt are free; completed work can remain charged if delivery is interrupted. With pay as you go, a credit costs 1¢. Monthly plans cost less per credit.

### Do I need a OverDrive account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from overdrive.com when you run it. Some results are reused for up to 24 hours, and results that use your account or key are never reused. It was last verified on Sep 29, 2026.

### Does my library have this book available?

Use Check library availability with the book title and library name to find editions and whether copies are available now.

### How long is the wait for an unavailable book?

Check library availability returns an estimated wait in weeks when an edition is unavailable.

### Can I find audiobook editions at a library?

Use Check library availability with the title, library name, and audiobook format.

## Related

- [Open Library API](https://fous.com/tools/open-library.md): Open Library returns book search results, catalog details, and author works; availability reflects listed editions, not current loan availability, and catalog details may be missing.
- [Audible API](https://fous.com/tools/audible.md): Audible offers audiobooks, podcasts, and audio entertainment, with public book details and current bestselling audiobook charts; availability and categories vary by store.
- [Goodreads API](https://fous.com/tools/goodreads.md): Goodreads returns public book searches, matched-book details with variable editions, popular or newest reviews, author books by popularity or date, and up to 100 quotes.
- [Project Gutenberg API](https://fous.com/tools/project-gutenberg.md): Project Gutenberg offers free public-domain ebooks and reading materials, with searchable book details and plain text from the most-downloaded matching edition available.
- [Google Books API](https://fous.com/tools/google-books.md): Google Books searches books and provides book details, reader ratings, and local ebook prices when available; newest results sort by publication date.
- [Library of Congress API](https://fous.com/tools/library-of-congress.md): Library of Congress returns searchable digital collections and historic newspaper pages; rights notes may be absent, and newspaper text may contain OCR errors.
- [Meta Ad Library API](https://fous.com/tools/meta-ad-library.md): Explore ads running across Meta platforms.
- [Books to Scrape API](https://fous.com/tools/books-to-scrape.md): Demo book catalog with synthetic prices.
- [All Entertainment tools](https://fous.com/tools/category/entertainment)
