# Supplier Search API - Find Suppliers by Product and Country (`nabeelbaghoor/supplier-search-api`) Actor

Search a global company database by the products and services a company actually supplies, plus NAICS code, industry, business model, country, employee count, revenue and year founded. Returns firmographics, classifications, contact details and technologies. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/supplier-search-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Business, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$15.00 / 1,000 company 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Supplier Search API

Find suppliers and companies by what they actually make and sell, not just by the industry code someone filed them under.

Most company databases let you filter by industry, headcount and country, which is fine for prospecting and useless for sourcing. This actor searches a global company database by products and services first, then narrows on NAICS code, business model, country, size, revenue and year founded, and returns a flat row per company with firmographics, classifications, contact details and technologies.

### What this actor does

- Searches by **products and services** a company supplies, with any-of, all-of and exclude term lists, and a strictness level that decides how much of the company record is searched.
- Filters on **NAICS 2022 codes**, industry, business category, business model and company type, with exclusion lists for each of the ones that matter most.
- Filters on **structured locations**: a plain country list for whole countries, or country plus region plus city objects when you need a single metro area.
- Filters on **employee count, estimated revenue and year founded**, as a minimum, a maximum, or both ends of a range.
- Returns **contact and web presence**: primary phone, phone list, primary email, email list, website, LinkedIn, Facebook, Twitter, Instagram and YouTube.
- Returns **classification in full**: NAICS primary and secondary, NACE Rev. 2, SIC, ISIC v4, plus business model, target markets, core offerings, technology focus, certification focus and supply chain focus.
- Walks pagination automatically up to your result cap and removes duplicates before charging.

### Input

Every filter is optional, but at least one is required, otherwise the run would ask the provider for the entire database. The most useful starting combination is a product term plus a country.

| Field | What it does |
| --- | --- |
| `productsAny`, `productsAll`, `productsExclude` | Search by supplied products and services |
| `keywordsAny`, `keywordsAll`, `keywordsExclude` | Free-text matching across tags and descriptions |
| `countries`, `locations`, `postcodes` | Where the company is based |
| `naicsCodes`, `industries`, `businessCategories`, `businessModels`, `companyTypes` | Classification filters |
| `employeeCountMin/Max`, `revenueMin/Max`, `yearFoundedMin/Max` | Size, revenue and age ranges |
| `companyNames`, `companyWebsites` | Look up companies you already know |
| `joinOperator` | Combine filters with and (default) or or |
| `rawFilters` | Send a complete filter object of your own |
| `maxResults`, `pageSize` | Result cap and page size |
| `apiKey`, `clientId`, `apiKeyIsAccessToken` | Your own credentials |

### Example output

```json
{
  "companyId": "veridion_id_example",
  "companyName": "Example Precision Components",
  "websiteDomain": "example.com",
  "websiteUrl": "https://example.com",
  "companyType": "private",
  "yearFounded": 1998,
  "employeeCount": 240,
  "employeeCountType": "estimated",
  "estimatedRevenue": 48000000,
  "country": "United States",
  "countryCode": "US",
  "region": "Ohio",
  "city": "Cleveland",
  "address": "1200 Foundry Street, Cleveland, Ohio, 44113, United States",
  "latitude": 41.4993,
  "longitude": -81.6944,
  "numLocations": 3,
  "mainIndustry": "Machinery Manufacturing",
  "naicsPrimaryCode": "332710",
  "naicsPrimaryLabel": "Machine Shops",
  "businessModel": ["manufacturer"],
  "coreOfferings": ["cnc machining", "injection moulding tooling"],
  "certificationFocus": ["ISO 9001", "AS9100"],
  "primaryEmail": "sales@example.com",
  "linkedinUrl": "https://www.linkedin.com/company/example",
  "technologies": ["HubSpot", "Cloudflare"],
  "lastUpdatedAt": "2026-07-30"
}
```

Every row also carries `raw`, the untouched provider record, so nothing is lost by the flattening.

### Pricing

Pay per result. You are charged once per company saved to the dataset, and duplicates are removed before charging. Apify platform usage is included in the per-result price. Your own provider plan is billed separately by the provider.

### Bring your own API key

This actor does not include data access. You use your own credentials from Veridion, which is the provider whose search API this actor calls. Unlike most data APIs it authenticates with OAuth2 client credentials, so you supply a **client id** and a **client secret** rather than a single key, and the actor exchanges them for a one hour access token itself and refreshes it when needed. If you already hold a live access token, paste it into the client secret field and turn on `apiKeyIsAccessToken` to skip the exchange.

### FAQ

#### What is a supplier search API?

A supplier search API is a company search endpoint that indexes what a company supplies, so you can query by product or service rather than only by industry classification. This actor wraps one: you send product terms, classification codes and location filters, and it returns matching companies as structured rows with firmographics, classifications and contact details.

#### How is searching by product different from searching by industry?

An industry code describes the sector a company was registered in. A product search describes what it currently offers. A machine shop, a tooling supplier and a contract manufacturer can share one NAICS code while supplying completely different things, and a product search separates them. Use both together: the classification filter sets the sector, the product filter sets the capability.

#### Can I search a specific city or region rather than a whole country?

Yes. The `countries` field takes plain country names or ISO 3166-1 two letter codes and expands each into the location object the provider expects. For anything narrower, use `locations` and give a JSON array of objects with `country`, and optionally `region` and `city`, for example `[{"country": "US", "region": "California", "city": "San Francisco"}]`.

#### What does match strictness do?

Product and keyword matching run at one of three strictness levels. Level 1 searches business tags only and returns the tightest, most precise set. Level 2 adds page meta information. Level 3 searches every source including full company descriptions and returns the widest set. Start at the default and lower the level if a result set is too loose.

#### How many results can one run return?

Up to 25,000 per run, paged at up to 200 records per request. The provider's published rate limit is one request per second and the actor paces itself just under that, so a large run takes time rather than failing. Set `maxResults` to what you will actually use, because you are charged per result.

#### Which classification systems are returned?

NAICS 2022 primary and secondary codes, NACE Rev. 2, SIC and ISIC v4, each as code plus label, alongside the provider's own main industry, main sector and main business category fields.

#### Do I need my own API key?

Yes. This actor is bring your own key. You need a client id and client secret from the data provider, and your usage is billed on your own provider plan. The actor charges separately for each result it returns.

### Keyword map

supplier search API, supplier discovery API, company search API, B2B company data API, find suppliers by product, NAICS code search API, manufacturer search API, sourcing data API, company firmographics API, procurement data API, supplier database API, company classification API, product and services search, vendor discovery API

# Actor input Schema

## `productsAny` (type: `array`):

Find companies that make, sell or provide any one of these products or services. This is the filter that turns a shopping list into a supplier list, because it searches what a company actually offers rather than only its industry label.

## `productsAll` (type: `array`):

Only return companies matching every one of these products or services. Use this when a supplier has to cover several capabilities at once.

## `productsExclude` (type: `array`):

Drop companies matching any of these terms, which is the quickest way to strip resellers or unrelated lines out of a supplier list.

## `productsStrictness` (type: `string`):

How much of each company record the product terms are matched against. Level 1 searches business tags only and is the most precise. Level 2 adds page meta information. Level 3 searches everything including descriptions and is the widest.

## `keywordsAny` (type: `array`):

Free-text terms where any one is enough to match. Use quotes around a phrase to keep the words together.

## `keywordsAll` (type: `array`):

Free-text terms that must all be present.

## `keywordsExclude` (type: `array`):

Drop companies matching any of these terms.

## `keywordsStrictness` (type: `string`):

How much of each company record the keywords are matched against, on the same 1 to 3 scale as the product strictness.

## `countries` (type: `array`):

Countries to search, either as a full name or an ISO 3166-1 two letter code. Each value is expanded into the location object the provider expects, so plain country names work here.

## `locations` (type: `array`):

Locations with more detail than a country, as a JSON array of objects. Each object takes a country and optionally a region and a city, for example \[{"country": "US", "region": "California", "city": "San Francisco"}].

## `postcodes` (type: `array`):

Postcodes to match, for the headquarters or any branch location.

## `industries` (type: `array`):

Industries to match, using the provider's own industry names.

## `excludeIndustries` (type: `array`):

Industries to leave out.

## `businessCategories` (type: `array`):

Business categories to match, a broader grouping than industry.

## `naicsCodes` (type: `array`):

NAICS 2022 codes to match. Both primary and secondary codes are considered.

## `excludeNaicsCodes` (type: `array`):

NAICS codes to leave out.

## `businessModels` (type: `array`):

Business models to match, for example manufacturer, distributor or service provider, using the provider's own model names.

## `excludeBusinessModels` (type: `array`):

Business models to leave out, which is how you keep resellers out of a manufacturer search.

## `companyTypes` (type: `array`):

Company types to match, using the provider's own type names.

## `employeeCountMin` (type: `integer`):

Only return companies with at least this many employees.

## `employeeCountMax` (type: `integer`):

Only return companies with at most this many employees.

## `revenueMin` (type: `integer`):

Minimum estimated annual revenue, in whole units of the provider's reporting currency (not millions).

## `revenueMax` (type: `integer`):

Maximum estimated annual revenue, in whole units of the provider's reporting currency (not millions).

## `yearFoundedMin` (type: `integer`):

Only return companies founded in or after this year.

## `yearFoundedMax` (type: `integer`):

Only return companies founded in or before this year.

## `companyNames` (type: `array`):

Match specific companies by name.

## `companyWebsites` (type: `array`):

Match specific companies by website. The most reliable company key, because a domain is already standardised.

## `joinOperator` (type: `string`):

How the filters above are combined. And requires every filter to match, which is what you want almost always. Or returns a company matching any single filter and widens the result set sharply.

## `rawFilters` (type: `object`):

A complete filters object that replaces everything above, for query shapes this actor does not model such as nested groups or a filter the provider adds later. Give it as {"and": \[{"attribute": "...", "relation": "...", "value": "..."}]}.

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

Stop after this many companies (1 to 25,000). You are charged per company returned.

## `pageSize` (type: `integer`):

How many companies to request per API call (1 to 200). Larger pages mean fewer calls against your provider rate limit of one request per second.

## `apiKey` (type: `string`):

Your own client secret for the data provider. Required. Stored securely and never logged.

## `clientId` (type: `string`):

The client id that goes with the secret above. Required unless you are pasting an access token you obtained yourself.

## `apiKeyIsAccessToken` (type: `boolean`):

Turn this on if the value in the client secret field is a live bearer token rather than a client secret. The token exchange is then skipped and the value is sent straight through. Tokens last one hour.

## Actor input object example

```json
{
  "joinOperator": "and",
  "maxResults": 100,
  "pageSize": 100,
  "apiKeyIsAccessToken": 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 = {
    "maxResults": 100,
    "pageSize": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/supplier-search-api").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 = {
    "maxResults": 100,
    "pageSize": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/supplier-search-api").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 '{
  "maxResults": 100,
  "pageSize": 100
}' |
apify call nabeelbaghoor/supplier-search-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nabeelbaghoor/supplier-search-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wuz40pS6fcGe9WYYO/builds/xvejlWv3bbnAqNigN/openapi.json
