# Google Books Scraper — Search, Catalog & ISBN Lookup (`logiover/google-books-scraper`) Actor

Scrape Google Books by keyword, author, subject, or ISBN. Extract title, authors, publisher, description, ratings, categories, pricing, and 18+ fields. No API key, no login required.

- **URL**: https://apify.com/logiover/google-books-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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

## Google Books Scraper — Search, Catalog & ISBN Lookup

Extract structured book data from Google Books at scale. Search by keyword, author, subject, or ISBN — no API key, no login required.

### What does Google Books Scraper do?

Google Books Scraper connects to the official Google Books Volumes API (`https://www.googleapis.com/books/v1/volumes`) to retrieve rich metadata for any book or collection of books. The actor performs keyword-driven full-text search using Google's powerful query operators (`intitle:`, `inauthor:`, `subject:`, `isbn:`) and paginates results 40 at a time using the `startIndex` parameter. It can retrieve up to 1,000 results per search query — the Google Books API pagination ceiling — and supports fetching individual volumes by their unique Google Books ID for targeted lookups. The actor is fully keyless: no API credential, no OAuth token, and no login session is required from the user. Each scraped volume yields 18 clean, structured fields per item covering bibliographic metadata, ratings, ISBNs, category taxonomy, pricing, and thumbnail URLs.

### Who is it for?

- **Publishers and editors** who need to monitor competitor catalogs, track publication trends, and analyze ratings across book categories.
- **Academic researchers and librarians** who want to bulk-collect metadata for literature reviews, citation analysis, or collection auditing.
- **E-commerce operators** building book stores or price comparison tools who need up-to-date title, ISBN, pricing, and publisher data.
- **Data scientists and ML engineers** who need large labeled datasets of books by genre, subject, or language for recommendation systems or NLP tasks.
- **Content marketers and SEO specialists** who write about books and want structured data to generate topic clusters, affiliate pages, or review content at scale.

### Use cases

- **Build a searchable book database** for a niche topic (e.g., "subject:machine learning") and export to Google Sheets for editorial planning.
- **ISBN batch lookup**: feed a list of volume IDs to get full metadata for existing catalog entries — ideal for inventory reconciliation.
- **Track ratings and reviews** for books in a category over time to identify trending or declining titles.
- **Enrich affiliate content**: pull description, thumbnail, publisher, and list price for hundreds of books in a subject area to power automated review pages.
- **Academic bibliography building**: search `inauthor:Sutton subject:reinforcement learning` to retrieve a curated metadata corpus for citation management tools.

### Why use Google Books Scraper?

- **No API key required**: The Google Books search API is public and keyless — just send a query and receive JSON. No credentials setup needed.
- **18 structured fields per book**: title, subtitle, authors, publisher, publishedDate, description, pageCount, categories, averageRating, ratingsCount, language, isbn10, isbn13, previewLink, thumbnail, saleability, listPrice — everything you need.
- **Bulk pagination**: the actor paginates across 40-item pages automatically until your `maxResults` limit or the API ceiling (1,000 results) is reached.
- **Advanced query operators**: use `intitle:`, `inauthor:`, `subject:`, `isbn:` to precision-target specific books without post-filtering.
- **Two modes in one actor**: `search` mode for broad discovery; `volumeDetail` mode for exact ID-based lookups — one actor covers all use cases.
- **Export CSV / JSON / Excel / Dataset**: results land in Apify's dataset storage and can be exported in any format, piped via webhooks, or integrated with Make/Zapier.

### What data can you extract?

The actor extracts the following fields for every book volume:

| Field | Type | Description |
|---|---|---|
| `id` | string | Google Books unique volume ID |
| `title` | string | Book title |
| `subtitle` | string | Book subtitle (if available) |
| `authors` | string | Comma-separated list of authors |
| `publisher` | string | Publisher name |
| `publishedDate` | string | Publication date (YYYY, YYYY-MM, or YYYY-MM-DD) |
| `description` | string | Full editorial description / synopsis |
| `pageCount` | string | Total number of pages |
| `categories` | string | Comma-separated BISAC categories |
| `averageRating` | string | Average reader rating (0–5) |
| `ratingsCount` | string | Total number of ratings |
| `language` | string | ISO 639-1 language code (e.g., "en", "fr") |
| `isbn10` | string | ISBN-10 identifier |
| `isbn13` | string | ISBN-13 identifier |
| `previewLink` | string | Google Books preview page URL |
| `thumbnail` | string | Book cover thumbnail image URL |
| `saleability` | string | Saleability status (FOR_SALE, NOT_FOR_SALE, FREE, etc.) |
| `listPrice` | string | List price formatted as "9.99 USD" |

#### Sample output record

```json
{
  "id": "zyTCAlFPjgYC",
  "title": "The Pragmatic Programmer",
  "subtitle": "From Journeyman to Master",
  "authors": "Andrew Hunt, David Thomas",
  "publisher": "Addison-Wesley Professional",
  "publishedDate": "1999-10-20",
  "description": "Straight from the programming trenches, The Pragmatic Programmer cuts through the increasing specialization and technicalities of modern software development to examine the core process...",
  "pageCount": "352",
  "categories": "Computers",
  "averageRating": "4.5",
  "ratingsCount": "2183",
  "language": "en",
  "isbn10": "0201616224",
  "isbn13": "9780201616224",
  "previewLink": "http://books.google.com/books?id=zyTCAlFPjgYC&printsec=frontcover",
  "thumbnail": "http://books.google.com/books/content?id=zyTCAlFPjgYC&printsec=frontcover&img=1&zoom=1",
  "saleability": "FOR_SALE",
  "listPrice": "49.99 USD"
}
````

### How to use

#### Option A — Search mode (by keyword / subject / author / ISBN)

1. Open the actor and set **Mode** to `search`.
2. Enter a **Query** using free text or operators:
   - `artificial intelligence` — broad full-text search
   - `intitle:deep learning inauthor:Goodfellow` — title + author filter
   - `subject:history isbn:9780062316097` — subject + ISBN
3. Set **Max Results** (default 200, up to 1,000).
4. Click **Run** and export results from the **Dataset** tab.

Input JSON example (search mode):

```json
{
  "mode": "search",
  "query": "artificial intelligence intitle:machine learning",
  "maxResults": 500,
  "proxy": { "useApifyProxy": true }
}
```

#### Option B — Volume detail mode (by Google Books ID)

1. Set **Mode** to `volumeDetail`.
2. In the **Volume IDs** field, provide an array of Google Books volume IDs (visible in book URLs: `books.google.com/books?id=<ID>`).
3. Run the actor — it fetches each volume individually.

Input JSON example (volumeDetail mode):

```json
{
  "mode": "volumeDetail",
  "ids": ["zyTCAlFPjgYC", "buc0AAAAMAAJ", "ITnFAAAAMAAJ"],
  "proxy": { "useApifyProxy": true }
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | Operation mode: `search` or `volumeDetail` |
| `query` | string | — | Search query; supports `intitle:`, `inauthor:`, `subject:`, `isbn:` operators. Required for search mode. |
| `ids` | array | — | List of Google Books volume IDs. Required for volumeDetail mode. |
| `maxResults` | integer | 200 | Max books to retrieve in search mode (1–5000 input; API caps at 1,000). |
| `proxy` | object | Apify proxy | Proxy configuration. Datacenter proxies work well. |

Full input JSON:

```json
{
  "mode": "search",
  "query": "subject:science fiction inauthor:Asimov",
  "maxResults": 300,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

### Output example

```json
{
  "id": "kqsaBQAAQBAJ",
  "title": "Artificial Intelligence",
  "subtitle": "A Modern Approach",
  "authors": "Stuart Russell, Peter Norvig",
  "publisher": "Prentice Hall",
  "publishedDate": "2010",
  "description": "Artificial Intelligence: A Modern Approach, 3e offers the most comprehensive, up-to-date introduction to the theory and practice of artificial intelligence...",
  "pageCount": "1152",
  "categories": "Computers",
  "averageRating": "4",
  "ratingsCount": "459",
  "language": "en",
  "isbn10": "0136042597",
  "isbn13": "9780136042594",
  "previewLink": "http://books.google.com/books?id=kqsaBQAAQBAJ&printsec=frontcover",
  "thumbnail": "http://books.google.com/books/content?id=kqsaBQAAQBAJ&printsec=frontcover&img=1&zoom=1",
  "saleability": "FOR_SALE",
  "listPrice": "219.99 USD"
}
```

### Tips for best results

- **Use operators to narrow scope**: `intitle:python inauthor:Lutz` returns far more relevant results than a broad `python` query flooded by unrelated volumes.
- **Layer multiple operators**: Google Books supports combining `intitle:`, `inauthor:`, `subject:`, and `isbn:` in a single query for precision targeting.
- **Max 1,000 per search**: The Google Books API paginates via `startIndex` but caps at 1,000 total items per query. Run multiple searches with different keywords to cover a broader catalog.
- **Use subject: for genre/category targeting**: `subject:machine learning`, `subject:romance`, `subject:history` returns category-tagged volumes accurately.
- **ISBN search for exact lookup**: use `isbn:9780201616224` to retrieve a specific edition with guaranteed accuracy.
- **volumeDetail mode for high-accuracy enrichment**: if you already have volume IDs from a prior run, use `volumeDetail` mode for fresh, per-item metadata fetches.
- **Null fields are normal**: not every book has ratings, a price, or a thumbnail — the actor returns `null` for missing fields instead of erroring.
- **Language filtering**: add `+langRestrict=en` (future extension) or filter `language` field post-export for language-specific datasets.
- **Schedule for catalog monitoring**: run on a weekly schedule for the same query to track new publications, rating changes, and pricing updates.
- **Combine with Google Sheets integration**: pipe output directly to a Sheets webhook for live book database updates.

### Integrations

Google Books Scraper stores results in Apify's **Dataset storage**, which connects to the full Apify integration ecosystem:

- **Google Sheets**: use the Google Sheets integration to push book data live into a spreadsheet for editorial tracking.
- **Slack**: trigger a webhook notification when a scraping run completes with a summary of books found.
- **Zapier / Make**: connect dataset output to thousands of apps — CRMs, Notion databases, Airtable, email campaigns.
- **Webhooks**: configure an Apify webhook to POST run results to your own endpoint on completion.
- **Scheduler**: automate recurring searches (daily, weekly, monthly) to monitor catalog updates or price changes.
- **Apify API**: access results programmatically via the Apify REST API — perfect for CI pipelines or server-side enrichment workflows.

### API usage

**cURL:**

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/logiover~google-books-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "search",
    "query": "subject:economics",
    "maxResults": 500
  }'
```

**Node.js (Apify client):**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('logiover/google-books-scraper').call({
  mode: 'search',
  query: 'intitle:machine learning inauthor:Goodfellow',
  maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/google-books-scraper").call(run_input={
    "mode": "search",
    "query": "subject:history intitle:world war",
    "maxResults": 300,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with AI agents (MCP)

Google Books Scraper is available as an MCP tool via the Apify platform. Connect your AI agent to the Apify MCP server and invoke the actor directly from Claude, GPT-4, or any MCP-compatible LLM agent to retrieve book metadata on demand:

> "Find 100 books about behavioral economics by Nobel Prize winners and export a CSV with title, author, publisher, and average rating."

The actor returns structured JSON that AI agents can directly process, filter, and summarize without additional parsing.

### FAQ

#### Does this actor require an API key?

No. The Google Books Volumes API supports unauthenticated search requests. The actor makes direct HTTPS calls to `googleapis.com/books/v1/volumes` without any API key, OAuth token, or login session.

#### How many books can I get per run?

In search mode, the Google Books API allows up to 1,000 results per query (25 pages × 40 items). Set `maxResults` up to 1,000. For larger datasets, run multiple queries with different search terms and merge the results.

#### What query operators are supported?

Google Books supports: `intitle:` (search in title), `inauthor:` (search by author), `isbn:` (exact ISBN lookup), `subject:` (BISAC category), and `inpublisher:` (filter by publisher). Combine freely in a single query.

#### Why are some fields null?

Not all volumes in the Google Books database have complete metadata. Ratings, page counts, thumbnails, and pricing are often absent for older books, academic papers, or digitized public domain titles. The actor always returns all 18 fields, using `null` for any missing value.

#### Can I search by ISBN?

Yes. Use the query operator `isbn:9780201616224` (either ISBN-10 or ISBN-13) to retrieve a specific edition. Combine with other operators: `isbn:9780201616224 inauthor:Hunt` for extra precision.

#### How do I export to Excel or CSV?

After the run completes, go to the **Dataset** tab in Apify Console and click **Export** — available formats include CSV, JSON, XLSX, XML, and JSONL. You can also download via the Apify API.

#### How fast does it scrape?

The actor fetches 40 books per request with a 200 ms inter-request delay (to be respectful of the API). A run of 1,000 books takes approximately 5–8 minutes depending on proxy speed.

#### Is the data real-time?

Yes. Each run fetches live data directly from the Google Books API. Ratings, prices, and publication metadata reflect the current state in Google Books at run time.

#### Can I monitor a catalog over time?

Yes. Use Apify's **Scheduler** to run the same query weekly or monthly. Compare dataset outputs across runs to track new publications, rating changes, or price updates. Combine with webhooks to alert on changes.

#### Does it work for books in non-English languages?

Yes. Google Books indexes books in dozens of languages. Search queries in other languages (French, German, Spanish, Japanese, etc.) return results in those languages. The `language` output field shows the ISO 639-1 code.

#### What if my query returns zero results?

Zero results mean either the query is too restrictive or the term doesn't match any indexed volume. Try broadening your query — remove operators, simplify to a single keyword, and confirm the term returns results at `books.google.com/search`. The actor logs a warning but exits cleanly with no dataset items.

#### Is this related to Google Books affiliate or publisher programs?

No. This actor only reads publicly accessible search metadata from the Google Books API. It does not interact with Google Play Books purchase flows, Google Books Partner Center, or any commercial Google publishing APIs.

### Is it legal?

Google Books Scraper accesses only the public, unauthenticated Google Books Volumes API — the same data available to any browser visitor at `books.google.com`. No login credentials, private data, or user-specific information is accessed. The actor respects the API's rate limits via request pacing and does not circumvent any access controls.

Book metadata (titles, authors, descriptions, ISBNs) is factual bibliographic information. Usage for research, catalog building, competitive analysis, and content creation is broadly accepted under fair use. Consult Google's [Terms of Service](https://developers.google.com/books/terms) and your local data regulations for commercial applications.

### Related scrapers

- **[Apify Amazon Books Scraper](https://apify.com/logiover)** — Extract Amazon book listings, prices, reviews, and BSR rankings.
- **[Apify Goodreads Scraper](https://apify.com/logiover)** — Scrape Goodreads book metadata, user reviews, shelves, and reading lists.
- **[Apify IMDB Scraper](https://apify.com/logiover/imdb-scraper)** — Extract IMDB data for movies, shows, actors — from the same logiover catalog.
- **[Apify B2B Lead Scraper](https://apify.com/logiover/b2b-lead-scraper)** — Find company and contact data by industry and country from OpenStreetMap.

# Actor input Schema

## `mode` (type: `string`):

Operation mode: 'search' to query by keyword/author/subject/ISBN, 'volumeDetail' to fetch specific volumes by their Google Books ID.

## `query` (type: `string`):

Search query for 'search' mode. Supports operators: intitle:, inauthor:, subject:, isbn:. Example: 'artificial intelligence intitle:deep learning'. Leave empty to browse popular books (subject:fiction).

## `printType` (type: `string`):

Restrict results by publication type (search mode).

## `orderBy` (type: `string`):

Order search results by relevance or by newest first.

## `language` (type: `string`):

Restrict results to a language. Leave empty for all languages.

## `ids` (type: `array`):

List of Google Books volume IDs for 'volumeDetail' mode. Example: \["zyTCAlFPjgYC", "buc0AAAAMAAJ"]. Used only when mode=volumeDetail.

## `maxResults` (type: `integer`):

Maximum number of books to retrieve (search mode). Supports up to several thousand via pagination. Default: 200.

## `proxy` (type: `object`):

Apify proxy settings. Automatic (any group) is recommended — rotating IPs help avoid the Google Books per-IP daily quota.

## Actor input object example

```json
{
  "mode": "search",
  "query": "artificial intelligence",
  "printType": "all",
  "orderBy": "relevance",
  "language": "",
  "maxResults": 200,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/google-books-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("logiover/google-books-scraper").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 '{}' |
apify call logiover/google-books-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Books Scraper — Search, Catalog & ISBN Lookup",
        "description": "Scrape Google Books by keyword, author, subject, or ISBN. Extract title, authors, publisher, description, ratings, categories, pricing, and 18+ fields. No API key, no login required.",
        "version": "1.0",
        "x-build-id": "kq83qhDT2vE20NAQ9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~google-books-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-google-books-scraper",
                "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/logiover~google-books-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-google-books-scraper",
                "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/logiover~google-books-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-google-books-scraper",
                "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": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "volumeDetail"
                        ],
                        "type": "string",
                        "description": "Operation mode: 'search' to query by keyword/author/subject/ISBN, 'volumeDetail' to fetch specific volumes by their Google Books ID.",
                        "default": "search"
                    },
                    "query": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Search query for 'search' mode. Supports operators: intitle:, inauthor:, subject:, isbn:. Example: 'artificial intelligence intitle:deep learning'. Leave empty to browse popular books (subject:fiction)."
                    },
                    "printType": {
                        "title": "Print Type",
                        "enum": [
                            "all",
                            "books",
                            "magazines"
                        ],
                        "type": "string",
                        "description": "Restrict results by publication type (search mode).",
                        "default": "all"
                    },
                    "orderBy": {
                        "title": "Sort Order",
                        "enum": [
                            "relevance",
                            "newest"
                        ],
                        "type": "string",
                        "description": "Order search results by relevance or by newest first.",
                        "default": "relevance"
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "",
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "pt",
                            "nl",
                            "ru",
                            "ja",
                            "zh",
                            "ar",
                            "tr",
                            "ko",
                            "hi"
                        ],
                        "type": "string",
                        "description": "Restrict results to a language. Leave empty for all languages.",
                        "default": ""
                    },
                    "ids": {
                        "title": "Volume IDs",
                        "type": "array",
                        "description": "List of Google Books volume IDs for 'volumeDetail' mode. Example: [\"zyTCAlFPjgYC\", \"buc0AAAAMAAJ\"]. Used only when mode=volumeDetail.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of books to retrieve (search mode). Supports up to several thousand via pagination. Default: 200.",
                        "default": 200
                    },
                    "proxy": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Automatic (any group) is recommended — rotating IPs help avoid the Google Books per-IP daily quota.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
