# 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, 2 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/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

### 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("💾 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 '{
  "books": [
    "harry potter"
  ]
}' |
apify call zerobreak/book-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Book Finder",
        "description": "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.",
        "version": "0.0",
        "x-build-id": "N7Vb9sgAxSYaSfDCv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/zerobreak~book-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-zerobreak-book-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/zerobreak~book-finder/runs": {
            "post": {
                "operationId": "runs-sync-zerobreak-book-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/zerobreak~book-finder/run-sync": {
            "post": {
                "operationId": "run-sync-zerobreak-book-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",
                "required": [
                    "books"
                ],
                "properties": {
                    "books": {
                        "title": "Book Names",
                        "type": "array",
                        "description": "One or more book names",
                        "items": {
                            "type": "string"
                        }
                    },
                    "limit": {
                        "title": "Results Per Book",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of books to return for each search keyword.",
                        "default": 5
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
