Thomasnet Scraper | US Industrial Suppliers avatar

Thomasnet Scraper | US Industrial Suppliers

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Thomasnet Scraper | US Industrial Suppliers

Thomasnet Scraper | US Industrial Suppliers

Scrape Thomasnet (www.thomasnet.com) US industrial B2B suppliers via keyword search, heading categories, and company profiles. Extract tgramsId, location, sales, employees, capabilities, and profile URLs. Export Excel, CSV, or JSON. Unofficial — not affiliated with Thomas Publishing / Thomasnet.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

4

Total users

1

Monthly active users

7 days ago

Last modified

Share

Thomasnet Scraper | US Supplier Phones & Street

Scrape Thomasnet US industrial B2B suppliers — public phones and street addresses, heading categories, and company profiles — then download structured manufacturer data as Excel, CSV, or JSON.

Use this Actor as a practical Thomasnet data API for US supplier discovery, procurement shortlists, industrial market research, and lead enrichment. Guest search and company-profile pages already show plaintext phones and street + unit. Emails are usually absent on those guest surfaces (emails=[] with leadAbsences.emails=本站无) — this Actor does not invent mailboxes. Choose a mode, set a keyword / heading / company URL, and get Dataset rows with tgramsId, company name, phones, street, sales band, employee count, capabilities, headings, and profile URLs.

  • Scrape supplier keyword search (/suppliers/search)
  • Browse heading / category lists (/suppliers/usa/{slug}-{headingId})
  • Pull company profile pages (/company/{slug}-{tgramsId}/profile)
  • Optional browse mode to walk the category tree: sub-categories at upper levels, headings at the leaves (names only — no company phones). Pass a category slug back as query to go one level down.
  • Extract tgramsId, name, website, phones, street, city/state/zip, annualSales, numberEmployees, yearFounded, capabilities, headings, tier flags
  • Defaults: enrichDetails: true, includeStreet: true, redactPhones: false (plaintext primaryPhone + phones[])
  • One billed entity per Dataset row: suppliers use rowType: "supplier" and each embedded supplier product uses rowType: "product"
  • Optional zip + radius and filterIds
  • Export to Excel / CSV / JSON, or connect Make, n8n, Zapier, Python, or the Apify API
  • Pay per event — Actor start + each Dataset result; platform usage is included (you do not pay separate Apify compute on top)

Unofficial tool. This Actor is not affiliated with, endorsed by, or sponsored by Thomas Publishing / Thomasnet.com. It collects publicly reachable listing and profile surfaces and does not log in, auto-click Contact Supplier / Claim / Register / Sign In, or access private accounts. You do not bring a proxy — the hosted worker reads Thomasnet's own public GraphQL endpoint directly.


What does the Thomasnet Scraper do?

Thomasnet Scraper lets you extract structured US industrial supplier data from www.thomasnet.com without running your own anti-bot browser fleet. Give it a keyword (e.g. precision castings, cnc machining), a heading slug + id, or a company profile URL / tgramsId, then start a run.

Under the hood, the Actor:

  1. Validates your input (mode, query, heading, company identifiers)
  2. Enforces free-tier caps when you are on a free Apify plan
  3. Reads the same public data Thomasnet's website loads, from its GraphQL endpoint (no browser, no proxy)
  4. Normalizes supplier / company rows into a clean Dataset, including Lead / Contact fields
  5. Writes suppliers and products as separate Dataset rows, then stores INPUT_ECHO, RUN_SUMMARY (and ERROR_SUMMARY on failure)

You run it like any other Apify Actor — schedule it, call it from the API, or plug it into automations.


What Thomasnet data can I extract?

DataSupplier searchHeading listCompany profileBrowse
tgramsId / profile URL✅✅✅—
company name✅✅✅heading titles
website✅✅✅—
city / state / zip✅✅✅—
annualSales / employees / yearFounded✅✅✅—
capabilities / headings✅✅✅heading links
tier / advertiser / claimed flags✅✅✅—
primaryPhone + phones[] (plaintext)✅✅✅—
address.street / unit✅✅✅—
person (name + role)list: 本站无; enrich onlist: 本站无; enrich onoptional—
emails[]本站无本站无本站无本站无
web.website✅✅✅—

redactPhones defaults false — you get the real number (sample: Boker's (612) 729-9365). includeStreet defaults true (sample: 3104 Snelling Ave). enrichDetails defaults true so list rows pick up profile personnel when Thomasnet publishes it. Contact Supplier / Claim / Register are never auto-clicked.


Lead / Contact fields

Every Dataset item carries the following contact / clue keys. Empty top-level lead keys are paired with a leadAbsences reason (本站无 / 闸门锁 / 未验证) so you know why a field is missing.

FieldTypeMeaning on Thomasnet
phones[{value, type, e164?}]Guest-visible landline from SSR primaryPhone (search/heading cards and company profile). Sample: Magister (973) 344-5313; WRK smoke: Boker's (612) 729-9365 / e164 +16127299365. List cards have no tel: in the DOM; the number is already in __NEXT_DATA__.
emails[{value, type}]本站无 on guest search and guest company profile. There is no email / primaryEmail key and no mailto:. Always emails=[] with leadAbsences.emails=本站无. Do not invent addresses from video copy or the company website.
address{street, unit, locality, region, postalCode, country, full}Street + unit from address.address1 / address2 (e.g. Magister street 45 Montgomery street, unit Unit A, Belleville NJ 07109). WRK smoke: Boker's street 3104 Snelling Ave, unit null.
geo{lat, lng}address.latitude / longitude in addition to street, not instead (Boker's 44.941…, -93.223…).
person{name, role?}First personnel[] entry on the company profile (name + title). Optional — can be null + leadAbsences.person=本站无 (e.g. Modern Fluid Power). List cards have no personnel until enrichDetails (default on). Sample: Boker's Pete Flodquist / Sales Manager; recon: Alex Konotopov / General Manager.
org{name, id?}Company name + tgramsId (Boker's 1160254).
web{website, socials[]}website is filled when the listing publishes it. web.socials[] is often empty even when the raw social[] array has LinkedIn: Thomasnet stores the URL in social[].accountId (not url), so the mapped web.socials list may stay []. Use raw social[] for LinkedIn / Facebook / Twitter / YouTube. Some profiles have social: null.
leadSourceenumsearch (browse headings) | detail (supplier / enriched profile).
leadRevealenumvisible when phones[] is non-empty (number already in SSR). absent on browse (no company phones) or when the card has no number. Not xhr — see Reveal cost.
leadAbsencesobjectPer-subfield reason. Guest supplier rows: emails=本站无. Browse heading rows: phones / emails / street / person = 本站无.

Legacy primaryPhone, website, and address.address1 / city / state / zip stay on the row so older Dataset views keep working.

Reveal cost

enrichDetails defaults on and enriches the same supplier rows without adding billed rows. By default, supplier modes return one Dataset row per supplier and do not request product lists. Turn on includeProducts to add one row per supplier product; every added product row is billed, and supplier plus product rows share that input's maxResults budget. Supplier rows keep a source-provided productCount when available and never embed a products list. Product rows copy the supplier id, name, profile URL, and location. In catalog mode, catalog items are the searched entities and remain rows whether includeProducts is on or off.

On the page itself there is no click-to-unlock XHR for phones:

  • Numbers are already in SSR JSON (primaryPhone) and, on the profile, in tel: hrefs.
  • The View Phone Number button is Google Analytics only (Phone_Number_Revealed). It does not open an overlay, does not call /graphql for a new number, and does not change the digits. The worker does not click it — there is no extra click cost for phones.
  • Never Contact Supplier / Claim / Register / Sign In. Those flows are not a lead channel for this Actor.

The hosted worker calls Thomasnet's public GraphQL endpoint directly. You do not pass proxyUrl or bring your own proxy.

Pages follow each input's maxResults budget (catalog 30 per page, enumerate 25 per page); maxPages above 1 caps them. Guest limits: keyword search returns up to 25 suppliers per keyword, heading lists up to 50 (pages 1–2).

Honest limitations

  • Guest emails are 本站无. Search cards and company profiles have no mailbox field and no mailto:. Clicking View Phone Number does not reveal email either. Do not treat video descriptions (e.g. a sales@… string inside a factory-tour caption) as a structured email field.
  • Browse mode has no company phones, emails, or street — category and heading names only. leadAbsences records 本站无. Do not use a browse run as a contact-quality check.
  • person is optional. Profiles without personnel[] return person.name=null and leadAbsences.person=本站无.
  • web.socials[] may be empty while social[] has LinkedIn. Read social[].accountId (example: Boker's http://www.linkedin.com/company/bokers/). Do not assume web.socials is always filled.
  • JSON-LD is not the phone source. Company LocalBusiness JSON-LD can have street and no telephone. Home-page JSON-LD is Thomas / Xometry platform HQ, not a supplier. The worker uses __NEXT_DATA__.
  • No login, no RFQ. Whether Contact Supplier after login adds email or a second phone is 未验证 and will not be auto-clicked.
  • You do not bring a proxy. The worker reads the public GraphQL endpoint directly; there is nothing to configure.
  • Contact fields are not redacted by default (redactPhones: false). Set redactPhones: true only if you want primaryPhone masked; phones[] stays plaintext for outreach. Empty means the public page did not publish that subfield (see leadAbsences).

Why scrape Thomasnet?

Thomasnet is a major US industrial B2B directory covering manufacturers, custom fabricators, distributors, and service providers across metals, plastics, machining, electronics, and more. Teams scrape Thomasnet for supplier discovery, procurement shortlists, competitor monitoring, and industrial lead generation:

  • Monitor keyword supplier search results for a commodity or process
  • Follow heading categories (e.g. CNC Machining, Precision Castings) with stable heading IDs
  • Pull company profiles with public phones, street + unit, sales bands, employee counts, and capability tags
  • Optionally filter by ZIP + radius or pass-through filterIds
  • Feed CRM, BI dashboards, Google Sheets, BigQuery, or AI agents with clean rows

Compared with generic URL scrapers, this Actor returns Thomasnet-specific fields (tgramsId, heading IDs, sales/employee bands, capability tags) across search, heading, company, and browse modes.


More Actors like this

Need another B2B marketplace, industrial directory, or a different vertical? Use a dedicated Actor below for structured fields. Use this Actor for Thomasnet (www.thomasnet.com) US industrial suppliers.

Similar e-commerce & B2B scrapers

Prefer another specialized scraper?

If your target has a specialized Actor below, use that first — usually cheaper and more structured than a generic scrape.

Jobs & Freelance

Real Estate

Travel & Stays

Social & Content

Ads Intelligence

Local & Maps

General Tools

→ See the full catalog in Related Actors below, or browse apify.com/lentic_clockss.


How to scrape Thomasnet (no code required)

  1. Create a free Apify account
  2. Open Thomasnet Scraper
  3. Choose a mode: supplier_search, heading, company, browse, enumerate, or catalog
    • enumerate sweeps the full company directory (26 letter buckets + a symbol bucket — ~23K companies) via the /browse index; use query like A,B to restrict to letters and maxResults to cap rows.
    • catalog deep-pages product-catalog results (totalCount is not guest-capped the way company search is); rows carry catalogId/thomasUrl plus the supplier's tgramsId/website.
    • Optional fields projects output and plans worker collection surfaces precisely — e.g. ["tgramsId","name","website"] skips detail enrichment entirely; ["*"] requests the full catalog (introspect via worker GET /v1/fields).
  4. Enter a query (e.g. precision castings) — or headingSlug + headingId, or a companyUrl / tgramsId
  5. Leave enrichDetails and includeStreet on (defaults). Leave redactPhones off unless you want primaryPhone masked. Optionally set zip / radius, maxResults / maxPages
  6. Click Start and download the Dataset as JSON, CSV, Excel, or JSONL

Start with maxResults: 5–15 to verify the query, then scale up.


How much does it cost to scrape Thomasnet?

This Actor uses pay-per-event pricing. You are charged for:

EventPrice
Actor Start (apify-actor-start)$0.005 per start
Result (apify-default-dataset-item)$3.00 / 1,000 results ($0.003 each on FREE/BRONZE)

Platform usage costs are included — you do not pay separate Apify compute/proxy usage for this Actor on top of the event prices above (User pays platform usage costs = No).

Volume discount tiers (per result)

Tier$/1,000per result
FREE*$3.00$0.003
BRONZE$3.00$0.003
SILVER$2.60$0.0026
GOLD$2.20$0.0022
PLATINUM$2.00$0.002
DIAMOND$1.60$0.0016

*FREE matches BRONZE for this Actor.

Example cost estimates (FREE/BRONZE)

Results collectedApprox. event cost*
100~$0.31
1,000~$3.01
10,000~$30.01

*Assumes one Actor start at default memory billing for start events, plus $0.003 per Dataset item. Exact start billing can scale with allocated memory (one start event per GB, minimum one).

Free plan limits

On a free Apify plan, this Actor enforces developer limits of 10 runs and 200 results for the whole run. Upgrade to a paid Apify plan for unlimited runs (event prices still apply). These limits are set by the Actor developer, not by Apify.

maxResults is the row limit for each input, not one shared limit for the whole run. Each value in searchQueries, startUrls, or detailUrls gets its own budget; a scalar query, company, heading, browse category, or enumerate selection counts as one input. The default is 70. Larger values continue in parts of up to 70 through the existing cursor, while the complete run also stops at your maximum total charge. Supplier and product row types share the applicable input budget.


Input examples

{
"mode": "supplier_search",
"query": "precision castings",
"maxResults": 20,
"maxPages": 1,
"enrichDetails": true,
"includeStreet": true,
"redactPhones": false
}

Heading / category list

{
"mode": "heading",
"headingSlug": "cnc-machining",
"headingId": "45330503",
"maxResults": 25
}

Company profile

{
"mode": "company",
"companyUrl": "https://www.thomasnet.com/company/electro-plastics-30989688/profile"
}
{
"mode": "supplier_search",
"query": "sheet metal fabrication",
"zip": "44114",
"radius": "50",
"maxResults": 15
}

Output example

{
"recordType": "supplier_enriched",
"tgramsId": "1160254",
"name": "Boker's, Inc.",
"title": "Boker's, Inc.",
"url": "https://www.thomasnet.com/company/boker-s-inc-1160254/profile",
"website": "https://www.bokers.com/",
"annualSales": "$25 - 49.9 Mil",
"numberEmployees": "100-199",
"yearFounded": "1919",
"primaryPhone": "(612) 729-9365",
"phones": [{ "value": "(612) 729-9365", "type": "landline", "e164": "+16127299365" }],
"emails": [],
"address": {
"street": "3104 Snelling Ave",
"unit": null,
"locality": "Minneapolis",
"region": "MN",
"postalCode": "55406",
"country": "USA",
"full": "3104 Snelling Ave, Minneapolis, MN, 55406, USA"
},
"geo": { "lat": 44.94125611, "lng": -93.2233606 },
"person": { "name": "Pete Flodquist", "role": "Sales Manager" },
"org": { "name": "Boker's, Inc.", "id": "1160254" },
"web": { "website": "https://www.bokers.com/", "socials": [] },
"social": [
{ "type": "LINKEDIN", "accountId": "http://www.linkedin.com/company/bokers/" }
],
"leadSource": "detail",
"leadReveal": "visible",
"leadAbsences": { "emails": "本站无" },
"source": "thomasnet.com"
}

web.socials is empty here on purpose — the LinkedIn URL lives on raw social[].accountId. Guest emails stay [] with leadAbsences.emails=本站无. Common fields also include capabilities, headings, and tier / advertiser flags when present on the page.


Coverage matrix

DimensionCoverage
Marketusa (www.thomasnet.com)
Modessupplier_search · heading · company · browse · enumerate · catalog
List/suppliers/search · /suppliers/usa/{slug}-{headingId}
Detail/company/{slug}-{tgramsId}/profile
PaginationFollows maxResults; search 25 per keyword, heading 50, catalog and enumerate page through
EnrichenrichDetails default true → company profile person / raw social[] on list rows
Geooptional zip + radius
Filtersoptional filterIds[] passthrough
Leadphones + street on search/heading/company; emails 本站无; browse = category and heading names only

FAQ

Is this affiliated with Thomasnet?

No. This is an unofficial third-party Actor. It is not affiliated with, endorsed by, or sponsored by Thomas Publishing / Thomasnet.

Do you collect emails or click Contact Supplier?

Emails: guest search and guest company profiles are 本站无 (emails=[], leadAbsences.emails=本站无). There is no mailbox field and no mailto:. The Actor does not invent emails.

Clicks: it does not auto-click Contact Supplier, Claim, Register, Sign In, or View Phone Number.

Phones: redactPhones defaults false. You get plaintext primaryPhone and phones[]. View Phone Number is analytics-only — the digits are already in SSR, so there is no extra click cost for phones.

Why is pagination limited?

Set maxResults and the Actor pages for each input: catalog and enumerate read as many pages as needed, keyword search is capped at 25 suppliers per keyword and heading lists at 50 for guests. Use several searchQueries to give each keyword its own row budget.

Do I need to bring a proxy?

No. The worker uses Thomasnet's public GraphQL endpoint, which needs no proxy. Do not pass proxy credentials in Actor input.

Can I use this from the API / Standby?

Yes. Use normal Actor runs for production Dataset output. Standby exposes lightweight /health, /input-example, /openapi.json, and optional preview routes — see the Standby OpenAPI schema packaged with the Actor.

What are the free plan limits?

You get up to 10 runs of this Actor and 200 results across each run (limits set by the Actor developer). Paying Apify users are not capped by those run quotas; PPE event prices and your maximum total charge still apply.


Tips for better runs

  • Prefer specific industrial keywords (precision castings, cnc machining) over single vague words
  • Keep maxResults modest first; keyword search returns up to 25 suppliers per keyword
  • Leave enrichDetails on (default) when you want profile person / social[] on list rows; turn it off only for thin cards
  • Leave includeStreet on (default) so address.street / unit stay on the row
  • Leave redactPhones off (default) for outreach numbers
  • For headings, pass both headingSlug and headingId when you have them
  • Do not use mode=browse as a phone/street quality check — it returns category and heading names only
  • Do not reuse README sample inputs for acceptance tests — use fresh random-valid queries

Integrations

  • Apify API / client — start runs and pull Dataset items programmatically
  • Schedules — re-run keyword monitors daily/weekly
  • Webhooks — notify your stack when a run finishes
  • Make / Zapier / n8n — push rows to Sheets, CRM, Slack, or warehouses

Standby (Live view)

When Standby is enabled:

  • GET / / GET /health — Actor readiness (no scrape)
  • GET /input-example — safe low-cost example input
  • GET /openapi.json — OpenAPI document
  • POST /search — optional Live-view preview (capped maxResults); persist production results with a normal Actor run

Full jobs should be launched as normal Apify Actor runs so Dataset rows plus INPUT_ECHO, RUN_SUMMARY, and ERROR_SUMMARY are persisted.


Runtime

SettingValue
Default memory1024 MB
Timeout default3600 s
StandbyEnabled (lightweight Live-view)
Free plan caps10 runs / 200 results across each run

All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.

Jobs & Freelance

Real Estate

E-commerce

Travel & Stays

Social & Content

Ads Intelligence

Local & Maps

General Tools

→ Browse the full profile: apify.com/lentic_clockss