# ThriftBooks Scraper (`crawlerbros/thriftbooks-scraper`) Actor

Scrape ThriftBooks.com with the largest used books marketplace. Search by keyword, browse by category, or fetch details for specific book URLs. Returns price, condition, rating, ISBN, author, format, publisher, and more.

- **URL**: https://apify.com/crawlerbros/thriftbooks-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## ThriftBooks Scraper

Scrape used book listings from [ThriftBooks.com](https://www.thriftbooks.com) — the largest online used books marketplace with millions of titles starting from $3. Extract title, author, format, condition, price, original price, ISBN, rating, description, publisher, and more.

### What can this actor do?

- **Search books** by keyword, title, or author name
- **Browse by category** — Fiction, Mystery, Sci-Fi, Romance, Children's, and 20+ more
- **Get full book details** for any specific ThriftBooks URL

### Use cases

- Price monitoring for used books
- Used book inventory research
- Academic book sourcing and comparison
- Building book recommendation datasets
- Author bibliography research

### Input

| Field | Type | Description |
|-------|------|-------------|
| `mode` | Select | `searchBooks`, `browseCategory`, or `getBookDetails` |
| `query` | String | Keyword/title/author to search (for `searchBooks`) |
| `category` | Select | Category to browse (for `browseCategory`) |
| `bookUrl` | String | Full ThriftBooks URL (for `getBookDetails`) |
| `maxItems` | Integer | Maximum books to return (1–500, default 50) |

### Output

Each record contains:

| Field | Type | Description |
|-------|------|-------------|
| `title` | String | Book title |
| `author` | String | Author name |
| `format` | String | Paperback, Hardcover, Mass Market, Audio CD, etc. |
| `condition` | String | New, Like New, Very Good, Good, Acceptable |
| `price` | Number | Current ThriftBooks price (USD) |
| `originalPrice` | Number | Original list price (USD) |
| `rating` | Number | Average star rating (0–5) |
| `ratingCount` | Integer | Number of customer ratings |
| `isbn` | String | ISBN-10 or ISBN-13 |
| `description` | String | Book description/summary |
| `category` | String | Book category |
| `publishYear` | Integer | Year of publication |
| `publisher` | String | Publisher name |
| `pageCount` | Integer | Number of pages |
| `imageUrl` | String | Cover image URL |
| `url` | String | ThriftBooks book page URL |
| `scrapedAt` | String | ISO 8601 timestamp of when the record was scraped |

### Sample output

```json
{
  "title": "Harry Potter and the Sorcerer's Stone",
  "author": "J.K. Rowling",
  "format": "Paperback",
  "condition": "Good",
  "price": 3.79,
  "originalPrice": 12.99,
  "rating": 4.82,
  "ratingCount": 9999,
  "isbn": "9780439708180",
  "description": "Harry Potter has never even heard of Hogwarts...",
  "category": "Fantasy",
  "publishYear": 1999,
  "publisher": "Scholastic",
  "pageCount": 309,
  "imageUrl": "https://i.thriftbooks.com/api/imagehandler/l/ABC.jpeg",
  "url": "https://www.thriftbooks.com/w/harry-potter-and-the-sorcerers-stone_j-k-rowling/245835/",
  "scrapedAt": "2025-05-23T12:00:00+00:00"
}
````

### Available categories

Fiction, Mystery & Thriller, Science Fiction & Fantasy, Romance, Children's Books, Teen & Young Adult, Self-Help, Biographies & Memoirs, History, Business & Investing, Cooking, Health & Wellness, Travel, Arts & Photography, Religion, Politics, Humor, Comics, Sports, Technology, Science, Education, Law, Large Print, Collectibles, ThriftBooks Deals.

### Data source

All data is scraped from publicly accessible pages on [ThriftBooks.com](https://www.thriftbooks.com). No authentication or login is required.

### FAQ

**Does this actor require login?**
No. ThriftBooks product pages are publicly accessible without any account.

**How many books can I scrape?**
Up to 500 books per run. Use the `maxItems` parameter to control the limit.

**Does this actor support pagination?**
Yes. Category browse pages contain 100–200 book links per page. The actor fetches individual book detail pages for complete metadata.

**What formats are available?**
Paperback, Hardcover, Mass Market Paperback, Audio CD, Audio Cassette, Spiral-bound, Board book, and more — depending on what ThriftBooks lists for each title.

**What conditions are available?**
New, Like New, Very Good, Good, and Acceptable — with pricing varying by condition.

# Actor input Schema

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

How to scrape: search by keyword, browse a category, or fetch a specific book URL.

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

Keyword, title, or author to search for (mode=searchBooks).

## `category` (type: `string`):

Book category to browse (mode=browseCategory).

## `bookUrl` (type: `string`):

Full ThriftBooks book URL to fetch details for (mode=getBookDetails). Example: https://www.thriftbooks.com/w/harry-potter\_j-k-rowling/245835/

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

Maximum number of books to return.

## Actor input object example

```json
{
  "mode": "searchBooks",
  "query": "harry potter",
  "category": "literature-and-fiction",
  "maxItems": 50
}
```

# Actor output Schema

## `books` (type: `string`):

Dataset containing all scraped book records.

# 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 = {
    "mode": "searchBooks",
    "query": "harry potter",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/thriftbooks-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 = {
    "mode": "searchBooks",
    "query": "harry potter",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/thriftbooks-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 '{
  "mode": "searchBooks",
  "query": "harry potter",
  "maxItems": 50
}' |
apify call crawlerbros/thriftbooks-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ThriftBooks Scraper",
        "description": "Scrape ThriftBooks.com with the largest used books marketplace. Search by keyword, browse by category, or fetch details for specific book URLs. Returns price, condition, rating, ISBN, author, format, publisher, and more.",
        "version": "1.0",
        "x-build-id": "5agfQUDhg1budU5Y9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~thriftbooks-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-thriftbooks-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/crawlerbros~thriftbooks-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-thriftbooks-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/crawlerbros~thriftbooks-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-thriftbooks-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "searchBooks",
                            "browseCategory",
                            "getBookDetails"
                        ],
                        "type": "string",
                        "description": "How to scrape: search by keyword, browse a category, or fetch a specific book URL.",
                        "default": "searchBooks"
                    },
                    "query": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Keyword, title, or author to search for (mode=searchBooks).",
                        "default": "harry potter"
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "literature-and-fiction",
                            "mystery-thriller-and-suspense",
                            "science-fiction-and-fantasy",
                            "romance",
                            "childrens-books",
                            "teen-and-young-adult",
                            "self-help",
                            "biographies-and-memoirs",
                            "history",
                            "business-and-investing",
                            "cooking-food-and-wine",
                            "health-mind-and-body",
                            "travel",
                            "arts-and-photography",
                            "religion-and-spirituality",
                            "politics-and-social-sciences",
                            "humor-and-entertainment",
                            "comics-and-graphic-novels",
                            "sports-and-outdoors",
                            "computers-and-technology",
                            "science-and-math",
                            "engineering-and-transportation",
                            "education-and-reference",
                            "law",
                            "large-print",
                            "collectibles",
                            "thriftbooks-deals"
                        ],
                        "type": "string",
                        "description": "Book category to browse (mode=browseCategory).",
                        "default": "literature-and-fiction"
                    },
                    "bookUrl": {
                        "title": "Book URL",
                        "type": "string",
                        "description": "Full ThriftBooks book URL to fetch details for (mode=getBookDetails). Example: https://www.thriftbooks.com/w/harry-potter_j-k-rowling/245835/"
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of books to return.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
