# Thomasnet Suppliers Scraper \[$1/1K 💰] No Login, Personnel (`memo23/thomasnet-scraper`) Actor

Thomasnet scraper with no login or cookies: find US and Canadian industrial suppliers by keyword, category or location and export name, website, phone, address, sales, employees, year founded, named personnel with titles and certifications. Optional contact emails from each supplier's website.

- **URL**: https://apify.com/memo23/thomasnet-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 245 total users, 140 monthly users, 100.0% runs succeeded, 6 bookmarks
- **User rating**: 4.72 out of 5 stars

## Pricing

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

## Thomasnet Suppliers Scraper

Find industrial suppliers on [Thomasnet](https://www.thomasnet.com) by keyword, category or location and export them as clean rows: company name, website, phone, full address with coordinates, annual sales, employee count, year founded, **named personnel with job titles**, certifications, brands and capabilities. No Thomasnet login and no cookies. $1 per 1,000 suppliers.

### Why use this scraper?

- **Runs from the default input.** No cookies to export from your browser, no login, no proxy to set up. Type a keyword and start.
- **People, not only companies.** Rows carry the personnel Thomasnet lists for a supplier, with titles such as President or Sales Manager, where the supplier has published them.
- **Two sources per keyword.** Thomasnet's category lists (its verified suppliers, read in full) and its free-text search, repeated in each of 69 regions to reach suppliers outside the category lists.
- **Location that means distance.** Give a ZIP and a radius and every row comes with its distance in miles. Or give a state or a city.
- **Qualification fields.** Company type, annual sales band, employee band, year founded, certifications with audit scope and date, brands carried, materials and industries served.
- **Optional contact emails.** Thomasnet does not publish emails. Turn on `enrichEmails` and the actor reads each supplier's own website for one.

### What it does

| You give | The actor reads |
|---|---|
| A keyword (`searchQueries`) | The Thomasnet categories that match it, then the free-text search for it in every region |
| A category or search URL (`startUrls`) | That category's full supplier list, or the keyword in the URL |
| A company profile URL (`startUrls`) | That one supplier |
| A location | Only suppliers serving that state or city, or within a radius of that ZIP |

Suppliers are saved once per run, however many searches find them.

### How much data to expect

Thomasnet shows a visitor who is not logged in two different things, and this actor does not log in:

- **Category lists are complete.** A category such as CNC Machining returns every verified supplier Thomasnet lists under it (491 on 10 October 2026), in one pass.
- **Free-text search shows 25 suppliers per query.** Thomasnet may count 1,686 matches for a keyword and still show 25. The actor repeats the query in each of Thomasnet's 69 regions and keeps the suppliers it has not seen. For `hydraulic cylinders` that gave 735 unique suppliers in one run: 33 from the category and 702 from the regional searches.

So a broad keyword returns hundreds of suppliers, not always every match Thomasnet counts. A keyword that names a category exactly (`valves`, `cnc machining`) gets that category's whole list.

### Use cases

- **B2B lead generation:** build a list of manufacturers and distributors in a niche, with a named contact where Thomasnet has one.
- **Supplier sourcing:** find certified suppliers near a plant by ZIP and radius, with ISO or diversity certifications on the row.
- **Market mapping:** count and compare suppliers by state, company type, size band and year founded.
- **CRM enrichment:** look up a supplier's profile URL and get its phone, website, address and size.

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array | none | Products or services, one per line. Broad terms return more |
| `location` | string | none | A US state (`Texas` or `TX`), a city with its state (`Houston, TX`) or a 5-digit ZIP. Empty searches the US and Canada |
| `radiusMiles` | integer | `50` | Miles around a ZIP, 5 to 500. Used only when the location is a ZIP |
| `startUrls` | array | none | Thomasnet search, category or company profile URLs |
| `maxItems` | integer | `100` | Cap on suppliers saved. Free plan: 100 per run |
| `maxCategories` | integer | `3` | Categories read per keyword, 1 to 10 |
| `includeCertifications` | boolean | `true` | Add each supplier's certifications |
| `enrichEmails` | boolean | `false` | Find a contact email on each supplier's own website, $0.05 per email found |
| `proxy` | object | none | Leave empty. Set it only to route through your own proxy URLs |

At least one of `searchQueries` and `startUrls` is needed.

#### Example: a keyword near a ZIP

```json
{
    "searchQueries": ["cnc machining"],
    "location": "77002",
    "radiusMiles": 75,
    "maxItems": 200
}
```

#### Example: a category page for one state, with emails

```json
{
    "startUrls": [{ "url": "https://www.thomasnet.com/suppliers/usa/hydraulic-cylinders-21650809" }],
    "location": "Ohio",
    "enrichEmails": true,
    "maxItems": 100
}
```

### Output

One row per supplier (lists shortened here):

```json
{
    "tgramsId": "1082640",
    "name": "Metro Hydraulic",
    "profileUrl": "https://www.thomasnet.com/company/metro-hydraulic-1082640/profile",
    "website": "https://www.metrohydraulic.com/",
    "phone": "(973) 350-0111",
    "companyType": "Distributor",
    "otherActivityNames": ["Custom Manufacturer", "Custom Manufacturer - Instant Quote", "Service Company"],
    "description": "Distributor of hydraulic and lubrication equipment for automotive, marine, refuse, and construction industries. Products include cylinders, pumps, tanks, pullers, punches, presses, tensioners, and stackers.",
    "annualSales": "$5 - 9.9 Mil",
    "numberEmployees": "10-49",
    "yearFounded": null,
    "streetAddress": "1271 McCarter Hwy.",
    "city": "Newark",
    "state": "NJ",
    "zip": "07104",
    "country": "USA",
    "latitude": 40.76718075,
    "longitude": -74.1669765,
    "distanceMiles": null,
    "personnel": [{ "name": "Mike Storch", "title": "President" }],
    "certifications": [{ "title": "Made in the USA", "type": "REGISTRATION", "group": "Made In USA", "scope": null, "date": null, "isActive": true }],
    "certificationTitles": ["Made in the USA"],
    "brandNames": ["Enerpac", "Simplex", "Powerteam"],
    "capabilities": [{ "type": "INDUSTRY", "names": ["Aerospace", "Agriculture", "Automotive"] }],
    "social": [{ "type": "LINKEDIN", "accountId": "2696364?trk=tyah" }],
    "tier": "VERIFIED",
    "isClaimed": true,
    "xometryVerified": false,
    "category": "Hydraulic Cylinders",
    "categoryId": "21650809",
    "searchQuery": "hydraulic cylinders",
    "locationQuery": null,
    "position": 8,
    "scrapedAt": "2026-10-10T05:59:06.772Z"
}
```

#### Key output fields

| Field | Description |
|---|---|
| `tgramsId` | Thomasnet's company id. Stable, so use it to de-duplicate across runs |
| `profileUrl` | The supplier's Thomasnet profile |
| `website`, `phone` | As Thomasnet publishes them. In a test of 735 suppliers, 99% had a phone and 88% a website |
| `personnel` | Named people with titles, where the supplier lists them (about a third of suppliers in that test) |
| `companyType`, `otherActivityNames` | Manufacturer, Distributor, Custom Manufacturer, Service Company and so on |
| `annualSales`, `numberEmployees` | Bands as Thomasnet publishes them, such as `$5 - 9.9 Mil` and `10-49` |
| `streetAddress`, `city`, `state`, `zip`, `latitude`, `longitude` | Flat address fields. The nested `address` object is kept too |
| `distanceMiles` | Filled on ZIP searches, `null` otherwise |
| `certifications`, `certificationTitles` | Each certification with type, group, audit scope and date, plus a plain list of titles |
| `brandNames`, `capabilities`, `families`, `headings` | Brands carried, materials and industries served, product families and every category the supplier is listed under |
| `tier`, `isClaimed`, `xometryVerified` | `VERIFIED`, `REGISTERED` or `NONE`; whether the company claimed its profile |
| `category`, `categoryId` | The category the supplier was found under, or its main category |
| `contactEmail`, `contactWebsite`, `emailEnrichment` | Only with `enrichEmails` |

The row also keeps Thomasnet's own field names (`primaryPhone`, `address`, `heading`, `type`, `otherActivities`, `brands`), so integrations built on earlier versions of this actor keep working.

### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Actor start | $0.005 per GB of run memory, once per run |
| Supplier | $0.001 per row ($1.00 per 1,000) |
| Contact email found | $0.05, only with `enrichEmails` and only when an email is found. It appears on your bill as 50 units of the $0.001 "Additional Data" event |

500 suppliers cost about $0.51. With `enrichEmails`, each supplier an email is found for adds $0.05: 500 suppliers with 200 emails found cost about $10.51. Free Apify accounts can run it too, capped at 100 suppliers per run.

### How it works

The actor calls the data API that Thomasnet's own pages use. A keyword is first matched to categories, whose supplier lists can be read in full. The same keyword then goes through Thomasnet's free-text search once per region. Nothing is rendered in a browser, so a run of several hundred suppliers takes about a minute.

### FAQ

**Do I need a Thomasnet account or cookies?**
No. Earlier versions asked for cookies from a logged-in browser. This one needs nothing; a `cookies` value in an old saved input is ignored.

**Thomasnet says 1,686 results. Why did I get 735?**
Thomasnet shows 25 suppliers per free-text query to visitors who are not logged in. The actor repeats the query in 69 regions to collect far more than 25, but a region with more than 25 matches still shows 25. Category lists have no such limit, so a keyword that matches a category by name returns that whole list.

**How do I get more suppliers for a topic?**
Add related keywords (`hydraulic cylinders`, `hydraulic pumps`, `hydraulic repair`) and raise `maxCategories`. Each keyword and category adds suppliers, and duplicates are dropped.

**Does a state search return only suppliers located in that state?**
It returns suppliers that serve that region, which includes some based elsewhere. For suppliers physically near a place, use a ZIP with a radius and read `distanceMiles`, or filter on `state`.

**Are emails included?**
Thomasnet does not publish them. `enrichEmails` looks for one on each supplier's own website and bills $0.05 only when it finds one.

### Support

Found a bug or need a field added? Open an issue on the actor's [Issues tab](https://apify.com/memo23/thomasnet-scraper/issues) or write to <muhamed.didovic@gmail.com>.

### Additional services

Need a custom export, a recurring feed for your categories, or this data delivered straight into your systems? Email <muhamed.didovic@gmail.com>.

### Explore more scrapers

- [BBB Scraper](https://apify.com/memo23/bbb-scraper): US and Canadian businesses with ratings and contacts
- [Amazon Seller Contact Scraper](https://apify.com/memo23/amazon-sellers-scraper): third-party sellers with business contacts
- [Yelp Scraper](https://apify.com/memo23/yelp-scraper): local businesses with phones and websites

More at [memo23's Apify profile](https://apify.com/memo23).

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor through the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/thomasnet-scraper`).

**Purpose:** US and Canadian industrial suppliers from Thomasnet, by keyword, category or location, one row per supplier with contact, size, personnel and certification fields. No login.

**Minimal input:**

```json
{
  "searchQueries": ["cnc machining"],
  "location": "Ohio",
  "maxItems": 50
}
```

**Output:** one row per supplier: `tgramsId`, `name`, `profileUrl`, `website`, `phone`, `companyType`, `otherActivityNames`, `description`, `annualSales`, `numberEmployees`, `yearFounded`, `streetAddress`, `city`, `state`, `zip`, `country`, `latitude`, `longitude`, `distanceMiles`, `personnel[{name,title}]`, `certifications[...]`, `certificationTitles`, `brandNames`, `capabilities[{type,names}]`, `families`, `headings`, `social`, `tier`, `isClaimed`, `xometryVerified`, `category`, `categoryId`, `searchQuery`, `locationQuery`, `sourceUrl`, `position`, `scrapedAt`; plus `contactEmail`, `contactWebsite`, `emailEnrichment` with `enrichEmails`.

**Behaviors an agent should know:**

- Give `searchQueries` or `startUrls` (or both). `cookies` is not needed and is ignored.
- Always set `maxItems`. A broad keyword with no location can return several hundred suppliers.
- `location` takes a state name or abbreviation, `City, ST`, or a 5-digit ZIP. With a ZIP, `radiusMiles` applies and `distanceMiles` is filled.
- A keyword returns the matching categories' full lists plus up to 25 free-text matches per region. For more, pass several related keywords.
- `tgramsId` is the stable key for de-duplication.
- Billed $0.001 per row, a start fee of $0.005 per GB, and $0.05 per email found when `enrichEmails` is on (charged as 50 `additional-data` units).

### ⚠️ Disclaimer

This actor reads only publicly available business listings from Thomasnet: no login, no private data. You are responsible for using the output in line with Thomasnet's terms and with the marketing, anti-spam and data-protection rules that apply to how you contact the businesses you find. The actor is not affiliated with or endorsed by Thomasnet or Xometry.

### SEO Keywords

thomasnet scraper, thomasnet suppliers scraper, thomasnet api, thomasnet data export, industrial suppliers database, manufacturer leads, b2b supplier leads usa, thomasnet company list, scrape thomasnet without login, manufacturing directory scraper, supplier sourcing data, cnc machining suppliers list

# Actor input Schema

## `searchQueries` (type: `array`):

Products or services to find suppliers for, one per line. Each keyword is matched to Thomasnet categories (verified suppliers, complete lists) and also run through Thomasnet's free-text search in every region. Broad terms return more: "valves" beats "3-inch bronze gate valves". Example: cnc machining.

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

Limit the search to one place: a US state (Texas or TX), a city with its state (Houston, TX) or a 5-digit ZIP (77002). A state or city searches the Thomasnet region(s) that serve it; a ZIP searches by real distance, see "Radius". Leave empty for the whole of the US and Canada.

## `radiusMiles` (type: `integer`):

Used only when the location is a ZIP. Suppliers within this many miles are returned, each with its distance. 5 to 500. Default: 50.

## `startUrls` (type: `array`):

Thomasnet URLs, mixed freely: a search URL (thomasnet.com/suppliers/search?heading=...\&searchterm=...), a category page (thomasnet.com/suppliers/usa/cnc-machining-45330503) or one supplier's profile (thomasnet.com/company/magnatrol-valve-corp-567647/profile). A region or ZIP in the URL is used for that URL.

## `maxItems` (type: `integer`):

Hard cap on suppliers saved in the run. Also capped by your plan (free plan: 100) and by the run's charge limit. Default: 100.

## `maxCategories` (type: `integer`):

How many Thomasnet categories to read for each keyword, best match first. 1 to 10. Default: 3.

## `includeCertifications` (type: `boolean`):

Add each supplier's quality, diversity and registration certifications with type, group, audit scope and date (certifications and certificationTitles). No extra cost. Default: true.

## `enrichEmails` (type: `boolean`):

Thomasnet does not publish emails. When on, the actor reads each supplier's own website (contact and about pages) for an address such as sales@ or info@ and adds contactEmail, contactWebsite and emailEnrichment. Billed $0.05 per supplier an email is found for, and nothing when none is found. Adds a few seconds per supplier. Default: false.

## `proxy` (type: `object`):

Leave empty: no proxy is needed. To send requests through your own proxies, pick "Own proxies" and paste their URLs; Apify Proxy groups set here are ignored.

## Actor input object example

```json
{
  "searchQueries": [
    "cnc machining"
  ],
  "radiusMiles": 50,
  "maxItems": 100,
  "maxCategories": 3,
  "includeCertifications": true,
  "enrichEmails": false
}
```

# 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 = {
    "searchQueries": [
        "cnc machining"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "searchQueries": ["cnc machining"],
    "maxItems": 100,
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/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/UlRjyBtwa2ygisxYx/builds/8maffNzqO6LSsImAt/openapi.json
