# Book Finder (`zerobreak/book-finder`) Actor

Search one or multiple books and retrieve structured metadata including title, author, cover image, publication year, edition count, and available languages. Processes searches concurrently for fast results and returns clean, deduplicated book data ready for apps, research, and automation workflows.

- **URL**: https://apify.com/zerobreak/book-finder.md
- **Developed by:** [ZeroBreak](https://apify.com/zerobreak) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### Book Finder

Search one or multiple books and get structured book information including title, author, cover image, publication year, edition count, and available languages.

The actor accepts one or more book titles and returns matching books from Open Library in a clean JSON format. Multiple searches are processed concurrently for faster execution.

### Use cases

#### Book catalog enrichment

Add book metadata such as authors, cover images, and publication years to existing databases.

#### Reading applications

Power reading lists, recommendation systems, and personal library applications with structured book information.

#### Research and analytics

Collect book publication data and language availability for analysis and reporting.

#### Educational projects

Build book search features for schools, libraries, and learning platforms.

#### Content aggregation

Gather book information from multiple searches in a single actor run.

***

### What data does this actor extract?

Each book record includes:

```json
{
    "title": "Harry Potter and the Philosopher's Stone",
    "author": "J. K. Rowling",
    "image": "https://covers.openlibrary.org/b/id/15155833-M.jpg",
    "first_publish_year": 1997,
    "edition_count": 398,
    "language": [
        "eng",
        "spa",
        "fre",
        "ger"
    ]
}
```

| Field              | Type    | Description                           |
| ------------------ | ------- | ------------------------------------- |
| title              | string  | Book title                            |
| author             | string  | Author name(s)                        |
| image              | string  | Cover image URL                       |
| first\_publish\_year | integer | First known publication year          |
| edition\_count      | integer | Number of known editions              |
| language           | array   | Language codes available for the book |

***

### Input

| Parameter | Type    | Default  | Description                              |
| --------- | ------- | -------- | ---------------------------------------- |
| books     | array   | Required | List of book names to search             |
| limit     | integer | 5        | Maximum results returned per book search |

#### Example input

```json
{
    "books": [
        "harry potter",
        "atomic habits",
        "rich dad poor dad"
    ],
    "limit": 5
}
```

#### Search a single book

```json
{
    "books": [
        "don quixote"
    ]
}
```

#### Search multiple books with more results

```json
{
    "books": [
        "harry potter",
        "lord of the rings",
        "the hobbit"
    ],
    "limit": 10
}
```

***

### Output

Results are stored in the default dataset.

#### Example output

```json
[
    {
        "title": "Don Quijote de la Mancha",
        "author": "Miguel de Cervantes Saavedra",
        "image": "https://covers.openlibrary.org/b/id/14428305-M.jpg",
        "first_publish_year": 1600,
        "edition_count": 1594,
        "language": [
            "eng",
            "spa",
            "fre"
        ]
    },
    {
        "title": "Don Quixote",
        "author": "Kathy Acker",
        "image": "https://covers.openlibrary.org/b/id/568626-M.jpg",
        "first_publish_year": 1986,
        "edition_count": 8,
        "language": [
            "eng",
            "fre"
        ]
    }
]
```

***

### How it works

1. Reads book names from the actor input.
2. Processes multiple searches concurrently.
3. Searches Open Library for matching books.
4. Collects metadata for each result.
5. Removes duplicate records.
6. Stores all collected books in the Apify dataset.

***

### Integrations

Book Finder works with Apify integrations such as:

- Google Sheets
- Slack
- Zapier
- Make
- Webhooks
- APIs and custom workflows

Use webhooks to automatically process newly collected book data when a run finishes.

***

### FAQ

#### Can I search multiple books in one run?

Yes. Provide multiple book titles in the `books` array and the actor will process them concurrently.

#### How many results can I get per book?

Use the `limit` parameter to control the maximum number of returned results for each search.

#### Does the actor return cover images?

Yes. When a cover image is available, the actor returns a direct image URL.

#### Are duplicate books removed?

Yes. Duplicate records with the same title and author combination are filtered out.

#### What happens if a book cannot be found?

The actor simply returns no records for that search query.

#### Can I use the data in my own applications?

Yes. The dataset output can be connected directly to APIs, databases, spreadsheets, dashboards, or automation workflows.

***

### Notes

- Multiple searches are processed concurrently for improved performance.
- Results depend on the availability of data in Open Library.
- Some books may not contain cover images or complete metadata.
- Language values are returned as standard language codes.

# Actor input Schema

## `books` (type: `array`):

One or more book names

## `limit` (type: `integer`):

Maximum number of books to return for each search keyword.

## Actor input object example

```json
{
  "books": [
    "harry potter"
  ],
  "limit": 5
}
```

# 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 = {
    "books": [
        "harry potter"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zerobreak/book-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 = { "books": ["harry potter"] }

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

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

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

```

## CLI example

```bash
echo '{
  "books": [
    "harry potter"
  ]
}' |
apify call zerobreak/book-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zerobreak/book-finder"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/suqk6Da1XECV9dMbp/builds/nWSzlhcceYOUYDeC4/openapi.json
