# ISBN Book Metadata & Cover Finder (`thescrapelab/isbn-book-metadata-enricher-cover-finder`) Actor

Validate ISBN-10 and ISBN-13 lists, then enrich books with titles, authors, publishers, publication dates, descriptions, page counts, categories, cover image URLs, Goodreads ratings, and source links. Built for fast, low-cost ISBN enrichment without paid book APIs.

- **URL**: https://apify.com/thescrapelab/isbn-book-metadata-enricher-cover-finder.md
- **Developed by:** [Inus Grobler](https://apify.com/thescrapelab) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.09 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ISBN Lookup, Book Metadata & Cover Finder

![ISBN Book Metadata & Cover Finder logo](assets/logo.svg)

Look up book details from ISBNs and get clean book metadata, cover image URLs, and source links. This Apify Actor is built for fast, low-cost ISBN enrichment without paid APIs.

It works as an **ISBN lookup**, **book metadata scraper**, and **book cover finder** for catalogs, spreadsheets, ecommerce listings, libraries, research lists, and publishing workflows.

### What You Get

For each ISBN, the Actor can return:

- Book title and author
- Publisher and publication date
- ISBN-10 and ISBN-13
- Book description
- Page count and language
- Categories or subjects when available
- Cover image URL
- Goodreads ratings when available
- Source links and confidence score

The Actor returns one clean dataset item per ISBN.

### Why Use This Actor

- Enrich book catalogs from ISBNs
- Find missing book cover URLs
- Validate ISBN lists
- Add titles, authors, publishers, and dates to spreadsheets
- Build book datasets without paying for metadata APIs
- Run cheap batch ISBN lookups on Apify

### No Paid Book APIs

This Actor does **not** use Google Books API, Open Library API, ISBNdb API, WorldCat API, paid APIs, LLMs, Playwright, or Puppeteer.

It uses lightweight scraping of public book pages only. This keeps runs simple, fast, and affordable.

### Input

Use `isbns` for every run. For one book, provide a list with one ISBN:

```json
{
  "isbns": ["9780441172719"],
  "maxItems": 1
}
````

This is also the recommended quick daily test input. It runs a single ISBN lookup, keeps compute use low, and is suitable for an Apify schedule or store smoke test.

For multiple books, add more ISBNs to the same list:

```json
{
  "isbns": [
    "9780441172719",
    "9780143127741",
    "978-0-452-28423-4"
  ]
}
```

Other options:

- `maxItems` limits how many ISBNs are processed
- `includeCovers` returns cover image URLs
- `includeDescription` returns book descriptions
- `proxyConfiguration` enables Apify Proxy if you choose to use it

### Output

Successful results are compact and only include fields that were found:

```json
{
  "input": "9780441172719",
  "normalizedInput": "9780441172719",
  "status": "success",
  "isValidIsbn": true,
  "isbn10": "0441172717",
  "isbn13": "9780441172719",
  "title": "Dune",
  "authors": ["Frank Herbert"],
  "publisher": "Ace Books",
  "publishedDate": "1987",
  "pageCount": 535,
  "language": "English",
  "description": "Set on the desert planet Arrakis...",
  "coverImages": {
    "large": "https://covers.openlibrary.org/b/id/15166231-L.jpg"
  },
  "sourceLinks": {
    "openLibrary": "https://openlibrary.org/books/OL22597282M/Dune",
    "goodreads": "https://www.goodreads.com/book/show/44767458-dune"
  },
  "ratings": {
    "goodreadsAverage": 4.29,
    "goodreadsRatingsCount": 1663898,
    "goodreadsReviewsCount": 85540
  },
  "sourcesUsed": ["openLibrary", "goodreads"],
  "confidence": 1,
  "scrapedAt": "2026-05-07T14:36:29.934Z"
}
```

If an ISBN is valid but no metadata is found:

```json
{
  "input": "9799999999990",
  "normalizedInput": "9799999999990",
  "status": "not_found",
  "isValidIsbn": true,
  "isbn13": "9799999999990",
  "sourcesUsed": [],
  "confidence": 0,
  "warnings": [
    "ISBN is valid but no metadata was found from available sources."
  ],
  "scrapedAt": "2026-05-07T14:36:31.131Z"
}
```

If an ISBN is invalid:

```json
{
  "input": "12345",
  "normalizedInput": "12345",
  "status": "failed",
  "isValidIsbn": false,
  "errors": [
    {
      "step": "isbn_validation",
      "message": "Invalid ISBN checksum or length."
    }
  ],
  "scrapedAt": "2026-05-07T14:36:30.357Z"
}
```

### Status Values

- `success` means enough metadata was found.
- `partial` means some metadata was found, but the record is incomplete.
- `not_found` means the ISBN is valid, but no public-page metadata was found.
- `failed` means the ISBN is invalid or could not be processed.

### Data Sources

The Actor currently uses public pages from:

- Open Library ISBN pages
- Goodreads public book/search pages

Amazon search is supported internally as an optional fallback, but it is not enabled by default because it is often blocked and can be unreliable.

### Cost And Speed

This Actor is designed to be cheap:

- No browser automation
- No image downloads
- No full HTML storage
- Modest concurrency
- Short retries and timeouts
- One dataset item per ISBN

### Limitations

Public websites can change HTML, block requests, or return incomplete metadata. Goodreads ratings and cover images may not always be available. This Actor is optimized for fast and affordable ISBN enrichment, not exhaustive bibliographic coverage.

### FAQ

#### Can I look up only one ISBN?

Yes. Enter it as a list with one item, for example `["9780441172719"]`.

#### Can the ISBNs include hyphens or labels?

Yes. Each list item is normalized before validation, so hyphens, spaces, and labels like `ISBN-13:` are removed.

#### Does it validate ISBN checksums?

Yes. It validates ISBN-10 and ISBN-13 checksums and converts between ISBN-10 and ISBN-13 when possible.

#### Does it download book covers?

No. It returns cover image URLs only.

#### Does it use official APIs?

No. It uses public web pages only.

# Actor input Schema

## `isbns` (type: `array`):

List of ISBN-10 or ISBN-13 values. For one book, enter one ISBN in the list.

## `maxItems` (type: `integer`):

Maximum number of unique ISBNs to process.

## `includeCovers` (type: `boolean`):

Return cover image URLs when available. Images are not downloaded.

## `includeDescription` (type: `boolean`):

Return descriptions when available.

## `proxyConfiguration` (type: `object`):

Optional. Leave disabled for the cheapest run.

## Actor input object example

```json
{
  "isbns": [
    "9780441172719"
  ],
  "maxItems": 100,
  "includeCovers": true,
  "includeDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset items containing validated ISBNs, book metadata, cover image URLs, source links, ratings, confidence, and per-item status.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "isbns": [
        "9780441172719"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("thescrapelab/isbn-book-metadata-enricher-cover-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "isbns": ["9780441172719"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("thescrapelab/isbn-book-metadata-enricher-cover-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "isbns": [
    "9780441172719"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call thescrapelab/isbn-book-metadata-enricher-cover-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=thescrapelab/isbn-book-metadata-enricher-cover-finder",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ISBN Book Metadata & Cover Finder",
        "description": "Validate ISBN-10 and ISBN-13 lists, then enrich books with titles, authors, publishers, publication dates, descriptions, page counts, categories, cover image URLs, Goodreads ratings, and source links. Built for fast, low-cost ISBN enrichment without paid book APIs.",
        "version": "0.1",
        "x-build-id": "033ylKXFeOSNgQsPL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/thescrapelab~isbn-book-metadata-enricher-cover-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-thescrapelab-isbn-book-metadata-enricher-cover-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/thescrapelab~isbn-book-metadata-enricher-cover-finder/runs": {
            "post": {
                "operationId": "runs-sync-thescrapelab-isbn-book-metadata-enricher-cover-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/thescrapelab~isbn-book-metadata-enricher-cover-finder/run-sync": {
            "post": {
                "operationId": "run-sync-thescrapelab-isbn-book-metadata-enricher-cover-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "isbns": {
                        "title": "ISBNs",
                        "type": "array",
                        "description": "List of ISBN-10 or ISBN-13 values. For one book, enter one ISBN in the list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max ISBNs",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of unique ISBNs to process.",
                        "default": 100
                    },
                    "includeCovers": {
                        "title": "Find cover images",
                        "type": "boolean",
                        "description": "Return cover image URLs when available. Images are not downloaded.",
                        "default": true
                    },
                    "includeDescription": {
                        "title": "Include book descriptions",
                        "type": "boolean",
                        "description": "Return descriptions when available.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. Leave disabled for the cheapest run."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
