ThomasNet Scraper - Suppliers, Manufacturers & Company Data
Pricing
from $1.00 / 1,000 supplier results
ThomasNet Scraper - Suppliers, Manufacturers & Company Data
Scrape ThomasNet suppliers and manufacturers by keyword, category, location, certification or company type, or paste profile URLs. Get one rich record per company with contacts, certifications, products, locations, coordinates, social links, sales data and more.
Pricing
from $1.00 / 1,000 supplier results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
7 days ago
Last modified
Categories
Share
ThomasNet Scraper: Suppliers, Manufacturers and Contacts
ThomasNet Scraper turns the ThomasNet industrial directory into structured supplier data. Search by keyword, product category, US state or province, ZIP plus radius, certification or company type, or paste company-profile and search URLs directly. Get one rich, flat record per company: certifications, products, personnel, addresses with geo coordinates, social links, annual sales, headcount and more, merged from the listing and the full company profile. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- One rich record per company. The directory listing and the full company profile are merged into one flat record, so every field the company publishes lands in the same shape.
- Certifications, products, personnel and locations. Captures certification badges, product and family listings, personnel names and titles, addresses with geo coordinates, and social links.
- Dual mode. Run keyword or category searches with filters, or scrape specific company-profile and search URLs you paste.
- Precise filtering. Narrow results by US state or province, ZIP plus radius, certification, and company type, with global company-name sorting.
- Full-profile enrichment on demand. Turn on company-profile enrichment to add products, certification totals, families, news, brand and affiliation details beyond the base listing.
- Resume or monitor. Resume a previous run, or track recurring supplier changes with NEW, UPDATED and optional UNCHANGED labels.
- Fails loudly when blocked. A refused connection stops the run with a clear error instead of quietly returning an empty dataset.
Use Cases
- Sales and business development teams: build targeted outreach lists of manufacturers or distributors in a state or ZIP radius.
- Sourcing and procurement teams: find suppliers holding a specific certification, such as ISO 9001, for a product category.
- Market researchers: size a product category by counting active suppliers and compare how listings change over time.
- Lead-generation agencies: run a saved search on a schedule and collect only the new or updated suppliers each time.
- Competitive intelligence teams: watch a competitor's profile page for changes to its products, certifications or headcount.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
name | "Acme Valve Corp." |
tgramsId | "00000000" |
tier | "VERIFIED" |
type | "M" |
primaryPhone | "+1 000-000-0000" |
website | "https://example.com/" |
annualSales | "$10 - 24.9 Mil" |
numberEmployees | "10-49" |
yearFounded | "1971" |
heading | { "headingId": "00000000", "name": "Valves" } |
address | { "city": "Anytown", "state": "OH", "latitude": 0.0, "longitude": 0.0 } |
personnel | [ { "name": "Jane Doe", "title": "Owner" } ] |
certifications | [ { "id": "000000", "title": "ISO 9001", "type": "QUALITY", "isActive": true } ] |
certificationTotals | [ { "type": "DIVERSITY", "count": 3 } ] (full-profile only) |
families | [ { "id": "000000", "name": "Valves" } ] (full-profile only) |
products | [ { "id": "0000.0000", "name": "Ball valves", "type": "CATEGORY" } ] (full-profile only) |
social | [ { "accountId": "sample-company", "type": "LINKEDIN" } ] |
logoUrl | "https://example.com/logo.jpg" |
description | "Manufacturer of ball, check and gate valves." |
url | "https://www.thomasnet.com/company/acme-valve-corp-00000000/profile" |
scrapedAt | "2026-01-01T00:00:00+00:00" |
Every record also carries isClaimed, isAdvertiser, xometryVerified, otherActivities, locationTypes, and, for multi-location companies, mainLocationName and mainLocationTgramsId. Flat convenience fields (addressLine1, city, stateCode, stateName, zip, country, latitude, longitude) duplicate the nested address block for easier CSV export. Company personnel carry only a name and title; ThomasNet's directory does not expose a personal email or direct phone per contact, so those are never returned. With full-profile enrichment on, a record can also carry additionalInformation, brands, headingBrands, whitepapers, videos, news, otherHeadings and affiliation fields when the company publishes them; unavailable fields stay null so the record shape never changes.
How to Use
- Pick a mode:
search(keyword or category) orurl(scrape pasted company-profile or search URLs). - For search mode, enter your terms and any filters (state, ZIP plus radius, certification, company type, sort order). For URL mode, paste the links.
- Turn Fetch full company profiles on or off, and set Max items to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Basic keyword search with full profiles:
{"mode": "search","queries": ["valves", "industrial pumps"],"fetchDetails": true,"maxItems": 20,"proxy": { "useApifyProxy": true, "apifyProxyGroups": [] }}
Filtered search (manufacturers in Ohio, sorted by name):
{"mode": "search","queries": ["cnc machining"],"state": "OH","companyType": "M","sortBy": "company_az","maxItems": 20,"proxy": { "useApifyProxy": true, "apifyProxyGroups": [] }}
Scrape a specific company profile:
{"mode": "url","urls": ["https://www.thomasnet.com/company/acme-valve-corp-00000000/profile"],"fetchDetails": true,"proxy": { "useApifyProxy": true, "apifyProxyGroups": [] }}
Recurring supplier monitoring:
{"mode": "search","queries": ["valves"],"fetchDetails": true,"maxItems": 20,"incrementalMode": true,"stateKey": "valve-monitor","emitUnchanged": false}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/thomasnet-supplier-scraper").call(run_input={"mode": "search", "queries": ["valves"]})for company in client.dataset(run["defaultDatasetId"]).iterate_items():print(company["name"], company["primaryPhone"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/thomasnet-supplier-scraper').call({ mode: 'search', queries: ['valves'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Result limits, sorting and enrichment billing
maxItems limits saved companies across the run; maxPages limits result pages per search (empty or 0 is unlimited; it does not cap items). Name sorting reads every matching company before returning results in global A-Z or Z-A order, and fails clearly if your page ceiling prevents a complete sort. Relevance ordering can return the first matching results without reading the complete directory. States split into two source regions are queried together, so a page can contain up to 50 companies before deduplication; the overall item cap still applies. Company-type filters match both a supplier's primary and secondary business activities, while the output keeps the original primary type.
In search mode, Fetch full company profiles controls both whether each company's full profile is fetched and whether the run is charged for it. In url mode, a pasted company-profile link is always fetched at its full profile depth regardless of this toggle; the toggle there only decides whether that fetch is billed as detail enrichment. Pasted search URLs inside url mode behave like search mode: the toggle controls both the fetch and the charge.
Resume and recurring updates
To continue a previous run, set resumeFromRunId to that run's ID and keep the same search or URLs. Previously saved suppliers are skipped before enrichment and do not consume the new run's item limit. Pagination continues past pages that contain only previously saved suppliers. The check covers the selected run's dataset only, not every earlier run in a chain.
For daily or weekly monitoring, enable incrementalMode. The first run saves suppliers as NEW. Later runs save NEW and UPDATED suppliers; changedFields lists the top-level fields that changed. Enable emitUnchanged to also save UNCHANGED suppliers, billed the same as any other saved result. Scrape timestamps never count as a content change. firstSeenAt and lastSeenAt record when the campaign first and most recently observed each supplier. These four fields (changeType, changedFields, firstSeenAt, lastSeenAt) are added only in incremental mode; this actor does not track or report missing suppliers as expired or reappeared.
In incremental mode, maxItems limits suppliers checked, including unchanged ones, so a run can save fewer items than the limit, or zero when nothing changed. Use maxItems: 0 to check every matching supplier within your page limit. Each Apify user's monitoring state is separate. Reuse the same search, filters and enrichment settings for consistent comparisons; a stateKey names a campaign, or leave it empty for an automatically derived scope. Resume and incremental mode can be combined: the selected prior run's suppliers are skipped before the remaining ones are compared.
Send results into your apps (MCP connectors)
Connect one or more MCP servers in the mcpConnectors field to push the scraped companies straight into your own tools after the run finishes. Supported servers include Notion, Linear, Airtable and Apify. For Notion, set notionParentPageUrl to the page under which a results database should be created, and use maxNotifyListings to cap how many companies are exported. Export is a side channel: it never changes the dataset and never fails the run.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | select | "search" | search (keyword/category) or url (scrape pasted URLs). Required. |
queries | array | ["valves"] | Search mode. One or more keywords or product categories. |
state | string | no default | Search mode. Two-letter US state or Canadian province code to narrow by location. |
zip | string | no default | Search mode. ZIP or postal code to center a radius search. |
radius | integer | no default | Search mode. Distance in miles around the ZIP. Applies only with a ZIP set. |
certification | string | no default | Search mode. Restrict to suppliers holding a certification, e.g. ISO 9001. |
companyType | select | "" (Any) | Search mode. Filter by supplier type: manufacturer, distributor, service provider, custom manufacturer, or sales/rep. |
sortBy | select | "relevance" | Result order: relevance, or company name A-Z / Z-A. |
urls | array | no default (prefill: one sample company-profile URL) | URL mode. Company-profile or search URLs to scrape. Search-mode filter fields are ignored. |
fetchDetails | boolean | true | Enrich each company with its full profile. In url mode, a pasted company-profile link is fetched at full depth regardless of this setting; it controls billing there, not the fetch. |
maxPages | integer | no default | Safety ceiling on result pages per search. Empty or 0 is unlimited. Does not cap items. |
maxItems | integer | 20 | Maximum companies to save across the run. 0 is unlimited. In incremental mode, also caps companies checked, including unchanged ones. |
resumeFromRunId | string | no default | A previous run ID from this actor; skip its saved supplier IDs before enrichment. |
incrementalMode | boolean | false | Compare suppliers with the previous campaign baseline and save NEW or UPDATED records. |
stateKey | string | no default | Optional name for a recurring monitoring campaign. Leave empty for an input-derived scope. |
emitUnchanged | boolean | false | Incremental mode only. Also save UNCHANGED suppliers, billed like any other saved result. |
proxy | object | { "useApifyProxy": true, "apifyProxyGroups": [] } | Connection settings. |
mcpConnectors | array | no default | MCP connectors (Notion, Linear, Airtable, Apify) to export results into. |
notionParentPageUrl | string | no default | Notion connector only: page under which a results database is created. |
maxNotifyListings | integer | no default | Cap on how many companies are pushed to connected MCP apps. |
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"__typename": null,"additionalInformation": null,"address": {"address1": "1 Example Way","address2": null,"address3": null,"city": "Anytown","state": "OH","stateName": "Ohio","zip": "00000","zip4": null,"country": "USA","county": null,"latitude": 0.0,"longitude": 0.0},"ads": null,"affiliatedMemberOf": null,"affiliationCompanyLabel": null,"affiliationContactUrl": null,"affiliationFeaturedMembers": null,"annualSales": "$10 - 24.9 Mil","brands": null,"catalogType": null,"certificationTotals": [{ "type": "DIVERSITY", "count": 3 }],"certifications": [{"id": "000000","code": "ISO9001","title": "ISO 9001","type": "QUALITY","tier": null,"isActive": true}],"companyAd": null,"description": "Manufacturer of ball, check, gate and butterfly valves.","descriptionByCompany": null,"families": [{ "id": "000000", "name": "Valves" }],"heading": {"headingId": "00000000","name": "Valves","naturalName": "Valves","familyName": "Flow Control","familyId": "0000","description": null,"url": null},"headingBrands": null,"headings": [{ "headingId": "00000000", "name": "Valves", "familyName": "Flow Control", "description": null, "url": null }],"isAdvertiser": false,"isAffiliationPage": null,"isClaimed": true,"isMultiLocation": null,"locationTypes": null,"locations": null,"logoTitle": null,"logoUrl": "https://example.com/logo.jpg","mainLocationName": null,"mainLocationTgramsId": null,"name": "Acme Valve Corp.","news": null,"numberEmployees": "10-49","otherActivities": null,"otherHeadings": null,"personnel": [{ "name": "Jane Doe", "title": "Owner" }],"premiums": null,"primaryPhone": "+1 000-000-0000","products": [{ "id": "0000.0000", "name": "Ball valves", "type": "CATEGORY" }],"social": [{ "accountId": "sample-company", "type": "LINKEDIN" }],"tgramsId": "00000000","tier": "VERIFIED","type": "M","videos": null,"website": "https://example.com/","whitepapers": null,"xometryVerified": false,"yearFounded": "1971","slug": "acme-valve-corp-00000000","searchMode": "url","sourceUrl": "https://www.thomasnet.com/company/acme-valve-corp-00000000/profile","url": "https://www.thomasnet.com/company/acme-valve-corp-00000000/profile","scrapedAt": "2026-01-01T00:00:00+00:00","addressLine1": "1 Example Way","city": "Anytown","stateCode": "OH","stateName": "Ohio","zip": "00000","country": "USA","latitude": 0.0,"longitude": 0.0}
Plan Requirement
An Apify account is required. This source generally needs residential-grade proxy access; if your account is not entitled to it, the actor automatically falls back to an alternate connection so the run can still complete, though coverage may be reduced. Usage is billed per the actor's active pricing shown in the Pricing tab. Use Max items to cap the cost of any run.
FAQ
How much does it cost?
This actor is pay per event: a run start charge, a charge per supplier saved to the dataset, and an optional detail-enrichment charge per company when full-profile enrichment is used. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape ThomasNet?
This actor collects only publicly available supplier directory data. You are responsible for how you use it: follow ThomasNet's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution, particularly around personal data such as named contacts.
Can I get only new or changed suppliers on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Track changes across recurring runs. Each run then returns only new and updated suppliers; unchanged ones are skipped and not billed unless you also enable Include unchanged suppliers.
Why didn't "Fetch full company profiles" change my pasted URL's fields?
In url mode, a pasted company-profile link is always fetched at full profile depth, because that is the exact page you asked for. The toggle only decides whether the run is billed for that enrichment, not whether it happens. Search mode is different: there, the toggle controls both the fetch and the charge.
Why did my run fail instead of returning an empty dataset?
If the connection to ThomasNet is refused before any page can be read, such as a rejected proxy tunnel or every request being denied, the run stops with a clear error instead of finishing with zero rows, so "no suppliers matched" is never confused with "nothing could be read". A genuinely empty search still succeeds normally and just reports that nothing matched. If source access needs to recover, the message tells you to retry in about 24 hours; otherwise, try again shortly.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 Want more leads data?
Pair this actor with these related scrapers from the same team:
| 📇 BetaList Scraper Scrape BetaList.com startup profiles with founder and contact enrichment. Extract startup... | 💼 RepVue Scraper Scrape RepVue company profiles, RepVue Score, sales-rep reviews, and compensation by role... |
| 💼 Workday Jobs Scraper Scrape job postings from any Workday-hosted careers site on Myworkdayjobs.com. Paste... | 🏨 Comparably From $1/1K. Extract rich company data from comparably.com using company names or profile... |
| 💼 Gupy Jobs Scraper Scrape public jobs from Gupy.io by keyword, state, city, workplace type, job type... | 📇 JobStreet From $1/1K. Pull JobStreet company profiles and employee reviews across Malaysia... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.