# Technology Intelligence API - Tech Install and IT Spend (`nabeelbaghoor/technology-intelligence-api`) Actor

Find and enrich companies by the technology they run. Returns installed products and vendors with last verified dates, IT spend by category, firmographics, AI and cloud maturity. Search an install base by vendor, product, industry, country, headcount or revenue. Bring your own key.

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

## Pricing

from $20.00 / 1,000 company enricheds

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/actors/running/actors-in-store.md#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

## Technology Intelligence API - Tech Install and IT Spend

Find the companies running the technology you sell against, and get their installed products, IT spend and firmographics in one row.

### What it does

- **Three ways in, one output shape.** Enrich fills in companies you already have. Search finds companies by the technology they run and by who they are. Match resolves a messy name or domain to the provider's own company identifier. All three write the same columns.
- **Reports installed technology, not just web-detected technology.** Each install carries the product, the vendor, the category, the country, an install intensity and the date it was last verified, which is how a technology profile stays honest about its age.
- **Puts a budget next to the stack.** IT spend broken down by category, a total, and AI spend separately, so an account can be qualified on what it invests rather than only on what it owns.
- **Adds AI and cloud maturity.** Maturity scores and ranks, cloud product counts by provider and the direction those have moved, which is what tells a modernizing account from a static one.
- **Takes names, not identifiers.** The provider filters on its own identifiers for vendors, products, categories and industries. This actor accepts plain names and resolves them through the provider's free catalog, and says in the log when a name could not be resolved rather than quietly widening your search.
- **Searches an install base the way a territory is drawn.** Vendor, product and category filters combined as any, all or none, together with industry, country, headcount and revenue ranges.
- **Says what a run will cost before it spends.** Enrichment costs provider credits and search does not. The provider publishes a free estimate endpoint, and this actor calls it for each batch and reports the running total.
- **Batches to the provider's own ceilings.** 25 companies per enrichment call and 10 per match call, which is also how a large run stays inside a rate limit counted per request rather than per company.
- **Keeps the misses.** A company the provider has no record of still produces a row saying so, and it is not charged for.

### Input

#### Enrich companies you already have

```json
{
  "mode": "enrich",
  "companies": ["cisco.com", "ford.com", "snowflake.com"],
  "fields": ["firmographics", "technographics", "spend"],
  "technologiesPerCompany": 50
}
```

#### Find every large US company running a vendor's products

```json
{
  "mode": "search",
  "vendors": ["Snowflake"],
  "countryCodes": ["US"],
  "minEmployees": 1000,
  "minRevenue": 100000000,
  "enrichSearchResults": true,
  "maxResults": 500
}
```

#### Find companies that run one product but not a competitor's

```json
{
  "mode": "search",
  "products": ["Microsoft Azure"],
  "inclusionMethod": "ALL_PRESENT",
  "countryCodes": ["US", "GB"],
  "enrichSearchResults": false
}
```

#### Resolve messy company names to identifiers

```json
{
  "mode": "match",
  "matchCompanies": [
    { "name": "Ford Motor Company", "domain": "ford.com", "country": "US" },
    { "name": "acme corp" }
  ],
  "matchesPerCompany": 3
}
```

### Example output

One row per company.

```json
{
  "requested": "cisco.com",
  "id": "1698C53EBC888758570396E0334965C1",
  "found": true,
  "name": "Cisco Systems, Inc.",
  "domain": "cisco.com",
  "industry": "Computer Networking",
  "employees": 84900,
  "employeesBand": "10000+",
  "revenue": 57000000000,
  "revenueBand": "$10B+",
  "city": "San Jose",
  "state": "California",
  "country": "United States",
  "countryCode": "US",
  "fortune500Rank": 74,
  "technologyCount": 312,
  "vendors": ["Oracle", "Salesforce", "Amazon Web Services"],
  "products": ["Java", "Salesforce Sales Cloud", "Amazon S3"],
  "productCategories": ["Application Development", "CRM", "Cloud Computing"],
  "installs": [
    {
      "productId": 814,
      "productName": "Java",
      "vendorName": "Oracle",
      "category": "Application Development",
      "countryCode": "US",
      "intensity": 5,
      "lastVerified": "2026-05-20"
    }
  ],
  "totalSpendUsd": 125000,
  "spendByCategory": [{ "category": "Software", "countryCode": "US", "spendUsd": 125000 }]
}
```

### Frequently asked questions

#### How is this different from scraping a website for its technology?

Web detection sees what a site loads in a browser, which is the marketing stack and little else. This provider's data covers technology used behind the firewall as well, sourced beyond page signatures, which is why it can report enterprise databases, data warehouses, networking and infrastructure rather than only tag managers and pixels. Each install also carries a last verified date, so you can tell fresh evidence from old.

#### Can I find every company using a specific product?

Yes, in search mode. Name the vendor, the product or the product category and the search returns the companies running it, narrowed further by industry, country, headcount and revenue. Set how the technology filters combine to require any of them, all of them, or none of them; the last is how you find accounts that have not yet bought a competitor's product.

#### Do I need to know the provider's product identifiers?

No. The provider filters on its own identifiers, but this actor accepts plain names and resolves them through the provider's catalog, which is free and spends no credits. When a name cannot be resolved the run says so in the log and leaves the filter out, rather than silently returning a much larger result set than you asked for. If you already have identifiers, put those in instead and they are used as they stand.

#### What does a run cost in provider credits?

Search, match and the catalog cost no credits. Enrichment does, and the amount depends on which field groups you ask for and how much data comes back. This actor calls the provider's free estimate endpoint before each enrichment batch and reports the running total, so the cost is visible before it is spent. The provider also only charges the first time a company is enriched within a contract period, so re-running the same list later is usually free at their end.

#### How do I keep an enrichment cheap?

Ask for fewer field groups, and cap the technology records per company. A large enterprise can carry hundreds of installs, and the provider charges by what is returned, so a cap of 25 or 50 records is often the difference between a cheap run and an expensive one. Running search with enrichment turned off first, then enriching only the companies you kept, is the other way.

#### What is install intensity?

A measure of how much evidence there is for a technology at a company, rather than a yes or no. Together with the last verified date it is what separates a technology a company clearly runs from one that was seen once.

#### Can I get IT spend by category?

Yes. Add the spend field group and each company carries its spend broken down by category with a total, and AI spend can be requested separately. Spend is an estimate of budget, which is what makes it useful for prioritising accounts by size of opportunity.

#### How far can a search page?

The provider stops paging a search at 25,000 rows. When a run reaches that point it says so and stops, and the fix is to narrow the filters, for example by splitting a country list or a revenue band, and running again.

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

Yes. This actor is bring your own key: it calls the technology intelligence API using your own account key, so you keep your own credit allocation, your own rate limits and your own agreement with the provider. An admin creates the key in the provider's admin console under Settings and API Keys, and a v2 key starts with hg\_v2\_.

#### How much does a run cost here?

Charging is per row. An enriched company carries firmographics, installed technology and spend, and is priced accordingly. A row from a search or a match without enrichment carries identity rather than data, and costs much less. Companies the provider has no record of, and entries this actor refused before sending, are free. Set `maxResults` to cap the rows a run can produce.

### Keyword map

technology intelligence API, technographic data API, install base data, IT spend data API, technology install base search, find companies using a technology, competitive displacement targeting, account based marketing data, firmographic enrichment API, company enrichment by domain, vendor install base, product adoption data, AI maturity score, cloud maturity data, IT budget by category, company match API, domain to company ID, technology adoption research, B2B account intelligence, install base analysis

# Actor input Schema

## `mode` (type: `string`):

Enrich fills in companies you already have. Search finds companies matching filters, which is how an install base or a territory becomes a list, and can fill each one in as it goes. Match resolves a messy company name or domain to the provider's own company identifier. The three read different parts of this form, so fields belonging to another mode are ignored rather than causing an error.

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

Your own account's API key for this provider. An admin creates it in the provider's admin console under Settings and API Keys, and a v2 key starts with hg\_v2\_. Bring your own key: nothing is shared between runs and the key is never written to the dataset.

## `companies` (type: `array`):

One company per line, as a domain such as cisco.com or as one of the provider's own hex company identifiers. Domains and identifiers can be mixed and are sent as separate batches of 25, which is the provider's own ceiling per call.

## `fields` (type: `array`):

Which field groups enrichment should include. Firmographics is the company itself, technographics is the technology it runs, spend is IT budget by category. The provider charges credits according to what is returned, so asking for fewer groups costs less.

## `vendors` (type: `array`):

Vendor names, one per line, for example Oracle, Salesforce or Snowflake. In search mode these find companies running that vendor's products. In enrich mode they narrow the technology returned to those vendors. Names are resolved to the provider's own identifiers through its free catalog, and anything that cannot be resolved is reported in the log rather than silently dropped.

## `products` (type: `array`):

Product names, one per line, for example Salesforce Sales Cloud or Microsoft Azure. Resolved against the provider's own product catalog the same way vendors are.

## `productCategories` (type: `array`):

Product category names, one per line, for example Cloud Computing or Data Warehousing. Useful when you care that a company uses something in a category rather than one specific product.

## `inclusionMethod` (type: `string`):

Whether a company has to run any of the listed technologies, all of them, or none of them. Use all present to find a full stack, none present to find companies that have not bought a competitor's product.

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

Industry names to search within, one per line, resolved against the provider's own industry catalog. Search mode only.

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

Two letter ISO country codes to search within, one per line. Search mode only.

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

Only find companies with at least this many employees. Search mode only.

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

Only find companies with at most this many employees. Search mode only.

## `minRevenue` (type: `integer`):

Only find companies with at least this much annual revenue, in US dollars. Search mode only.

## `maxRevenue` (type: `integer`):

Only find companies with at most this much annual revenue, in US dollars. Search mode only.

## `enrichSearchResults` (type: `boolean`):

Search returns a company name, domain and identifier and costs no provider credits. Turning this on runs enrichment over each result so the rows carry technology, spend and firmographics, which does spend credits. Turn it off to build a cheap list first and enrich it in a second run.

## `installsVerifiedFrom` (type: `string`):

Only return installed technology last verified on or after this date, as YYYY-MM-DD. This is how you exclude detections that have gone stale.

## `installsVerifiedTo` (type: `string`):

Only return installed technology last verified on or before this date, as YYYY-MM-DD.

## `technologiesPerCompany` (type: `integer`):

Cap how many installed technology records come back for each company. A large enterprise can have hundreds, and the provider charges by what is returned, so this is a direct control on credit cost.

## `matchCompanies` (type: `array`):

Companies to resolve to the provider's own identifier, in match mode. Each entry is either a plain name or domain, or an object with name, domain and country, plus an optional customer\_id echoed back so you can join the answer to your own record. Ten go into each request.

## `matchesPerCompany` (type: `integer`):

How many candidate matches to return for each company in match mode, up to 10. More than one is useful when a company name is ambiguous and you want to pick rather than accept.

## `estimateCredits` (type: `boolean`):

Ask the provider what each enrichment batch will cost before sending it, and report the running total in the log. The estimate endpoint is free and spends nothing, so this only costs an extra request per batch.

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

Stop after this many rows. In search mode this is the main control on how much a run costs, both here and in provider credits.

## `requestsPerMinute` (type: `integer`):

How fast this actor calls the provider. The documented limit is 25 requests a second counted per request rather than per company, so batching matters more than pacing here. This is capped at 900 a minute.

## Actor input object example

```json
{
  "mode": "enrich",
  "companies": [
    "cisco.com"
  ],
  "fields": [
    "firmographics",
    "technographics"
  ],
  "inclusionMethod": "ANY_PRESENT",
  "enrichSearchResults": true,
  "matchCompanies": [
    {
      "name": "Ford Motor Company",
      "domain": "ford.com",
      "country": "US"
    }
  ],
  "matchesPerCompany": 1,
  "estimateCredits": true,
  "maxResults": 100,
  "requestsPerMinute": 300
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per company, alongside the domain, identifier or search that produced it.

# 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 = {
    "companies": [
        "cisco.com"
    ],
    "matchCompanies": [
        {
            "name": "Ford Motor Company",
            "domain": "ford.com",
            "country": "US"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/technology-intelligence-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 = {
    "companies": ["cisco.com"],
    "matchCompanies": [{
            "name": "Ford Motor Company",
            "domain": "ford.com",
            "country": "US",
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/technology-intelligence-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "cisco.com"
  ],
  "matchCompanies": [
    {
      "name": "Ford Motor Company",
      "domain": "ford.com",
      "country": "US"
    }
  ]
}' |
apify call nabeelbaghoor/technology-intelligence-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/technology-intelligence-api"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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