# B2B Company Data API - Firmographics and Tech Stack (`nabeelbaghoor/company-technographics-api`) Actor

Search a B2B company database by industry code, employee count, revenue, location, specialties and the technologies a company runs. Returns firmographics plus the detected tech stack. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/company-technographics-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

$12.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

## B2B Company Data API - Firmographics and Tech Stack

Search a B2B company database and export the matches as clean rows, with the firmographics and the technology stack in the same record. Filter by domain, company name, specialties, NAICS and SIC code, country, state, postal code and a radius around it, employee count, annual revenue, and by the technology a company actually runs, at four levels: category, subcategory, product and vendor. You pay only for the companies you actually receive.

This actor is built for technographic targeting, building competitive-displacement lists, account list building, and enriching a CRM with verified firmographics.

### What you can do with it

- Find every company in a market running a specific product, so you can target its users or its competitors.
- Build an ideal customer profile list by industry code, headcount and revenue band.
- Search around a location: a postal code plus a radius in miles.
- Restrict a list to human-verified records only, for outbound where accuracy matters most.
- Pull the full detected technology stack for each account alongside its firmographics.
- Export everything as JSON, CSV or Excel, or push it into a CRM or warehouse.

### Features

- Every documented company filter is a real input field, grouped into company, location, size and revenue, technology, and quality and order.
- The provider's two list separators are handled correctly: ordinary filters are comma joined, and the four technology filters are tilde joined because technology and vendor names contain commas themselves.
- Technology targeting works at all four levels the provider exposes: category, subcategory, product and vendor.
- Page pagination is walked automatically and stops on a short page, on the reported total, or on the provider's 10,000-record depth limit, which is logged rather than hit silently.
- Full pages are always requested, because the provider bills its own credits per page accessed rather than per record.
- The headquarters address is picked out of the address list by the provider's own head-office flag rather than by taking whichever came first, and every address is kept.
- Revenue is exposed three ways where the provider has it: the value used, the actual reported figure and the predicted figure, plus the band label.
- Duplicate companies are removed across pages, keyed on company id then domain then name, before anything is charged.
- The untouched provider payload is kept under `raw`, so nothing is lost.
- Rate limits are handled with retry-after aware backoff, and a run that hits a limit keeps everything already collected.
- Pay-per-result pricing with a hard result cap so a run can never surprise you.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `companyDomains` | array | Company domains to match. The most reliable key. |
| `companyNames` | array | Company names to match. |
| `specialties` | array | Keywords describing what the company does. |
| `naicsCodes` / `sicCodes` | array | Classification codes. |
| `countryCodes` / `states` / `zipCodes` | array | Location filters. |
| `zipCodeRadiusMiles` | integer | Widen the postal code filter by a radius. United States only. |
| `internationalOnly` | boolean | Only companies flagged international. |
| `minEmployees` / `maxEmployees` | integer | Employee count range. |
| `minRevenueMillions` / `maxRevenueMillions` | integer | Revenue range, in millions USD. |
| `techCategories` / `techSubcategories` / `techProducts` / `techVendors` | array | Technographic filters. |
| `verifiedOnly` | boolean | Only human-verified records. |
| `sortBy` / `sortDirection` | string | Order by company name or location, ascending or descending. |
| `rawParams` | object | Any extra query parameter, merged last. |
| `maxResults` | integer | Stop after this many companies (1 to 10,000). |
| `pageSize` | integer | Companies per API call (1 to 50). |
| `apiKey` | string | Your API key. Required, stored securely. |

At least one filter is required.

### Example output

Each dataset item is one company. Fields are populated where the provider has data, and the untouched payload is kept under `raw`:

```json
{
  "companyId": "c_8842197",
  "name": "Example Analytics",
  "displayName": "Example Analytics, Inc.",
  "domain": "example.com",
  "domains": ["example.com", "example.io"],
  "industry": "Computer Software",
  "sector": "Technology",
  "naicsCode": "541511",
  "sicCode": "7372",
  "employees": 310,
  "employeeRange": "201-500",
  "revenue": 44000000,
  "actualRevenue": 44000000,
  "predictedRevenue": 46500000,
  "revenueRange": "$25M-$50M",
  "street1": "88 Example Avenue",
  "street2": "Suite 400",
  "city": "Boston",
  "state": "MA",
  "zip": "02110",
  "country": "US",
  "location": "Boston, MA, US",
  "allAddresses": [
    { "street_1": "88 Example Avenue", "city": "Boston", "state": "MA", "zip": "02110", "country": "US", "is_hq": true }
  ],
  "isInternational": false,
  "specialties": ["revenue forecasting", "subscription analytics"],
  "technologies": ["Salesforce", "HubSpot Marketing Hub", "Snowflake", "dbt"],
  "technologyCount": 4,
  "linkedinUrl": "https://www.linkedin.com/company/example-analytics",
  "logoUrl": "https://logos.example-provider.com/example.com.png",
  "companyStatus": "Active",
  "verified": true,
  "raw": { "company_name": "Example Analytics", "company_domains": ["example.com"] }
}
```

### Pricing and the credit model

This actor uses pay-per-result pricing. You are charged a fixed price for each company delivered to the dataset, after duplicates are removed. A search that matches nothing costs nothing. Set `maxResults` to cap how many rows a run can collect, and set a run spending limit as a second safety net.

Your own provider plan meters separately, and it does so per page accessed rather than per record, with at most 50 records per page. That is why the actor always requests full pages: a page of 5 costs the same as a page of 50. Set `maxResults` to a multiple of your page size to avoid paying the provider for a page you barely use.

### Bring your own API key

This actor connects to a third-party B2B company data provider (SalesIntel) on your behalf and requires your own provider API key. Create a key in the provider's platform and paste it into the `apiKey` input. It is stored securely and never logged, and the actor never ships with or shares credentials.

### Frequently asked questions

#### What data does this actor return?

Company id, name and display name, every known domain, industry and sector with NAICS and SIC codes, employee count and band, revenue as the value used plus the actual and predicted figures and the band label, the headquarters address broken into street, city, state, postal code and country along with every other address on file, whether the company is flagged international, specialties, the full detected technology stack with a count, LinkedIn URL, logo, company status and whether the record is human verified. Every record also carries the untouched provider payload.

#### How does technology targeting work?

Four levels, from broad to specific: category, subcategory, product and vendor. Use category to sweep a whole software class, product to name the exact tool, and vendor to catch every product from one supplier. Check the provider's technology taxonomy reference for the valid values, since these are controlled vocabularies rather than free text.

#### Why are technology filters separated differently from the others?

Because the provider says so, and for a good reason: product and vendor names frequently contain commas, so a comma-separated list would split them in the wrong place. Those four filters use a tilde as the separator instead. The actor handles this for you, whether you type a list or paste a delimited string.

#### What does verified mean?

The provider maintains a human-verified subset of its data alongside the machine-collected records. Turning on `verifiedOnly` restricts results to the verified set, which is smaller but more accurate. Every returned row also carries its own `verified` flag, so you can filter after the fact instead.

#### How does the postal code radius work?

Set one or more postal codes and a radius in miles, and the search widens to everything within that distance. The provider supports this for United States postal codes only, so a radius set alongside non-US codes is ignored by the provider rather than erroring.

#### Why does the run stop at 10,000 records?

The provider limits how deep pagination can go, at 10,000 records, regardless of how many companies match. The log says so explicitly when the limit is reached. Split the search, for example one state or one industry code at a time, to reach past it.

#### How should I set the page size?

Leave it at 50. The provider bills a credit per page accessed rather than per record, so smaller pages cost the same and simply use more of your quota. The only reason to lower it is to reduce response size on a slow connection.

#### Which is the better company key, domain or name?

Domain. It is unique and already standardised, so it matches cleanly. If you only have names, strip suffixes such as Inc, Corp, Co and LLC first, which is what the provider recommends, because those vary between records.

#### How does the actor handle rate limits?

It throttles requests, honours the retry-after signal on a rate-limited response, and backs off exponentially. A response saying the account is out of credits or the endpoint is not licensed stops the run early and keeps everything already collected.

#### How am I charged?

You pay a fixed price per company returned to the dataset. Duplicates are removed before charging and empty runs cost nothing. Use `maxResults` and the run spending limit to control cost.

#### What output formats are available?

The dataset can be exported as JSON, CSV, Excel, HTML or RSS, or read through the API for pushing into a CRM or warehouse.

### Keyword map

b2b company data api, technographic data api, company tech stack api, technology install data, find companies using salesforce, competitive displacement list, firmographic data api, naics code company search, sic code company search, company revenue data api, employee count filter api, verified b2b data, account list building api, ideal customer profile data, crm enrichment api, postal code radius company search, company specialties search, b2b prospecting database, intent and technographic targeting, bulk company export api.

# Actor input Schema

## `companyDomains` (type: `array`):

Company domains to match. A domain is the provider's preferred key because it is already standardised.

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

Company names to match. Names match better with suffixes such as Inc, Corp, Co and LLC removed.

## `specialties` (type: `array`):

Keywords describing what the company does.

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

NAICS classification codes to include.

## `sicCodes` (type: `array`):

SIC classification codes to include.

## `countryCodes` (type: `array`):

Two-letter ISO country codes.

## `states` (type: `array`):

State or region abbreviations as the provider expects them.

## `zipCodes` (type: `array`):

Postal codes to match.

## `zipCodeRadiusMiles` (type: `integer`):

Widen the postal code filter to everything within this many miles. United States postal codes only.

## `internationalOnly` (type: `boolean`):

Only return companies the provider flags as international.

## `minEmployees` (type: `integer`):

Only companies with at least this many employees.

## `maxEmployees` (type: `integer`):

Only companies with at most this many employees.

## `minRevenueMillions` (type: `integer`):

Only companies with at least this much annual revenue, in millions of US dollars.

## `maxRevenueMillions` (type: `integer`):

Only companies with at most this much annual revenue, in millions of US dollars.

## `techCategories` (type: `array`):

Broad technology categories the company uses, for example Analytics or CRM.

## `techSubcategories` (type: `array`):

Narrower technology subcategories.

## `techProducts` (type: `array`):

Specific products the company runs.

## `techVendors` (type: `array`):

Vendors whose products the company runs.

## `verifiedOnly` (type: `boolean`):

Only return records the provider has verified.

## `sortBy` (type: `string`):

Which field to order results by. Leave empty for the provider's default order.

## `sortDirection` (type: `string`):

Ascending or descending. Only applies when a sort field is set.

## `rawParams` (type: `object`):

Any additional query parameter, merged over the ones above. A list value is joined with commas. Use this for a filter the provider adds after this actor was published.

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

Stop after this many company records (1 to 10,000). The provider limits pagination to 10,000 records deep. You are charged per result returned.

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

How many companies to request per API call (1 to 50). The provider charges its own credits per page accessed rather than per record, so a full page of 50 is usually the cheapest choice.

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

Your own API key for the data provider. Required. Stored securely and never logged.

## Actor input object example

```json
{
  "internationalOnly": false,
  "verifiedOnly": false,
  "rawParams": {},
  "maxResults": 100,
  "pageSize": 50
}
```

# 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 = {
    "rawParams": {},
    "maxResults": 100,
    "pageSize": 50
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

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