# Thomas Scientific Email Scraper (`leads-scraper/thomas-scientific-email-scraper`) Actor

Thomas Scientific Email Scraper SD - Thomas Scientific Email Scraper is a lead generation tool that extracts leads with public contact emails, account names and profile URLs from Thomas Scientific results by keyword, location and email domain - Thomas Scientific email extractor.

- **URL**: https://apify.com/leads-scraper/thomas-scientific-email-scraper.md
- **Developed by:** [Leads Scraper](https://apify.com/leads-scraper) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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

### Thomas Scientific Email Scraper - public lab vendor contacts from thomassci.com

The Thomas Scientific Email Scraper collects publicly indexed contact emails that appear in Google search results for `thomassci.com`. Thomas Scientific is a long-established American laboratory distributor, selling instruments, consumables and reagents to research, clinical and industrial labs.

Read this before anything else. Thomas Scientific is a first-party lab distributor rather than a supplier directory, so this Actor finds brand and vendor contacts published on its pages rather than many independent suppliers.

Be plain about the consequence: volume is very low. A distributor catalogue does not carry the tens of thousands of company profile pages that a sourcing marketplace does, so there is very little for Google to index in the way this Actor needs.

The Thomas Scientific Email Scraper builds Google `site:thomassci.com` queries, reads the result pages through the Apify GOOGLE_SERP proxy, and extracts every address matching your domain filter. Treat it as a narrow, exploratory tool for the laboratory vertical.

#### A measured live result, stated plainly

A live Google run of the Thomas Scientific Email Scraper returned **1 result block and 0 unique emails**. That is the observed figure from a real run and it is not softened here.

One block is what a first-party catalogue looks like through a `site:` query aimed at contact routes. There is no directory layer of independent vendor profiles to reach.

Zero emails on default settings means the two webmail domains in `customDomains` matched nothing at all. Lab distributors and their brand partners publish corporate addresses, not Gmail or Yahoo ones.

So set expectations accordingly. If you want a laboratory or scientific supplier list at scale, run [Alibaba Email Scraper](https://apify.com/leads-scraper/alibaba-email-scraper) or [Global Sources Email Scraper](https://apify.com/leads-scraper/global-sources-email-scraper) with lab equipment keywords instead, and use the Thomas Scientific Email Scraper only as a targeted supplement.

### Features of the Thomas Scientific Email Scraper

Every feature listed below is genuinely implemented in the Thomas Scientific Email Scraper. Nothing here is aspirational, and none of it changes the volume ceiling described above.

| Feature | What it means in practice |
|---|---|
| Google SERP parsing | Reads Google result pages through the Apify GOOGLE_SERP proxy. No browser, no JavaScript rendering |
| Structural block detection | Locates the `<h3>` title, then the smallest surrounding block. Does not depend on Google's CSS class names |
| Domain filter | Only emails ending in one of your `customDomains` values are kept |
| Query expansion | Base, quoted, `intitle:` and one variant per query modifier. Base queries run first |
| Global deduplication | An email seen once is never pushed twice, across every query and every page |
| Email normalisation | Understands `name [at] domain [dot] com`, `name (at) domain`, `name @ domain.com`, `domain .com`, zero-width characters and the full-width `＠` sign |
| Junk filter | Rejects placeholders such as `email@`, `yourname@`, `test@`, `xxx@` and single-character locals |
| Boundary-correct matching | `@gmail.com` does not match inside `@gmail.company` or `@gmail.com.br` |
| Soft-wrap repair | Drops a hit that is only the tail of another email in the same block |
| Concurrency | An `asyncio` worker pool with a shared stop signal on `maxEmails` |
| Retries | Up to 3 attempts per page, exponential backoff, a fresh proxy session per request |
| Block detection | CAPTCHA, "unusual traffic" and consent pages are detected and retried, not counted as empty |
| Re-queueing | Blocked or failed queries are retried once at the end of the run |
| Resumable run | State is stored in the key-value store, keyed by a hash of the input, and saved on `PERSIST_STATE`, `MIGRATING` and `ABORTING` |
| Fallback parser | If Google's markup changes, the run degrades to "emails without account details" rather than "no emails" |
| Run summary | Logs pages fetched, blocked pages, retries and emails per page |
| Dataset output | Rows push immediately and export to CSV, JSON, Excel or XML from the Apify dataset |

Two features are worth calling out on a domain this thin. Query expansion is the only mechanism the Thomas Scientific Email Scraper has for reaching beyond the handful of pages a single query returns.

Block detection matters because with so few results, one CAPTCHA page misread as an empty page would swallow most of the run. This Actor retries those instead of counting them as nothing found.

### How the Thomas Scientific Email Scraper works

The pipeline is six steps and nothing is hidden inside it.

1. It reads your input: keywords, location, email domains and limits.
2. It builds Google search queries with the `site:` operator against `thomassci.com`, for example `site:thomassci.com lab supplier contact "@outlook.com"`.
3. It fetches Google result pages through the Apify GOOGLE_SERP proxy using `aiohttp`, asynchronously.
4. It parses each result block structurally, finding the `<h3>` title and the smallest block around it.
5. It extracts emails from that block's text with a domain-filtered regex.
6. It deduplicates globally and pushes each lead straight into the Apify dataset.

The Thomas Scientific Email Scraper does **not** log into Thomas Scientific, does not use any Thomas Scientific API, and does not open the site in a browser. Every field comes from publicly indexed Google search results - titles, snippets and site labels, with no authentication and no cookies.

### Who the Thomas Scientific Email Scraper is built for

The Thomas Scientific Email Scraper is a laboratory-vertical tool with a narrow, honest remit.

Lab equipment and consumables vendors use the Thomas Scientific Email Scraper to find the brand and distribution contacts published alongside catalogue content. That is the use case the observed data actually supports.

Research procurement teams use it to identify a brand's contact route when a catalogue entry names the manufacturer behind a product. Reagent and consumable makers use it to find distribution partners.

Scientific marketing agencies use it as one input among several when building a lab-sector prospect list. It should never be the only input, because the volume simply is not there.

If you need a real laboratory supplier list, combine broader sourcing Actors such as [Made-in-China Email Scraper](https://apify.com/leads-scraper/made-in-china-email-scraper) with lab-specific keywords.

### Input fields for the Thomas Scientific Email Scraper

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["lab supplier", "scientific equipment"]` | Search terms - niche, job title, industry |
| `location` | string | `""` | Optional location phrase added to every query |
| `customDomains` | array | `["@gmail.com", "@yahoo.com"]` | Only emails on these domains are kept; the `@` is optional |
| `maxEmails` | integer 1-10000 | `20` | Stop after this many unique emails |
| `countryCode` | string | `""` | Two-letter country for the search proxy (US, GB, DE...) |
| `expandQueries` | boolean | `true` | Search each keyword x domain pair in several phrasings |
| `queryModifiers` | array | `["email", "contact", "export", "wholesale", "sales enquiries"]` | Extra words combined with each keyword when expansion is on |
| `maxPagesPerQuery` | integer 1-50 | `30` | Page cap per query |
| `maxConcurrency` | integer 1-20 | `5` | Parallel queries |

#### How the Thomas Scientific Email Scraper input fields actually behave

`customDomains` is the field that decides whether you get anything at all. The live run returned zero emails on the two webmail defaults, so adding `@outlook.com`, `@hotmail.com` and `@aol.com` is the first change to make.

`keywords` in the Thomas Scientific Email Scraper should name laboratory categories and brands. `centrifuge`, `pipette tips`, `analytical balance`, `fume hood` and `reagent grade` match catalogue vocabulary better than the broad defaults.

`queryModifiers` only fire when `expandQueries` is `true`. On a distributor catalogue the `contact` and `email` modifiers are the ones with any chance of landing.

`maxEmails` should stay low. Setting a large ceiling on a domain that produced zero emails in testing simply lengthens the run without producing leads.

`countryCode` is worth setting to `US`, since Thomas Scientific is an American distributor. `maxConcurrency` and `maxPagesPerQuery` are fine at their defaults of 5 and 30.

### JSON input example for the Thomas Scientific Email Scraper

```json
{
  "keywords": ["analytical balance", "fume hood", "reagent supplier"],
  "location": "",
  "customDomains": ["@gmail.com", "@outlook.com", "@hotmail.com", "@aol.com"],
  "maxEmails": 25,
  "countryCode": "US",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "export", "wholesale", "sales enquiries"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

That is a realistic configuration for the Thomas Scientific Email Scraper: three laboratory category terms, no location narrowing on an already tiny result set, a widened domain filter and a deliberately small `maxEmails`.

The low ceiling is intentional. On this domain the honest goal is a handful of well-targeted contacts, not a list.

### Output fields of the Thomas Scientific Email Scraper

Every dataset item carries all fourteen fields.

| Field | Meaning |
|---|---|
| `network` | Platform name |
| `keyword` | The keyword that produced the lead |
| `query` | The exact Google query used |
| `title` | Raw result title |
| `accountName` | Account label Google prints |
| `fullName` | Display name parsed from a profile-style title; empty for catalogue results |
| `username` | URL-safe handle when the platform exposes one; otherwise `null` |
| `profileUrl` | Canonical account URL when a handle is known; otherwise empty |
| `url` | Direct platform link when exposed, else the profile URL |
| `description` | Bio or snippet text, cleaned of labels and counters |
| `email` | Lower-cased email address |
| `emailDomain` | The matched domain, for example `@outlook.com` |
| `possiblyTruncated` | `true` when Google's snippet ellipsis touched the email - verify before sending |
| `foundAt` | ISO 8601 UTC timestamp |

Expect `username: null` and an empty `profileUrl` on catalogue rows, because a distributor product page is not a company profile. When a handle is exposed the Thomas Scientific Email Scraper builds the canonical link as `https://www.thomassci.com/{username}`.

Always check `possiblyTruncated` before you send. When it is `true`, Google's snippet ellipsis may have clipped the address and it should be confirmed on the source page.

### JSON output example from the Thomas Scientific Email Scraper

The live run produced no emails, so the rows below illustrate the shape a result would take if one is found rather than data actually returned.

```json
[
  {
    "network": "Thomas Scientific",
    "keyword": "analytical balance",
    "query": "site:thomassci.com analytical balance contact \"@outlook.com\"",
    "title": "Analytical Balances - Laboratory Weighing - Thomas Scientific",
    "accountName": "Thomas Scientific",
    "fullName": "",
    "username": null,
    "profileUrl": "",
    "url": "https://www.thomassci.com/scientific-products/analytical-balances",
    "description": "Catalogue category for analytical balances. Brand distribution contact printed in the supplier note.",
    "email": "sales.precisionweighlabs@outlook.com",
    "emailDomain": "@outlook.com",
    "possiblyTruncated": false,
    "foundAt": "2026-08-29T17:20:11Z"
  },
  {
    "network": "Thomas Scientific",
    "keyword": "reagent supplier",
    "query": "site:thomassci.com reagent supplier \"sales enquiries\" \"@hotmail.com\"",
    "title": "Cedar Ridge Reagents - brand page - Thomas Scientific",
    "accountName": "Cedar Ridge Reagents",
    "fullName": "Cedar Ridge Reagents",
    "username": "cedar-ridge-reagents",
    "profileUrl": "https://www.thomassci.com/cedar-ridge-reagents",
    "url": "https://www.thomassci.com/cedar-ridge-reagents",
    "description": "Reagent-grade chemicals brand carried by the distributor. Sales enquiries handled by email.",
    "email": "sales.cedarridgereagents@hotmail.com",
    "emailDomain": "@hotmail.com",
    "possiblyTruncated": true,
    "foundAt": "2026-08-29T17:23:48Z"
  }
]
```

The first shape, with `username: null` and an empty `profileUrl`, is what a catalogue page produces for the Thomas Scientific Email Scraper. The second, with a resolvable brand handle, is the rarer case.

### Use cases for the Thomas Scientific Email Scraper

| Audience | What they do with the data |
|---|---|
| Lab equipment vendors | Find brand and distribution contacts published alongside catalogue content |
| Consumables and reagent makers | Identify distribution partners in the North American lab channel |
| Research procurement teams | Trace the manufacturer behind a catalogued product |
| Clinical and industrial lab buyers | Reach a named brand about a specific instrument line |
| Scientific marketing agencies | Add a small, targeted lab-channel segment to a wider prospect list |
| Distribution and channel managers | Study which lab brands publish a public contact route |
| Market researchers | Sample how the North American lab channel presents its vendors |
| Trade-show organisers | Identify lab brands worth approaching for exhibition space |

Each of these is outbound work aimed at a company inbox that a vendor published in order to receive enquiries. That is the honest boundary of what the Thomas Scientific Email Scraper does, and the volume boundary is just as real.

### Targeting tips for the Thomas Scientific Email Scraper

With one block and zero emails on defaults, every tip below is about squeezing the domain rather than scaling it.

Change `customDomains` before anything else. The two American webmail defaults matched nothing, and `@outlook.com`, `@hotmail.com` and `@aol.com` are the realistic additions for a US distributor's brand partners.

Use catalogue vocabulary in `keywords`. Instrument and consumable nouns such as `centrifuge`, `pipette tips`, `fume hood` and `analytical balance` reach more of the index than `lab supplier` does.

Leave `location` empty. Narrowing an already tiny result set with a geographic phrase usually reduces it to nothing.

Run the Thomas Scientific Email Scraper alongside broader Actors rather than on its own. [Taiwantrade Email Scraper](https://apify.com/leads-scraper/taiwantrade-email-scraper) with lab keywords will produce far more scientific-equipment leads.

### Limitations of the Thomas Scientific Email Scraper

Read all of these before your first run.

- Thomas Scientific is a first-party lab distributor rather than a supplier directory, so this Actor finds brand and vendor contacts published on its pages rather than many independent suppliers.
- Volume is very low. The live run returned 1 result block and 0 unique emails on default settings.
- The Thomas Scientific Email Scraper only finds addresses that are **publicly visible in Google's index**. Anything Google has not indexed is invisible to it.
- Google caps a single query at roughly 300 results, which is exactly why query expansion exists and defaults to on.
- `possiblyTruncated: true` means Google's snippet ellipsis may have cut the email short. Verify it before sending.
- It requires the Apify GOOGLE_SERP proxy and cannot run without Apify proxy credentials.
- Free Apify plans are capped at 100 emails per run; paid plans are uncapped. On this domain that cap is very unlikely to be reached.
- `username` and `profileUrl` are only populated when Google exposes a handle. On catalogue pages it usually does not, so expect `username: null` and an empty `profileUrl`. That is a Google limitation, not a bug.
- Results vary with keywords, domains and location. No volume is guaranteed by the Thomas Scientific Email Scraper or by any Actor in this family.

### Responsible use of Thomas Scientific Email Scraper output

The addresses the Thomas Scientific Email Scraper surfaces are business contacts that vendors and brands published so that laboratory buyers could reach them. Treat them accordingly.

Even in a B2B context, a named individual's work address is personal data under GDPR when that person is in scope, and US rules such as CAN-SPAM apply to commercial mail regardless. Record your lawful basis, identify yourself in the first line, and make the relevance obvious.

Honour opt-outs immediately and permanently, keep your list current, and follow the marketing rules of every market you contact. None of this is legal advice, and it does not replace your own compliance review.

### FAQ about the Thomas Scientific Email Scraper

#### How many results should I expect from the Thomas Scientific Email Scraper?

A live Google run returned 1 result block and 0 unique emails on default settings. That is genuinely very low, because Thomas Scientific is a first-party lab distributor rather than a supplier directory with many indexed vendor pages. Widening `customDomains` and using catalogue vocabulary improves the odds, but no volume is guaranteed and this Actor should not be your primary source.

#### Why did the live run find no emails at all?

Because the two default `customDomains` are American consumer webmail, and a distributor's brand partners publish corporate addresses instead. Widening the filter is the first and most important change.

#### Is the Thomas Scientific Email Scraper worth running?

As a narrow supplement for the laboratory vertical, yes. As a way to build a lab supplier list on its own, no.

#### Does the Thomas Scientific Email Scraper log into Thomas Scientific or use its API?

No. It builds Google `site:thomassci.com` queries, fetches result pages through the Apify GOOGLE_SERP proxy and parses them. There is no browser, no login, no API and no cookies.

#### Which Actors should I use instead for lab suppliers?

[Global Sources Email Scraper](https://apify.com/leads-scraper/global-sources-email-scraper) with keywords such as `laboratory equipment` or `scientific instruments` will return far more than the Thomas Scientific Email Scraper can on its own.

#### Should I use non-English keywords?

No. Thomas Scientific publishes in American English, so translated terms return nothing useful.

#### Can the Thomas Scientific Email Scraper find addresses on a brand's own domain?

Only if the address appears in the Google result block and you list that domain in `customDomains`. The filter compares the end of each address, so every domain you want must be in the array.

#### Why does the Thomas Scientific Email Scraper turn `expandQueries` on by default?

Google caps one query at roughly 300 results. Expansion runs base, quoted and `intitle:` variants plus one per modifier, which is the only way to reach more than a handful of pages here. Base queries always run first.

#### Can I run the Thomas Scientific Email Scraper on a free Apify plan?

Yes. Free plans are capped at 100 emails per run, and paid plans are uncapped. That cap will almost certainly never bind on this domain.

#### What happens if a run is interrupted?

State is saved in the key-value store, keyed by a hash of your input, and written on Apify's `PERSIST_STATE`, `MIGRATING` and `ABORTING` events. Restarting with the same input resumes rather than starting over.

#### Which export formats are available?

Anything the Apify dataset supports - CSV, JSON, Excel and XML - plus the API for pushing rows straight into a CRM.

#### Is the Thomas Scientific Email Scraper affiliated with Thomas Scientific?

No. It is an independent Actor that reads publicly indexed Google results and has no relationship with, or endorsement from, the company.

### Related Actors

More email scrapers from the same B2B, Suppliers & Manufacturers family, built on the same Google SERP pipeline.

| Actor | What it collects |
|---|---|
| [Alibaba Email Scraper](https://apify.com/leads-scraper/alibaba-email-scraper) | Public contact emails from Alibaba |
| [DirectIndustry Email Scraper](https://apify.com/neuro-scraper/directindustry-email-scraper) | Public contact emails from DirectIndustry |
| [DIYTrade Email Scraper](https://apify.com/neuro-scraper/diytrade-email-scraper) | Public contact emails from DIYTrade |
| [ECPlaza Email Scraper](https://apify.com/neuro-scraper/ecplaza-email-scraper) | Public contact emails from ECPlaza |
| [Fibre2Fashion Email Scraper](https://apify.com/neuro-scraper/fibre2fashion-email-scraper) | Public contact emails from Fibre2Fashion |
| [Global Sources Email Scraper](https://apify.com/leads-scraper/global-sources-email-scraper) | Public contact emails from Global Sources |
| [GlobalSpec Email Scraper](https://apify.com/leads-scraper/globalspec-email-scraper) | Public contact emails from GlobalSpec |
| [HKTDC Sourcing Email Scraper](https://apify.com/neuro-scraper/hktdc-sourcing-email-scraper) | Public contact emails from HKTDC Sourcing |
| [IndiaMART Email Scraper](https://apify.com/leads-scraper/indiamart-email-scraper) | Public contact emails from IndiaMART |
| [IndustryStock Email Scraper](https://apify.com/neuro-scraper/industrystock-email-scraper) | Public contact emails from IndustryStock |
| [IQS Directory Email Scraper](https://apify.com/neuro-scraper/iqs-directory-email-scraper) | Public contact emails from IQS Directory |
| [Made-in-China Email Scraper](https://apify.com/leads-scraper/made-in-china-email-scraper) | Public contact emails from Made-in-China |
| [Taiwantrade Email Scraper](https://apify.com/leads-scraper/taiwantrade-email-scraper) | Public contact emails from Taiwantrade |
| [Textile Infomedia Email Scraper](https://apify.com/leads-scraper/textile-infomedia-email-scraper) | Public contact emails from Textile Infomedia |
| [Textile World Email Scraper](https://apify.com/leads-scraper/textile-world-email-scraper) | Public contact emails from Textile World |
| [TradeKey Email Scraper](https://apify.com/neuro-scraper/tradekey-email-scraper) | Public contact emails from TradeKey |
| [Tradewheel Email Scraper](https://apify.com/leads-scraper/tradewheel-email-scraper) | Public contact emails from Tradewheel |
| [Wer Liefert Was Email Scraper](https://apify.com/leads-scraper/wer-liefert-was-email-scraper) | Public contact emails from wlw |
| [DirectIndustry Email and Phone Number Scraper](https://apify.com/neuro-scraper/directindustry-email-and-phone-number-scraper) | Emails and phone numbers from DirectIndustry |
| [DIYTrade Email and Phone Number Scraper](https://apify.com/neuro-scraper/diytrade-email-and-phone-number-scraper) | Emails and phone numbers from DIYTrade |
| [ECPlaza Email and Phone Number Scraper](https://apify.com/neuro-scraper/ecplaza-email-and-phone-number-scraper) | Emails and phone numbers from ECPlaza |
| [Fibre2Fashion Email and Phone Number Scraper](https://apify.com/neuro-scraper/fibre2fashion-email-and-phone-number-scraper) | Emails and phone numbers from Fibre2Fashion |
| [Global Sources Email and Phone Number Scraper](https://apify.com/leads-scraper/global-sources-email-and-phone-number-scraper) | Emails and phone numbers from Global Sources |
| [GlobalSpec Email and Phone Number Scraper](https://apify.com/neuro-scraper/globalspec-email-and-phone-number-scraper) | Emails and phone numbers from GlobalSpec |
| [HKTDC Sourcing Email and Phone Number Scraper](https://apify.com/neuro-scraper/hktdc-sourcing-email-and-phone-number-scraper) | Emails and phone numbers from HKTDC Sourcing |
| [IndiaMART Email and Phone Number Scraper](https://apify.com/leads-scraper/indiamart-email-and-phone-number-scraper) | Emails and phone numbers from IndiaMART |
| [IndustryStock Email and Phone Number Scraper](https://apify.com/neuro-scraper/industrystock-email-and-phone-number-scraper) | Emails and phone numbers from IndustryStock |
| [IQS Directory Email and Phone Number Scraper](https://apify.com/neuro-scraper/iqs-directory-email-and-phone-number-scraper) | Emails and phone numbers from IQS Directory |
| [Made-in-China Email and Phone Number Scraper](https://apify.com/leads-scraper/made-in-china-email-and-phone-number-scraper) | Emails and phone numbers from Made-in-China |
| [TradeKey Email and Phone Number Scraper](https://apify.com/neuro-scraper/tradekey-email-and-phone-number-scraper) | Emails and phone numbers from TradeKey |
| [wlw Email and Phone Number Scraper](https://apify.com/leads-scraper/wer-liefert-was-email-and-phone-number-scraper) | Emails and phone numbers from wlw |
| [DirectIndustry Phone Number Scraper](https://apify.com/neuro-scraper/directindustry-phone-number-scraper) | Public phone numbers from DirectIndustry |
| [DIYTrade Phone Number Scraper](https://apify.com/neuro-scraper/diytrade-phone-number-scraper) | Public phone numbers from DIYTrade |
| [ECPlaza Phone Number Scraper](https://apify.com/neuro-scraper/ecplaza-phone-number-scraper) | Public phone numbers from ECPlaza |
| [Fibre2Fashion Phone Number Scraper](https://apify.com/neuro-scraper/fibre2fashion-phone-number-scraper) | Public phone numbers from Fibre2Fashion |
| [Global Sources Phone Number Scraper](https://apify.com/leads-scraper/global-sources-phone-number-scraper) | Public phone numbers from Global Sources |
| [GlobalSpec Phone Number Scraper](https://apify.com/neuro-scraper/globalspec-phone-number-scraper) | Public phone numbers from GlobalSpec |
| [HKTDC Sourcing Phone Number Scraper](https://apify.com/neuro-scraper/hktdc-sourcing-phone-number-scraper) | Public phone numbers from HKTDC Sourcing |
| [IndiaMART Phone Number Scraper](https://apify.com/leads-scraper/indiamart-phone-number-scraper) | Public phone numbers from IndiaMART |
| [IndustryStock Phone Number Scraper](https://apify.com/neuro-scraper/industrystock-phone-number-scraper) | Public phone numbers from IndustryStock |
| [IQS Directory Phone Number Scraper](https://apify.com/neuro-scraper/iqs-directory-phone-number-scraper) | Public phone numbers from IQS Directory |
| [Made-in-China Phone Number Scraper](https://apify.com/leads-scraper/made-in-china-phone-number-scraper) | Public phone numbers from Made-in-China |

### Leave a review

If the Thomas Scientific Email Scraper saved you time, please leave a star rating and a short
review on the Actor page.

Reviews are how other buyers judge whether a tool works, and they tell us which features to
build next.

If something did not work, email <neurodata.apify@gmail.com>
instead - bugs get fixed faster than they get complained about.

# Actor input Schema

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

Search terms describing the Thomas Scientific accounts you want (niche, job title, industry).

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

Optional location phrase added to every query (e.g. "New York").

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

Only emails ending with one of these domains are collected. With or without the leading @. Each domain is searched separately, so more domains means more results but a longer run - remove some for a faster, narrower search, or add your own (e.g. @company.com).

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

Stop once this many unique emails have been collected.

## `countryCode` (type: `string`):

Two-letter country code for the search proxy (e.g. US, GB, DE). Empty for any.

## `expandQueries` (type: `boolean`):

Search each keyword x domain pair with several phrasings. Recommended - Google caps a single query at ~300 results.

## `queryModifiers` (type: `array`):

Extra words combined with each keyword when Expand queries is on. Tuned for Thomas Scientific.

## `maxPagesPerQuery` (type: `integer`):

Google rarely returns more than ~30 pages for one query.

## `maxConcurrency` (type: `integer`):

How many queries run in parallel.

## Actor input object example

```json
{
  "keywords": [
    "lab supplier",
    "scientific equipment"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "export",
    "wholesale",
    "sales enquiries"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Records produced by Thomas Scientific Email Scraper, stored in the run's default dataset.

# 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": [
        "lab supplier",
        "scientific equipment"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "export",
        "wholesale",
        "sales enquiries"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leads-scraper/thomas-scientific-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": [
        "lab supplier",
        "scientific equipment",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "export",
        "wholesale",
        "sales enquiries",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("leads-scraper/thomas-scientific-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": [
    "lab supplier",
    "scientific equipment"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "export",
    "wholesale",
    "sales enquiries"
  ]
}' |
apify call leads-scraper/thomas-scientific-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,leads-scraper/thomas-scientific-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/MzuEdFhXZlclZbYoA/builds/Y0S1l8wdCrCAPAb2I/openapi.json
