# ThomasNet Scraper - US Suppliers, Phones & Revenue, No Login (`locaihost/thomasnet-scraper`) Actor

ThomasNet scraper, $2 per 1,000 rows. US and Canadian manufacturers, distributors and service companies by category and state: phone, website, address, employees, annual sales band, year founded, supplier type, materials, industries. New suppliers only on schedules.

- **URL**: https://apify.com/locaihost/thomasnet-scraper.md
- **Developed by:** [locaihost data](https://apify.com/locaihost) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 suppliers

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## ThomasNet Scraper - US Suppliers, Phones & Revenue, No Login

Find US and Canadian manufacturers, distributors and service companies on ThomasNet by category and state, as clean
rows: supplier name, phone, website, street address, employees, annual sales band, year founded, supplier type, the
categories it is listed under, materials it works with and industries it serves. **$2 per 1,000 rows.** No login, no
cookies, no account needed.

### Try it

Paste this into the Input tab (JSON) and press Start:

```json
{
    "categories": ["cnc machining"],
    "maxCompaniesPerCategory": 50
}
```

You get 50 CNC machining suppliers across the US and Canada, with phone, website and company size, in about 20
seconds.

More examples:

```json
{ "categories": ["injection molded plastics", "metal stamping"], "regions": ["Ohio", "Michigan", "Indiana"], "maxCompaniesPerCategory": 300 }
```

```json
{ "categories": ["https://www.thomasnet.com/suppliers/usa/steel-pipe-58610205"], "maxCompaniesPerCategory": 1000 }
```

```json
{ "categories": ["https://www.thomasnet.com/suppliers/usa/valves-90052002"], "maxCompaniesPerCategory": 500 }
```

### What you get

**Supplier rows** (`type: "company"`)

| Field | Example |
|---|---|
| name, profileUrl | Eagle Stainless Tube & Fabrication, Inc., its ThomasNet page |
| websiteUrl, domain | https://eagletube.com, eagletube.com |
| phone | (855) 713-7238 (the number the supplier publishes on ThomasNet) |
| address, city, region, postalCode, country | 10 Discovery Way, Franklin, MA, 02038, United States |
| employees, employeesMin, employeesMax | 50-99, 50, 99 |
| annualRevenue | $5 - 9.9 Mil |
| foundedYear | 1982 |
| businessType | Custom Manufacturer, Finishing Service Company, Manufacturer |
| categories | Steel Pipe, Stainless Steel Pipe, Seamless Steel Pipe |
| materials | Stainless Steel, Nickel / Nickel Alloy |
| industries | Aerospace, Medical and Dental, Semiconductor |
| badges | Thomas Verified, Top responder |
| isSponsored | true for ThomasNet advertisers |
| description | the supplier's own description |
| query, rank, listUrl | the category it came from, its position, the page it was on |

Every row also has `input` (what you typed that produced it) and `scrapedAt`. Rows use the same columns as our Clutch,
Europages and IndiaMART scrapers, so you can stack them into one supplier table. The dataset has ready views for
suppliers and contacts, and exports to CSV, Excel or JSON.

### How much ThomasNet shows

A logged-out visitor sees the first 25 suppliers of any ThomasNet list; the next pages ask for an account, and this
Actor never signs in. So it reads the national page of a category, then the page of each state and province (busiest
manufacturing regions first), each with its own first 25. A category with suppliers everywhere gives up to about
1,500. **Regions** limits the run to the states or provinces you name. A broad ThomasNet category such as Valves or
Welding Services is a landing page: the Actor reads the narrower categories under it (ball valves, check valves,
control valves and so on) and says so in the run's message. Words are matched to a category the way ThomasNet's own
search does; a very broad single word sometimes gets ThomasNet's product search instead, in which case the run says so
and you can paste the category's address.

### Monitoring

Turn on **Only new since the last run** and schedule the Actor weekly. Each run returns only suppliers that earlier
runs with the same input did not, so you pay only for suppliers new to your categories. A run with nothing new
charges nothing.

### Price

Pay per row: **$2 per 1,000 rows** on the Starter plan, $1.50 on Scale, $1.10 on Business. Categories ThomasNet
doesn't have and unusable inputs come back as free `not-found` rows that say what to change. Nothing else is charged
on top.

Apify's free plan is capped at 1,000 rows per run; any paid Apify plan removes the cap.

### Good to know

- Only what a logged-out visitor sees. No account, no login cookies, no sign-in pages.
- Rows are businesses. ThomasNet's lists of named staff are on company pages this Actor doesn't read. Personal-looking
  e-mail addresses in descriptions are removed.
- Certification names (ISO 9001 and so on) are on a ThomasNet page that its robots.txt asks crawlers not to read, so
  rows carry the Thomas Verified badge instead.
- ThomasNet sometimes refuses a page. The Actor retries from a new address; a region page refused on every try is
  skipped and counted in the run's summary.
- Pages are read in a real browser from US addresses, four at a time. A category of 150 suppliers takes about 30
  seconds, 700 suppliers about two minutes.
- Everything about the run (pages read, region pages, free rows, timing) is in the `SUMMARY` record of the run's
  key-value store.

### Use it lawfully

You are responsible for how you use the data. Follow privacy and marketing law (such as CAN-SPAM, CASL or the TCPA) if
you contact suppliers, and check ThomasNet's terms for your use.

### Questions

Open an issue on the Issues tab. Feature requests are welcome.

### Did it help?

If this saved you time, a quick rating on the Store helps other people find it. Something not working? Open an issue on the Issues tab and we usually reply within a day.

# Actor input Schema

## `categories` (type: `array`):

What the suppliers make or do, like cnc machining, injection molded plastics or steel pipe, or the address of a ThomasNet category page, like https://www.thomasnet.com/suppliers/usa/steel-pipe-58610205. Words are matched to ThomasNet's own category. A broad category (like Valves) reads the narrower categories under it.

## `regions` (type: `array`):

Optional. Only suppliers in these US states or Canadian provinces, like Texas, Ohio or Ontario (ThomasNet splits a few big states: Texas gives Northern and Southern Texas). Leave empty for all of the US and Canada.

## `includeRegions` (type: `boolean`):

ThomasNet shows a logged-out visitor the first 25 suppliers of each page. With this on (and no regions chosen), the national page is read first, then the page of each state and province, busiest manufacturing regions first, which reaches far more suppliers. Off: the national 25 only.

## `maxCompaniesPerCategory` (type: `integer`):

Suppliers to take from each category, across the national and region pages. A category with suppliers everywhere can give about 1,500.

## `onlyNew` (type: `boolean`):

For schedules: skip suppliers this same input already returned in an earlier run, so you pay only for new ones. The memory is per input: change the categories or regions and it starts fresh.

## `maxResults` (type: `integer`):

Stop after this many charged rows across all categories. 0 means no limit (your run's maximum charge still applies).

## Actor input object example

```json
{
  "categories": [
    "cnc machining",
    "https://www.thomasnet.com/suppliers/usa/steel-pipe-58610205"
  ],
  "regions": [
    "Texas",
    "Ohio"
  ],
  "includeRegions": true,
  "maxCompaniesPerCategory": 50,
  "onlyNew": false,
  "maxResults": 0
}
```

# Actor output Schema

## `suppliers` (type: `string`):

One row per supplier: type, categories, employees, annual sales, year founded, city, state, website, rank.

## `contacts` (type: `string`):

Website, the supplier's published phone and address for each supplier.

## `full` (type: `string`):

Every field of every row, including free not-found rows.

## `summary` (type: `string`):

Counts, free rows by reason, region pages read, anything that failed, access stats and cost.

# 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 = {
    "categories": [
        "cnc machining"
    ],
    "maxCompaniesPerCategory": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("locaihost/thomasnet-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 = {
    "categories": ["cnc machining"],
    "maxCompaniesPerCategory": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("locaihost/thomasnet-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 '{
  "categories": [
    "cnc machining"
  ],
  "maxCompaniesPerCategory": 50
}' |
apify call locaihost/thomasnet-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,locaihost/thomasnet-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/M1SoeYysgaCtYQVeD/builds/9VTPMq9MUVdkDhOGA/openapi.json
