# Goodreads Quotes Scraper – Books & Authors (`groundworklabs/goodreads-books-and-authors-quotes-extractor`) Actor

Looking for viral-worthy quotes? Extract up to 2,000 from any Goodreads book or author — sorted by most likes so the best ones surface first. Paste a  URL, set your limit, and export with author, title, tags, and like count as CSV or JSON.

- **URL**: https://apify.com/groundworklabs/goodreads-books-and-authors-quotes-extractor.md
- **Developed by:** [Groundwork Labs](https://apify.com/groundworklabs) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 scraped results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

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

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

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

# README

## Goodreads Book Quotes Extractor

Turn any Goodreads book or author into **2,000 ready-to-post quotes in minutes** — sorted by most-liked, with author, title, and tags included. No coding. No copying by hand.

Works with **both URL types**: paste a single book's quotes page, or an author's full quotes page to pull everything they've ever said across every book.

Built for **content creators, social media managers, and writers** who turn books into high-performing posts on Instagram, X, TikTok, and newsletters.

***

#### 🌟 What makes this different

- **Book and author pages supported** — scrape one book or an entire author's catalogue of quotes.
- **Sorted by likes out of the box** — the most viral, community-validated quotes land at the top. No manual sorting.
- **Bulk runs** — paste multiple URLs and process an entire reading list in one run.
- **Up to 2,000 quotes per URL** — set the limit yourself, from a quick 50 to the full 2,000.
- **Export anywhere** — download as CSV, JSON, Excel, or JSONL to plug straight into your scheduler.

***

#### 📊 Data fields

| Field | Description |
|---|---|
| `quote` | Complete, unabridged quote text |
| `author` | Credited writer |
| `book_title` | Full book title. Blank when a quote is standalone (not attributed to a specific book) |
| `likes` | Community likes — output sorted highest first |
| `tags` | User-generated categories (e.g. life, wisdom, love) |
| `source_url` | The Goodreads page scraped |

***

#### ⚠️ Use the quotes subpage URL — not the book or author profile

This is the most common mistake. You need the **quotes subpage**, not the main profile page.

##### For a book:

- ✅ **Correct** — `https://www.goodreads.com/work/quotes/1783981`
- ❌ **Wrong** — `https://www.goodreads.com/book/show/296354.Foundation`

**How to find it:** Open the book on Goodreads → scroll down → click **"Quotes"** → copy that URL.

##### For an author:

- ✅ **Correct** — `https://www.goodreads.com/author/quotes/16667.Isaac_Asimov`
- ❌ **Wrong** — `https://www.goodreads.com/author/show/16667.Isaac_Asimov`

**How to find it:** Open the author on Goodreads → scroll down → click **"Quotes"** → copy that URL.

***

#### 🚀 How to run

1. **Copy the quotes URL** — book or author, either works (see above).
2. **Paste into the input field** — add one URL per line. Mix books and authors freely.
3. **Set your limit** — default is 500, max is 2,000.
4. **Hit Start** — quotes stream into the Dataset tab in real time.
5. **Export** — download as CSV, JSON, or Excel when done.

***

#### 🔗 Try it now — paste either of these

**Single book:**

```
https://www.goodreads.com/work/quotes/538761
```

*(The Wisdom of Insecurity — Alan Watts, 370+ quotes)*

**Full author catalogue:**

```
https://www.goodreads.com/author/quotes/16667.Isaac_Asimov
```

*(Isaac Asimov — 1,000+ quotes across all books)*

***

#### 💡 Use cases

- Build a week of Instagram quote posts from a single book in one run
- Pull an author's top 50 most-liked quotes to find their signature lines
- Anchor newsletter intros with the most resonant lines from any book
- Populate a quote database for an AI content tool or writing assistant
- Research which themes resonate with a book's audience via tags + likes

# Actor input Schema

## `urls` (type: `array`):

One or more Goodreads quotes page URLs. Supports book quote pages (https://www.goodreads.com/work/quotes/1885647) and author quote pages (https://www.goodreads.com/author/quotes/16667.Isaac\_Asimov). Use the quotes subpage, not the main book or author profile.

## `maxQuotesPerBook` (type: `integer`):

Maximum number of quotes to collect per book. The scraper stops early if Goodreads has fewer quotes than this limit.

## Actor input object example

```json
{
  "urls": [
    "https://www.goodreads.com/work/quotes/1885647",
    "https://www.goodreads.com/author/quotes/16667.Isaac_Asimov"
  ],
  "maxQuotesPerBook": 500
}
```

# Actor output Schema

## `dataset` (type: `string`):

All scraped quotes — each row contains quote text, author, book title, likes, and tags

# 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 = {
    "urls": [
        "https://www.goodreads.com/work/quotes/1885647",
        "https://www.goodreads.com/author/quotes/16667.Isaac_Asimov"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("groundworklabs/goodreads-books-and-authors-quotes-extractor").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 = { "urls": [
        "https://www.goodreads.com/work/quotes/1885647",
        "https://www.goodreads.com/author/quotes/16667.Isaac_Asimov",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("groundworklabs/goodreads-books-and-authors-quotes-extractor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.goodreads.com/work/quotes/1885647",
    "https://www.goodreads.com/author/quotes/16667.Isaac_Asimov"
  ]
}' |
apify call groundworklabs/goodreads-books-and-authors-quotes-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,groundworklabs/goodreads-books-and-authors-quotes-extractor"
        }
    }
}

```

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

## OpenAPI specification

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