# ThomasNet Suppliers Scraper (`automation-lab/thomasnet-scraper`) Actor

Extract US B2B industrial supplier data from ThomasNet — the largest industrial directory in North America. Get company details, certifications, locations, and contacts for lead-gen and procurement research.

- **URL**: https://apify.com/automation-lab/thomasnet-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ThomasNet Suppliers Scraper

Extract US B2B industrial supplier data from [ThomasNet](https://www.thomasnet.com) — the largest industrial supplier directory in North America with 500,000+ manufacturers and distributors. Get company details, certifications, locations, and contact data at scale for lead generation, market research, and procurement intelligence.

### 🏭 What does ThomasNet Suppliers Scraper do?

ThomasNet Suppliers Scraper extracts structured supplier data from ThomasNet's US B2B industrial directory. You provide search queries (e.g. "CNC machining", "injection molding"), category page URLs, or direct supplier profile URLs — and the scraper returns a clean dataset of matching suppliers with their contact details, certifications, industry classifications, and company metadata.

**Key capabilities:**
- 🔍 Search by product/service keyword (e.g. "sheet metal fabrication", "precision casting")
- 📂 Scrape entire ThomasNet category pages for bulk supplier lists
- 🏢 Scrape individual supplier profiles for maximum data completeness
- 📍 Filter by US state (e.g. only California or Texas suppliers)
- 🔄 Automatic retry with fresh sessions to handle anti-bot protection
- 🌐 US residential proxy routing for maximum success rate

### 👥 Who is ThomasNet Suppliers Scraper for?

Who is it for? Anyone who needs structured US industrial supplier data at scale.

**B2B Sales & Business Development Teams** prospecting US manufacturers for outbound campaigns — get verified phone numbers, websites, and descriptions for thousands of industrial companies in minutes instead of hours of manual research.

**Procurement & Sourcing Analysts** building approved vendor lists or comparing supplier capabilities across industrial categories — certifications (ISO 9001, AS9100, ITAR), employee counts, and year established help you pre-qualify vendors before RFQs.

**Market Intelligence Researchers** mapping the competitive landscape in a manufacturing vertical — identify who the key players are, where they're located, how large they are, and what diversity certifications they hold.

**M&A and Private Equity** analysts running preliminary company research on US industrial targets — ThomasNet has rich operational data (revenue bands, ownership type, certifications) that's hard to get from other sources.

**Recruiting & Staffing Agencies** identifying manufacturers in specific geographies or industries to target with workforce solutions.

### 🚀 Why use ThomasNet Suppliers Scraper?

- **Real data at scale** — ThomasNet has 500,000+ verified US industrial suppliers; manually copying data from their website is not viable for any meaningful research volume
- **No API needed** — ThomasNet doesn't offer a public API; this scraper is the only automated way to extract their data
- **Comprehensive fields** — company name, phone, website, address (city/state/zip), description, year established, employee count, revenue band, certifications, industries served, and diversity ownership flags (minority/woman/veteran-owned)
- **Battle-tested extraction** — uses advanced browser automation with stealth techniques and US residential proxies to bypass DataDome anti-bot protection

### 📋 Data extracted

| Field | Description | Example |
|-------|-------------|---------|
| `companyName` | Full company name | `"Acme Machining Co."` |
| `profileUrl` | ThomasNet profile URL | `"https://www.thomasnet.com/profile/acme/12345/"` |
| `companyId` | ThomasNet internal company ID | `"12345"` |
| `phone` | Business phone number | `"(614) 555-0123"` |
| `website` | Company website URL | `"https://acmemachining.com"` |
| `streetAddress` | Street address | `"123 Industrial Blvd"` |
| `city` | City | `"Columbus"` |
| `state` | US state abbreviation | `"OH"` |
| `zip` | ZIP code | `"43215"` |
| `country` | Always "US" | `"US"` |
| `description` | Company capabilities summary | `"Custom CNC turning and milling..."` |
| `yearEstablished` | Year founded | `"1982"` |
| `employeeCount` | Employee range | `"50 - 99"` |
| `annualRevenue` | Revenue band | `"$10M - $24.9M"` |
| `ownershipType` | Ownership structure | `"Private"` |
| `certifications` | List of certifications | `["ISO 9001:2015", "AS9100D"]` |
| `industriesServed` | Industries this supplier serves | `["Aerospace", "Defense", "Medical"]` |
| `productsServices` | Products/services offered | `["CNC Machining", "Turning", "Milling"]` |
| `logoUrl` | Company logo image URL | `"https://cdn.thomasnet.com/logos/..."` |
| `minorityOwned` | Minority-owned business flag | `false` |
| `womanOwned` | Woman-owned business flag | `true` |
| `veteranOwned` | Veteran-owned business flag | `false` |
| `totalReviews` | Number of ThomasNet reviews | `12` |
| `rating` | ThomasNet rating (0-5) | `4.8` |
| `searchQuery` | The query that returned this result | `"CNC machining"` |
| `sourceUrl` | URL that was scraped | `"https://www.thomasnet.com/products/?what=CNC+machining"` |

### 💵 How much does it cost to scrape ThomasNet suppliers?

ThomasNet Suppliers Scraper uses **pay-per-supplier** pricing — you pay only for the data you receive:

| Usage tier | Price per supplier |
|---|---|
| First 1,000 (FREE tier) | ~$0.0092 |
| 1,001–10,000 (BRONZE) | $0.008 |
| 10,001–50,000 (SILVER) | $0.00624 |
| 50,001–200,000 (GOLD) | $0.0048 |
| 200,001–500,000 (PLATINUM) | $0.0032 |
| 500,001+ (DIAMOND) | $0.00224 |

Plus a small **start fee of $0.005** per run (covers proxy setup).

**Example costs:**
- 100 suppliers from a "CNC machining" search → ~$0.93
- 500 suppliers across 5 search queries → ~$4.05
- 5,000 suppliers for a full vertical analysis → ~$40.50

The scraper uses residential proxies (required for ThomasNet), which are the primary cost driver — this is reflected in the per-supplier price.

### ▶️ How to use ThomasNet Suppliers Scraper

1. **Open the actor** at [apify.com/automation-lab/thomasnet-scraper](https://apify.com/automation-lab/thomasnet-scraper)
2. **Choose your input method:**
   - **Search queries**: Enter keywords like "injection molding" or "stainless steel fittings"
   - **Category URLs**: Paste ThomasNet category page URLs directly
   - **Supplier URLs**: Paste individual supplier profile URLs for detailed extraction
3. **Set max suppliers** per query (start with 20 to test)
4. **Optional: filter by state** (e.g. "CA" for California suppliers only)
5. **Run the actor** — expect 1-3 seconds per supplier
6. **Download results** as JSON, CSV, or Excel from the dataset

**Tips for best results:**
- Use specific product/service terms: "titanium CNC machining" beats "machining"
- ThomasNet categories are more reliable than keyword searches for bulk scraping
- Set `maxResults` to 50-100 for initial exploration, then scale up

### ⚙️ Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | string[] | `["CNC machining"]` | Search terms to look up on ThomasNet |
| `categoryUrls` | string[] | `[]` | ThomasNet category page URLs |
| `supplierUrls` | string[] | `[]` | Direct supplier profile URLs |
| `maxResults` | integer | `20` | Max suppliers per query (1–500) |
| `stateFilter` | string | `""` | US state code filter (e.g. "TX") |
| `proxyCountry` | string | `"US"` | Proxy country (keep as US) |
| `maxRequestRetries` | integer | `3` | Retry attempts per page |

### 📤 Output format

Each supplier is saved as a JSON object to the default dataset. Example output:

```json
{
  "companyName": "Midwest Precision Parts",
  "profileUrl": "https://www.thomasnet.com/profile/midwest-precision-parts/99887766/",
  "companyId": "99887766",
  "phone": "(312) 555-0198",
  "website": "https://midwestprecisionparts.com",
  "streetAddress": "400 W. Madison St.",
  "city": "Chicago",
  "state": "IL",
  "zip": "60606",
  "country": "US",
  "description": "ISO 9001:2015 certified CNC machining shop specializing in tight-tolerance aerospace components. 3-axis and 5-axis milling, turning, and grinding capabilities.",
  "yearEstablished": "1978",
  "employeeCount": "50 - 99",
  "annualRevenue": "$10M - $24.9M",
  "ownershipType": "Private",
  "certifications": ["ISO 9001:2015", "AS9100D"],
  "industriesServed": ["Aerospace", "Defense", "Medical Devices"],
  "productsServices": ["CNC Machining", "5-Axis Milling", "Precision Turning"],
  "logoUrl": "https://cdn.thomasnet.com/logos/99887766.jpg",
  "minorityOwned": false,
  "womanOwned": false,
  "veteranOwned": true,
  "totalReviews": 5,
  "rating": 4.6,
  "searchQuery": "CNC machining",
  "sourceUrl": "https://www.thomasnet.com/products/?what=CNC%20machining&pg=1"
}
````

### 💡 Tips for successful scraping

🔑 **Use specific search terms** — "aluminum die casting Ohio" returns more targeted results than "casting"

📄 **Category URLs work better at scale** — Browse ThomasNet to find the right category, then paste the URL. Category pages are more structured and pagination works predictably.

⏱️ **Be patient with large runs** — Each supplier takes 1-4 seconds including proxy routing. A run of 500 suppliers typically takes 10-20 minutes.

🌍 **State filtering saves time and money** — If you only need suppliers in specific states, use `stateFilter` to skip irrelevant results early.

🔄 **Retry logic is built in** — The actor automatically retries with fresh browser sessions if a page fails. Don't reduce `maxRequestRetries` below 3.

📊 **Start small and scale** — Run 20-50 suppliers first to verify the data quality meets your needs before running thousands.

### 🔗 Integrations

#### Google Sheets / Airtable (no-code)

Export your dataset as CSV from the Apify console and import directly into Google Sheets or Airtable for manual review and enrichment. Filter by state, certifications, or employee count using spreadsheet formulas.

#### CRM (Salesforce, HubSpot)

Use Apify's [Make (formerly Integromat)](https://www.make.com) or Zapier integrations to push each scraped supplier directly into your CRM as a new company/account record. Map `companyName` → Company, `phone` → Phone, `website` → Website URL.

#### Email Enrichment

Combine ThomasNet data with an email finder tool — use `companyName` and `website` to look up decision-maker emails via Apollo, Hunter.io, or Clearbit Enrichment. Build targeted outbound lists in minutes.

#### Procurement Qualification Workflows

Feed extracted `certifications` and `industriesServed` fields into your vendor qualification logic to automatically shortlist ISO 9001-certified suppliers in specific industries for RFQ distribution.

#### Market Intelligence Dashboards

Schedule weekly runs with consistent search queries and push results to a database (PostgreSQL, BigQuery) to track which new suppliers appear in your target categories, monitor industry consolidation, and identify acquisition targets.

### 🖥️ API usage

Use ThomasNet Suppliers Scraper programmatically via the Apify API:

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('automation-lab/thomasnet-scraper').call({
    searchQueries: ['CNC machining', 'injection molding'],
    maxResults: 50,
    stateFilter: 'CA',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted ${items.length} suppliers`);
items.slice(0, 3).forEach(s => {
    console.log(`${s.companyName} | ${s.city}, ${s.state} | ${s.phone}`);
});
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token='YOUR_API_TOKEN')

run = client.actor('automation-lab/thomasnet-scraper').call(run_input={
    'searchQueries': ['sheet metal fabrication', 'precision casting'],
    'maxResults': 100,
    'stateFilter': 'TX',
})

dataset = client.dataset(run['defaultDatasetId'])
for item in dataset.iterate_items():
    print(f"{item['companyName']} | {item.get('city')}, {item.get('state')} | {item.get('phone')}")
```

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~thomasnet-scraper/runs?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQueries": ["plastic injection molding"],
    "maxResults": 25,
    "stateFilter": "OH"
  }'
```

### 🤖 MCP (AI assistant) integration

Use ThomasNet Suppliers Scraper directly from Claude, Cursor, or VS Code via the [Model Context Protocol](https://mcp.apify.com).

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/thomasnet-scraper"
```

#### Claude Desktop / Cursor / VS Code

Add to your MCP config file (`~/.cursor/mcp.json` or `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=automation-lab/thomasnet-scraper",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}
```

**Example prompts:**

> "Find 20 ISO 9001-certified CNC machining suppliers in Ohio using ThomasNet and save them to a spreadsheet"

> "Search ThomasNet for injection molding companies in California, return their phone numbers and websites"

> "Build a list of 50 woman-owned manufacturing suppliers in Texas from ThomasNet"

### ⚖️ Is scraping ThomasNet legal?

Legality overview: web scraping publicly available data from B2B directories is generally considered lawful for commercial research purposes. ThomasNet publishes supplier information for the express purpose of connecting buyers with suppliers. Key considerations:

- **Only public data** — This scraper only collects data visible without logging in (no account required)
- **Robots.txt** — The scraper respects ThomasNet's crawl guidelines for commercial data extraction
- **No personal data** — ThomasNet supplier profiles contain business contact information, not personal private data
- **Commercial use** — Consult your legal counsel before using scraped data in customer-facing products

Always comply with ThomasNet's [Terms of Service](https://www.thomasnet.com/legal/terms-of-use/) and applicable data privacy laws in your jurisdiction.

### ❓ FAQ

**Q: Why does my run return 0 results?**
A: ThomasNet uses DataDome anti-bot protection that requires US residential proxies to bypass. The actor automatically uses Apify's residential proxy pool — make sure your Apify plan includes residential proxy access. If results are still 0, try running again (proxy routing can occasionally fail on the first attempt).

**Q: How many suppliers can I scrape per run?**
A: There's no hard limit per run — set `maxResults` as high as you need (up to 500 per query). For very large runs (1000+ suppliers), we recommend splitting across multiple runs or using category URLs which are more reliable for pagination.

**Q: Why does the scraper use residential proxies?**
A: ThomasNet employs DataDome anti-bot protection that blocks standard datacenter IP addresses. US residential proxies appear as regular home internet users, which bypasses this protection. This is why the per-supplier price is slightly higher than plain HTTP scrapers.

**Q: Can I scrape supplier contact emails?**
A: ThomasNet sometimes shows contact email addresses on supplier profiles. When visible, the `contactEmail` field will be populated. However, most suppliers hide their email behind ThomasNet's RFQ system — the `phone` and `website` fields are more reliably populated.

**Q: What does the state filter do?**
A: Setting `stateFilter: "TX"` means only suppliers whose ThomasNet profile shows a Texas address will be included. Suppliers that match your search query but are in other states will be skipped (not charged). This is useful for regional sourcing.

**Q: How do I scrape a specific ThomasNet category?**
A: Navigate to ThomasNet and browse to the category you want (e.g. Aerospace Machining), then copy the URL from your browser and paste it into `categoryUrls`. Example: `https://www.thomasnet.com/products/aerospace-machining-0.html`

**Q: Is the data real-time?**
A: Yes — each run fetches live data directly from ThomasNet. There's no caching between runs.

### 🔗 Related scrapers

Looking for more B2B and industrial directory data? Check out our other automation-lab scrapers:

- [automation-lab/yellow-pages-scraper](https://apify.com/automation-lab/yellow-pages-scraper) — US business directory with broader coverage across all industries
- [automation-lab/linkedin-company-scraper](https://apify.com/automation-lab/linkedin-company-scraper) — LinkedIn company profiles for firmographic enrichment
- [automation-lab/google-maps-scraper](https://apify.com/automation-lab/google-maps-scraper) — Local business data with reviews and contact info

# Actor input Schema

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

List of product or service search terms (e.g. "CNC machining", "stainless steel fittings", "injection molding"). One search term per line.

## `categoryUrls` (type: `array`):

ThomasNet category page URLs to scrape (e.g. https://www.thomasnet.com/products/cnc-machining-0.html).

## `supplierUrls` (type: `array`):

Direct ThomasNet supplier profile URLs to scrape for detailed data.

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

Maximum number of suppliers to extract per search query or category. Lower numbers are faster and cheaper.

## `stateFilter` (type: `string`):

Filter suppliers by US state abbreviation (e.g. "CA", "TX", "NY"). Leave empty for all states.

## `proxyCountry` (type: `string`):

Country code for residential proxy. ThomasNet is US-only — keep this as US.

## `maxRequestRetries` (type: `integer`):

Maximum number of retry attempts if a page fails to load.

## Actor input object example

```json
{
  "searchQueries": [
    "CNC machining"
  ],
  "categoryUrls": [],
  "supplierUrls": [],
  "maxResults": 20,
  "proxyCountry": "US",
  "maxRequestRetries": 3
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "CNC machining"
    ],
    "categoryUrls": [],
    "supplierUrls": [],
    "maxResults": 20,
    "stateFilter": "",
    "proxyCountry": "US",
    "maxRequestRetries": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/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"],
    "categoryUrls": [],
    "supplierUrls": [],
    "maxResults": 20,
    "stateFilter": "",
    "proxyCountry": "US",
    "maxRequestRetries": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/thomasnet-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
  ],
  "categoryUrls": [],
  "supplierUrls": [],
  "maxResults": 20,
  "stateFilter": "",
  "proxyCountry": "US",
  "maxRequestRetries": 3
}' |
apify call automation-lab/thomasnet-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/thomasnet-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ThomasNet Suppliers Scraper",
        "description": "Extract US B2B industrial supplier data from ThomasNet — the largest industrial directory in North America. Get company details, certifications, locations, and contacts for lead-gen and procurement research.",
        "version": "0.1",
        "x-build-id": "pfeYhqLRNzyIcijWb"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~thomasnet-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-thomasnet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation-lab~thomasnet-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-thomasnet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation-lab~thomasnet-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-thomasnet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "🔍 Search queries",
                        "type": "array",
                        "description": "List of product or service search terms (e.g. \"CNC machining\", \"stainless steel fittings\", \"injection molding\"). One search term per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categoryUrls": {
                        "title": "📂 Category URLs",
                        "type": "array",
                        "description": "ThomasNet category page URLs to scrape (e.g. https://www.thomasnet.com/products/cnc-machining-0.html).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "supplierUrls": {
                        "title": "🏢 Supplier profile URLs",
                        "type": "array",
                        "description": "Direct ThomasNet supplier profile URLs to scrape for detailed data.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "📊 Max suppliers per query",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of suppliers to extract per search query or category. Lower numbers are faster and cheaper.",
                        "default": 20
                    },
                    "stateFilter": {
                        "title": "📍 State filter (US only)",
                        "type": "string",
                        "description": "Filter suppliers by US state abbreviation (e.g. \"CA\", \"TX\", \"NY\"). Leave empty for all states."
                    },
                    "proxyCountry": {
                        "title": "🌐 Proxy country",
                        "type": "string",
                        "description": "Country code for residential proxy. ThomasNet is US-only — keep this as US.",
                        "default": "US"
                    },
                    "maxRequestRetries": {
                        "title": "🔄 Max retries per page",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum number of retry attempts if a page fails to load.",
                        "default": 3
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
