# Goodreads Quotes (`shahidirfan/goodreads-quotes`) Actor

Goodreads Quotes Scraper: Effortlessly extract quotes, authors, and tags with this lightweight Goodreads Quotes Scraper. Designed for speed and reliability, it gathers wisdom from thousands of pages instantly. For the best performance, residential proxies are highly recommended.

- **URL**: https://apify.com/shahidirfan/goodreads-quotes.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Developer tools, Automation, Other
- **Features:** Limited permissions
- **Stats:** 24 total users, 4 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.80 / 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.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Goodreads Quotes Scraper do?

Goodreads Quotes Scraper collects quotes from Goodreads into clean, structured datasets for research, publishing, content planning, and app features. Provide a tag, an author name, or a direct Goodreads quotes URL, and the Actor returns quote records with the quote text, author details, book source, tags, and like counts. Output is deduplicated and cleaned automatically, so results are ready to analyze or load into other tools.

Goodreads hosts one of the largest public collections of reader-shared quotes, organized by tag and searchable by author or keyword. Copying those quotes into a spreadsheet by hand is slow and easy to get wrong, especially for large collections or recurring updates. This Actor replaces that manual work with a repeatable run that returns consistent records. It also helps when the official Goodreads API is unavailable, limited, or not practical for your workflow.

The Actor runs from Apify Console with simple form inputs, or programmatically through the Apify API. Results are stored in an Apify dataset and can be exported as JSON, CSV, Excel, XML, or sent to connected tools and automations.

### Why use Goodreads Quotes Scraper?

- **Structured quote datasets** - Collect quotes with text, author, book, tags, and like counts in one run instead of copying pages by hand.
- **Flexible collection modes** - Target quotes by tag, author name, or a direct Goodreads quotes URL.
- **Clean, deduplicated output** - Empty fields are removed and duplicate quotes are skipped automatically.
- **Controlled run sizes** - Set the maximum number of quotes and a page limit, from small test runs to larger collections.
- **Automation-ready output** - Export to JSON, CSV, Excel, or XML, and connect results to webhooks, Google Sheets, Make, or Zapier.
- **Recurring refresh** - Schedule runs on Apify to update quote collections daily or weekly.

Typical uses include content planning for blogs and newsletters, quote-of-the-day apps, writing assistants, author and theme research, editorial calendars, and quote datasets for analysis or AI features.

### What data can you extract from Goodreads?

| Field | Description |
|-------|-------------|
| `quote` | Full quote text |
| `author` | Author name |
| `author_url` | Goodreads author profile URL |
| `book` | Book title when available |
| `book_url` | Goodreads book page URL when available |
| `tags` | Tags attached to the quote |
| `tag_count` | Number of tags on the quote |
| `likes` | Number of likes on Goodreads |
| `quote_id` | Stable Goodreads quote identifier |
| `url` | Direct quote page URL |
| `source` | Collection mode used: `tag`, `search`, or `quotes` |
| `source_query` | Tag or query term used for the run |
| `page` | Page number where the quote was found |

### How to scrape Goodreads quotes

1. Open the Actor on Apify Store.
2. Enter a tag such as `inspirational`, an author name, or a direct Goodreads quotes URL.
3. Set the maximum number of quotes and, if needed, the page limit.
4. Run the Actor.
5. Download the dataset or connect it to your workflow.

You can also run the Actor with JSON input. The example below collects 50 inspirational quotes across up to 5 pages:

```json
{
  "tag": "inspirational",
  "results_wanted": 50,
  "max_pages": 5
}
```

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | - | Direct Goodreads quotes URL to collect from. Overrides tag and author when provided. |
| `tag` | String | No | `inspirational` | Tag page to collect quotes from, such as `love` or `wisdom`. |
| `author` | String | No | - | Author name used to find quotes by that author. |
| `results_wanted` | Integer | No | `100` | Maximum number of quotes to save. |
| `max_pages` | Integer | No | `20` | Safety limit on the number of pages to process. Each page typically holds about 30 quotes. |
| `proxyConfiguration` | Object | No | `{"useApifyProxy": false}` | Proxy settings for larger runs. Residential proxies are recommended for the best reliability. |

### Output Data

Each dataset item contains the following fields:

| Field | Type | Description |
|-------|------|-------------|
| `quote_id` | String | Stable Goodreads quote identifier when available |
| `quote` | String | Full quote text |
| `author` | String | Author name |
| `author_url` | String | Goodreads author profile URL |
| `book` | String | Book title when available |
| `book_url` | String | Goodreads book page URL when available |
| `tags` | Array | Tags associated with the quote |
| `tag_count` | Number | Number of tags on the quote |
| `likes` | Number | Number of likes on Goodreads |
| `url` | String | Direct quote page URL |
| `source` | String | Collection mode used: `tag`, `search`, or `quotes` |
| `source_query` | String | Tag or query term used for the run |
| `page` | Number | Page number where the quote was found |

### Usage Examples

#### Basic Tag Collection

Collect quotes from a single tag with a small result limit for testing:

```json
{
  "tag": "inspirational",
  "results_wanted": 50,
  "max_pages": 5
}
```

#### Author Search

Collect quotes by a specific author:

```json
{
  "author": "Maya Angelou",
  "results_wanted": 80,
  "max_pages": 8
}
```

#### Direct URL Collection

Collect quotes from a direct Goodreads quotes URL, with residential proxies for a larger run:

```json
{
  "startUrl": "https://www.goodreads.com/quotes/tag/love",
  "results_wanted": 200,
  "max_pages": 12,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Sample Output

```json
{
  "quote_id": "24499",
  "quote": "Be the change that you wish to see in the world.",
  "author": "Mahatma Gandhi",
  "author_url": "https://www.goodreads.com/author/show/5810891.Mahatma_Gandhi",
  "tags": ["action", "change", "inspirational", "philosophy"],
  "tag_count": 4,
  "likes": 114486,
  "url": "https://www.goodreads.com/quotes/24499-be-the-change-that-you-wish-to-see-in-the",
  "source": "tag",
  "source_query": "inspirational",
  "page": 1
}
```

### Tips for Best Results

#### Start Small First

Test with 20 to 50 results before scaling to larger runs. This keeps test runs fast and makes it easy to check the output format.

#### Use Specific Tags and Authors

Clear tags and author names usually return cleaner, more relevant datasets. For example, `wisdom` or `maya angelou` gives more focused results than a broad term.

#### Use Proxies for Scale

For larger runs, enable residential proxies in `proxyConfiguration` to keep collection stable and avoid throttling.

#### Review Before Scheduling

Check the dataset preview after the first run, then schedule repeat runs once the results look right.

### Integrations

Connect output with:

- **Google Sheets** - Send scraped quotes to spreadsheets for reporting and collaboration.
- **Airtable** - Build searchable quote databases.
- **Make** - Build no-code pipelines from run results.
- **Zapier** - Trigger automations after each run.
- **Webhooks** - Push results to custom systems.
- **API** - Access datasets programmatically from your own applications.

#### Export Formats

- **JSON** - Developer-ready data.
- **CSV** - Spreadsheet analysis.
- **Excel** - Business reporting.
- **XML** - Structured system integrations.

### Frequently Asked Questions

#### How many quotes can I collect?

The Actor scales from small test runs to large collections. Use `results_wanted` to set the target number of quotes and `max_pages` to control how many pages are processed.

#### Why are some optional fields missing?

Not every quote has complete metadata on Goodreads. The Actor removes empty values to keep records clean, so `book`, `book_url`, and `quote_id` may be absent for some quotes.

#### Can I collect quotes by author only?

Yes. Provide `author` and the Actor will collect quotes matching that author search.

#### Can I collect quotes from a direct URL?

Yes. Provide a `startUrl` pointing to any public Goodreads quotes page, such as a tag page. The URL takes priority over tag and author inputs.

#### Can I export Goodreads quotes to CSV or Excel?

Yes. Apify datasets can be downloaded in CSV, Excel, JSON, XML, and other supported formats.

#### Can I run this Actor on a schedule?

Yes. You can schedule the Actor in Apify Console to refresh quote collections hourly, daily, weekly, or at another interval.

#### Is this Actor suitable for non-technical users?

Yes. The Actor runs from Apify Console with form-based inputs, and results can be downloaded without writing code.

#### Is it legal to scrape Goodreads?

Scraping public web data can be legal, but you are responsible for complying with applicable laws, Goodreads terms of use, and privacy rules for your use case.

### Related Actors

- [Goodreads Books Scraper](https://apify.com/shahidirfan/goodreads-book-scraper) - Collect book details, editions, ratings, and metadata from Goodreads.
- [Goodreads Review Scraper](https://apify.com/shahidirfan/goodreads-review-scraper) - Extract book reviews and reader feedback from Goodreads.
- [BrainyQuote Scraper](https://apify.com/shahidirfan/brainyquote-scraper) - Collect quotes and author profiles from BrainyQuote.
- [AZ Quotes Scraper](https://apify.com/shahidirfan/az-quotes-scraper) - Gather quotes organized by author and topic from AZ Quotes.

### Support

For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate data collection from publicly available sources. Users are responsible for using the data responsibly and for complying with applicable laws, website terms, and any rights or permissions required for their downstream use.

# Actor input Schema

## `startUrl` (type: `string`):

Start scraping from a specific Goodreads quotes URL. If provided, this overrides tag/author/search parameters.

## `tag` (type: `string`):

Search quotes by tag (e.g., 'inspirational', 'love', 'wisdom', 'life'). Most popular option.

## `author` (type: `string`):

Search quotes by author name (e.g., 'Albert Einstein', 'Maya Angelou'). Leave empty to use tag instead.

## `results_wanted` (type: `integer`):

The maximum number of quotes to collect. Default is 100.

## `max_pages` (type: `integer`):

Safety limit on the number of pages to scrape. Each page typically contains 30 quotes.

## `proxyConfiguration` (type: `object`):

Proxy settings for scraping. Residential proxies recommended for best reliability.

## Actor input object example

```json
{
  "startUrl": "https://www.goodreads.com/quotes/tag/love",
  "tag": "inspirational",
  "results_wanted": 100,
  "max_pages": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "tag": "inspirational"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/goodreads-quotes").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 = { "tag": "inspirational" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/goodreads-quotes").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 '{
  "tag": "inspirational"
}' |
apify call shahidirfan/goodreads-quotes --silent --output-dataset

```

## MCP server setup

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

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/j1jujkIYtcxDU2Dk9/builds/W2amzwJ1GQiGfF5Ca/openapi.json
