# Goodreads Email Scraper (`email_scraper/goodreads-email-scraper`) Actor

Goodreads Email Scraper finds publicly indexed Goodreads contact emails using targeted keywords, locations, and custom email domains. Extract structured lead data with titles, descriptions, URLs, and emails for author research, publisher outreach, book marketing, and prospecting.

- **URL**: https://apify.com/email\_scraper/goodreads-email-scraper.md
- **Developed by:** [Email Scraper](https://apify.com/email_scraper) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

### 🔍 Goodreads Email Scraper – Overview

**Goodreads Email Scraper** is an Apify Actor designed to discover publicly indexed email addresses associated with Goodreads search results using targeted keywords and selected email domains.

Instead of manually searching through search-engine results, the Goodreads Email Scraper lets you enter professional, publishing, author, or other relevant keywords and automatically searches for matching Goodreads results where email addresses are publicly visible in search snippets.

The Actor returns structured contact information including the keyword used, search-result title, description, URL, and extracted email address. This makes the data useful for author research, publisher discovery, book-industry prospecting, literary outreach research, audience research, and other contact-discovery workflows.

> 💡 **What the Goodreads Email Scraper does**
>
> - Searches publicly indexed Goodreads results using your keywords
> - Looks for selected email-domain suffixes
> - Extracts matching email addresses from search-result descriptions
> - Filters snippets containing excluded words or phrases
> - Removes duplicate email addresses
> - Pushes structured records into an Apify Dataset

The easiest way to use the Goodreads Email Scraper is to enter several specific keywords, select the email domains you want to search, optionally add a location, and define the desired email target for each keyword + domain combination.

***

### 🔹 Goodreads Email Scraper – Key Features

The Goodreads Email Scraper is built for targeted email discovery based on search intent. You control the search through keywords, geographic terms, email domains, result limits, and exclusion filters.

> **✨ Key Features**
>
> - 🔎 Keyword-based Goodreads search
> - 📧 Publicly indexed email extraction
> - 🌎 Optional country, state, or city targeting
> - 📩 Multiple custom email-domain searches
> - 🚫 Exclude-word and phrase filtering
> - ♻️ Duplicate email prevention
> - 📊 Structured Apify Dataset records
> - 🔄 Incremental dataset updates
> - 🎯 Independent target for each keyword + domain combination
> - ⏯️ Progress persistence for interrupted runs

#### 🎯 Keyword-Based Contact Discovery

You can provide multiple keywords in one run. This allows you to research different types of Goodreads-related contacts without running a separate Actor execution for every search term.

The default keywords are:

- `Publisher`
- `Author`

You can replace these with more specific search terms based on your research goals.

Examples include:

- Book Publisher
- Author
- Fiction Author
- Nonfiction Author
- Independent Publisher
- Literary Publisher
- Book Writer
- Publishing Company

Using multiple related keywords can broaden your search coverage while keeping each search focused.

#### 📧 Custom Email Domains

The Goodreads Email Scraper allows you to specify which email-domain suffixes should be searched.

Common examples include:

- `@gmail.com`
- `@yahoo.com`
- `@outlook.com`
- `@hotmail.com`
- `@icloud.com`
- Custom company domains

Each selected domain is searched separately with each keyword.

***

### 🔹 Goodreads Email Scraper – What Data Can You Extract?

The Goodreads Email Scraper returns structured lead information connected to the search result where an email address was discovered.

The dataset includes:

| Field         | Description                                |
| ------------- | ------------------------------------------ |
| `network`     | Source network identifier, `Goodreads.com` |
| `keyword`     | Keyword used for the search                |
| `title`       | Search-result title                        |
| `description` | Search-result description or snippet       |
| `url`         | URL associated with the search result      |
| `email`       | Extracted email address                    |

The default Apify Dataset view displays five primary fields: `keyword`, `title`, `description`, `url`, and `email`.

The `network` field is also included in the underlying dataset record.

> **📦 Structured Output**
>
> Each email is returned together with contextual search information. This means you can review not only the contact email, but also the keyword, result title, description, and associated URL.

#### 📋 Sample Output

A typical record can look like this:

```json
{
  "network": "Goodreads.com",
  "keyword": "Author",
  "title": "Example Goodreads Author Result",
  "description": "Example publicly indexed result containing author@example.com",
  "url": "https://www.goodreads.com/...",
  "email": "author@example.com"
}
```

Actual records depend on the publicly indexed search results available for your selected keywords, locations, and email domains.

***

### 🔹 Goodreads Email Scraper – How to Use It

The Goodreads Email Scraper is designed to be configured directly through the Actor input.

#### 1. 🔎 Enter Keywords

Add one or more keywords describing the type of Goodreads contacts you want to discover.

For example:

```json
{
  "keywords": [
    "Author",
    "Book Publisher",
    "Fiction Author",
    "Literary Publisher"
  ]
}
```

Specific search terms can help distinguish different types of prospects and reduce overly broad searches.

#### 2. 🌎 Add a Location

The optional `location` field accepts a country, state, or city.

For example:

```json
{
  "location": "New York"
}
```

You can also use:

```text
London
California
Canada
United States
Toronto
```

Leave the location empty when you want the search to run without a geographic filter.

#### 3. 📧 Choose Email Domains

Add the email suffixes you want the Actor to search for.

Example:

```json
{
  "customDomains": [
    "@gmail.com",
    "@yahoo.com",
    "@outlook.com"
  ]
}
```

Custom business domains can also be supplied when relevant to your research.

#### 4. 🔢 Set `maxEmails`

Set the number of email addresses the Actor should target for each keyword + domain combination.

For example, if you use:

- 3 keywords
- 2 email domains
- `maxEmails = 20`

the Actor processes 6 separate combinations and targets up to 20 emails for each combination.

The theoretical target is therefore up to 120 addresses, although the actual number depends on publicly indexed data and duplicate filtering.

#### 5. 🚫 Configure Exclude Words

Add words or phrases that should cause a search-result snippet to be skipped.

For example:

```json
{
  "excludeWords": [
    "crypto",
    "onlyfans"
  ]
}
```

If an excluded term appears in the result description, the entire snippet is ignored.

***

### 🔹 How to Scrape Goodreads Emails by Keyword

The Goodreads Email Scraper works particularly well when your search keywords reflect the type of contact you want to research.

For example, an author-research workflow could use:

- Author
- Fiction Author
- Book Writer
- Independent Author
- Self Published Author
- Nonfiction Author

A publishing-focused workflow could use:

- Publisher
- Book Publisher
- Independent Publisher
- Literary Publisher
- Publishing Company

The Actor combines your keyword with the selected email domain and optional location when performing the search.

> 💡 **Search Strategy:** Use several closely related, specific keywords rather than relying on one broad term. This gives you more control over search intent and can improve the variety of relevant results.

***

### 🔹 How to Find Goodreads Author Emails

To research publicly indexed author contact emails, use author-focused keywords and one or more email domains.

Example:

```json
{
  "keywords": [
    "Author",
    "Fiction Author",
    "Book Writer"
  ],
  "customDomains": [
    "@gmail.com",
    "@outlook.com"
  ],
  "maxEmails": 20
}
```

The Actor searches for relevant publicly indexed Goodreads results and extracts matching email addresses when they appear in the available search-result descriptions.

Not every author will have a publicly indexed email address, so the configured target should be considered a collection target rather than a guarantee.

***

### 🔹 Can You Find Goodreads Publisher Emails?

Yes. You can use publisher-related keywords such as:

- Publisher
- Book Publisher
- Independent Publisher
- Literary Publisher
- Publishing Company

For example:

```json
{
  "keywords": [
    "Publisher",
    "Book Publisher",
    "Literary Publisher"
  ],
  "customDomains": [
    "@gmail.com",
    "@outlook.com",
    "@yahoo.com"
  ]
}
```

This can be useful for researching publicly indexed publishing contacts and building structured research datasets.

The Actor only returns emails that are discoverable through the search results and match the configured domain suffixes.

***

### 🔹 Can You Target Goodreads Contacts by Location?

Yes. The `location` input adds a geographic term to the search.

For example:

```json
{
  "keywords": [
    "Author",
    "Publisher"
  ],
  "location": "London"
}
```

Location targeting can be useful for regional author research, publishing-market research, or geographic prospecting.

However, adding a location can also make a search narrower. If the result count is low, try removing the location or replacing it with a broader geographic term.

***

### 🔹 Goodreads Email Scraper – Use Cases

The Goodreads Email Scraper can support contact research across publishing, books, authors, and related professional areas.

> **📚 Use Cases**
>
> - ✍️ Author discovery research
> - 🏢 Publisher research
> - 📖 Book-industry prospecting
> - 📧 Public contact-email research
> - 🤝 Author partnership research
> - 📣 Book marketing research
> - 🌎 Location-based publishing research
> - 🔎 Literary professional discovery
> - 📊 Audience and market research
> - 🧩 Keyword-based lead generation

#### ✍️ Author Research

Researchers can use author-related keywords to identify publicly indexed contact emails and review the associated search-result context.

#### 🏢 Publisher Discovery

Publishing-related search terms can help researchers discover publicly indexed contact information associated with publisher-focused results.

#### 📣 Book Marketing Research

Marketing professionals can use relevant keywords to research authors and publishing-related contacts for legitimate business research, partnership discovery, or campaign planning.

#### 🌎 Regional Research

The optional location field provides a way to narrow search intent around a particular city, state, or country.

***

### 🔹 Goodreads Email Scraper – Input

The Actor accepts five user-facing input fields.

| Input           | Type    | Required | Default               |
| --------------- | ------- | -------: | --------------------- |
| `keywords`      | Array   |      Yes | `Publisher`, `Author` |
| `location`      | String  |       No | Empty                 |
| `customDomains` | Array   |       No | `@gmail.com`          |
| `maxEmails`     | Integer |       No | `5`                   |
| `excludeWords`  | Array   |       No | Empty                 |

#### 🔎 `keywords`

A required list of search keywords or queries.

Example:

```json
{
  "keywords": [
    "Author",
    "Publisher",
    "Book Writer"
  ]
}
```

#### 📍 `location`

An optional country, state, or city used to narrow search results.

Example:

```text
Toronto
```

Leave it empty to search without a geographic filter.

#### 📧 `customDomains`

An array containing email-domain suffixes.

Example:

```json
{
  "customDomains": [
    "@gmail.com",
    "@yahoo.com",
    "@outlook.com"
  ]
}
```

#### 🔢 `maxEmails`

An integer between **1 and 10,000**, with a default value of `5`.

This target applies independently to each keyword + domain combination.

#### 🚫 `excludeWords`

An optional list of words or phrases that should cause matching search-result descriptions to be skipped.

Matching is case-insensitive. Single words are matched as whole words, while phrases are matched as phrases.

***

### 🔹 Goodreads Email Scraper – Output Format

Every discovered email is stored as a structured dataset record.

> **📊 Output Fields**
>
> - `network` — `Goodreads.com`
> - `keyword` — Search keyword used
> - `title` — Search-result title
> - `description` — Search-result description/snippet
> - `url` — Search-result URL
> - `email` — Matching extracted email

The default dataset view is named **Scraped Leads** and displays:

- Keyword
- Title
- Description
- Url
- Email

This structure keeps the email connected to the search context that produced it.

***

### 🔹 Goodreads Email Scraper – Pricing and Limits

The Actor configuration does not specify a fixed monetary price.

The main configurable collection limit is `maxEmails`, which accepts values from 1 through 10,000.

> **💰 Limit Information**
>
> - Default `maxEmails`: 5
> - Minimum `maxEmails`: 1
> - Maximum configured `maxEmails`: 10,000
> - The target applies per keyword + domain combination.
> - Free-tier runs cap the requested target at 100 emails per keyword + domain combination.
> - Paid users are not subject to this specific free-tier ceiling.
> - A higher target does not guarantee more emails.
> - Actual results depend on publicly indexed search information.

The number of returned emails can therefore be lower than the configured target.

***

### 🔹 Goodreads Email Scraper – Tips and Best Practices

#### 🎯 Use Multiple Specific Keywords

A single broad keyword may produce limited or less-focused results.

Instead of:

```text
Books
```

consider:

- Author
- Fiction Author
- Book Publisher
- Independent Publisher
- Literary Publisher

This helps align the search with specific user intent.

#### 📧 Expand Email Domains

Searching only one email provider can limit coverage.

Consider using several relevant domains:

```text
@gmail.com
@yahoo.com
@outlook.com
@hotmail.com
@icloud.com
```

You can also add company-specific domains where appropriate.

#### 🌎 Adjust Location Filters

If a location-specific search returns too few results, try removing the location.

Alternatively, replace a city with a broader state or country.

#### 🚫 Choose Exclusions Carefully

Exclude-word filtering operates on the complete search-result description.

For example, excluding `crypto` means that any snippet containing that matching word is skipped, so avoid overly broad exclusion terms that could remove useful results.

#### ⏱️ Give Wide Searches Enough Time

Runs involving many keywords and email domains may require more search-result pages.

The Actor configuration uses a default run timeout of **3600 seconds**. For broad searches, consider increasing the timeout through the Apify Run options when necessary.

***

### 🔹 Why Use Goodreads Email Scraper?

Manual contact discovery can require repeatedly searching different combinations of professional terms and email providers.

The Goodreads Email Scraper brings these searches into one configurable workflow.

> **⭐ Why Use This Actor?**
>
> - Save time on repetitive keyword searches
> - Search multiple professional terms in one run
> - Target multiple email domains
> - Narrow searches by location
> - Filter unwanted snippets
> - Reduce duplicate emails
> - Receive structured lead records
> - Continue collecting across multiple keyword/domain combinations

The result is a focused research dataset rather than a simple unstructured list of email addresses.

***

### 🔹 Does Goodreads Email Scraper Remove Duplicate Emails?

Yes.

The Actor tracks previously discovered email addresses and prevents the same email from being registered repeatedly during the run.

This is particularly useful when multiple keywords overlap.

For example, an author might appear in searches for both `Author` and `Fiction Author`. If the same email is discovered again, the duplicate is not added as a new email record.

This helps keep the resulting contact dataset cleaner.

***

### 🔹 What Happens If Goodreads Search Results Are Limited?

The Goodreads Email Scraper cannot guarantee a specific number of emails because it depends on publicly indexed information.

A low result count may happen when:

- The keyword is too narrow
- The location is too restrictive
- The selected domain is uncommon
- Few matching snippets contain public emails
- Search results have already been exhausted
- Duplicate addresses have been filtered

> 💡 **If results are low, try:** adding related keywords, adding more email domains, removing the location filter, broadening the location, or increasing `maxEmails`.

The target controls how deeply the Actor attempts to search; it does not create additional publicly available contact information.

***

### 🔹 Frequently Asked Questions

#### 🔍 What is Goodreads Email Scraper?

Goodreads Email Scraper is an Apify Actor for discovering publicly indexed email addresses associated with Goodreads search results using configurable keywords, email domains, and optional locations.

#### 📧 How do I scrape Goodreads emails by keyword?

Enter your desired terms in `keywords`, select one or more `customDomains`, optionally specify a location, and set `maxEmails`. The Actor searches the resulting keyword/domain combinations and stores matching emails in the dataset.

#### ✍️ Can I find Goodreads author emails?

Yes. Use keywords such as `Author`, `Fiction Author`, `Book Writer`, or similar terms. The Actor extracts matching email addresses when they are publicly indexed in relevant search-result descriptions.

#### 🏢 Can I find Goodreads publisher emails?

Yes. Publisher-focused keywords such as `Publisher`, `Book Publisher`, `Literary Publisher`, and `Independent Publisher` can be used to target publishing-related search results.

#### 📩 Can I search Gmail, Yahoo, and Outlook together?

Yes. Add multiple email suffixes to `customDomains`. Each keyword + domain combination is searched independently.

#### 🌎 Can I search Goodreads contacts by country or city?

Yes. The `location` field accepts a country, state, or city and adds it to the search criteria.

#### 🚫 How does the Goodreads exclude-word filter work?

If a configured excluded word or phrase appears in a search-result description, that entire snippet is skipped and no email is extracted from it.

#### 📊 What data does Goodreads Email Scraper extract?

The Actor outputs `network`, `keyword`, `title`, `description`, `url`, and `email`. The default dataset table displays the keyword, title, description, URL, and email.

#### 🔢 Is `maxEmails` a run-wide limit?

No. It is applied independently to each keyword + domain combination. For example, 3 keywords and 2 domains create 6 separate combinations.

#### ♻️ Does Goodreads Email Scraper remove duplicate emails?

Yes. Previously discovered email addresses are tracked so duplicate emails are not repeatedly registered during the run.

#### 💰 What is the free-tier limit?

On the free tier, the requested target is capped at 100 emails per keyword + domain combination. Paid users do not have this particular free-tier ceiling.

#### ⏱️ Why did I receive fewer emails than my `maxEmails` value?

`maxEmails` is a target, not a guarantee. The Actor can only collect matching emails that are publicly indexed and available in the relevant search results. Filtering and duplicate removal can also reduce the final count.

***

### 🔹 Important Notes

> ⚠️ **Keep these limitations in mind**
>
> - The Actor relies on publicly indexed search-result information.
> - Email extraction is limited to the domains specified in `customDomains`.
> - `maxEmails` is a collection target, not a guarantee.
> - Location filtering can reduce available results.
> - Exclude words can intentionally remove matching snippets.
> - Duplicate email addresses are filtered.
> - Broad keyword/domain combinations may require additional runtime.
> - Publicly available contact information should be used responsibly and in accordance with applicable privacy, anti-spam, and platform rules.

For the most useful results, build your search around the specific type of author, publisher, or book-industry contact you are researching.

***

### 🔹 Support

For questions, improvements, custom requirements, or assistance with the Actor, contact me by email.

**contact me by email : <alphascraper69@gmail.com>**

# Actor input Schema

## `keywords` (type: `array`):

A list of keywords or queries to search for.

## `location` (type: `string`):

Optional country, state or city used to narrow the search. Leave it empty to search without a geographic filter.

## `customDomains` (type: `array`):

List of custom email domains

## `maxEmails` (type: `integer`):

How many addresses each search keyword + domain suffix combination may collect before the finder moves on to the next one. This is a per-combination target, not a run-wide total: with 3 keyword and 2 Domains and a limit of 20, the run works through all 6 combinations and aims for up to 20 addresses in each, so up to 120 overall. Lower values finish sooner and cost less; higher values dig deeper but never guarantee a fuller result, since the run can only find what is publicly listed.

## `excludeWords` (type: `array`):

Words or phrases you do not want to see.

## Actor input object example

```json
{
  "keywords": [
    "Publisher",
    "Author"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com"
  ],
  "maxEmails": 5,
  "excludeWords": []
}
```

# Actor output Schema

## `dataset` (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 = {
    "keywords": [
        "Publisher",
        "Author"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com"
    ],
    "excludeWords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("email_scraper/goodreads-email-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 = {
    "keywords": [
        "Publisher",
        "Author",
    ],
    "location": "",
    "customDomains": ["@gmail.com"],
    "excludeWords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("email_scraper/goodreads-email-scraper").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 '{
  "keywords": [
    "Publisher",
    "Author"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com"
  ],
  "excludeWords": []
}' |
apify call email_scraper/goodreads-email-scraper --silent --output-dataset

```

## MCP server setup

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

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/88PasCYuBWkdJYm8P/builds/Tbd6THCpxwi1raLQ1/openapi.json
