# Account Intelligence API - Technographics and Contacts (`nabeelbaghoor/account-intelligence-api`) Actor

Profile companies by the technology they use, their IT spend band, buying signals, funding, partners and hiring, and find the people inside them. Search contacts by job title, department, seniority, time in role, company size, revenue, industry and technology. Bring your own key.

- **URL**: https://apify.com/nabeelbaghoor/account-intelligence-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Lead generation, Business, Developer tools
- **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 profile returneds

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

## Account Intelligence API - Technographics and Contacts

Profile a company by the technology it runs, what it spends on IT, who it partners with and what it is signalling, then find the people inside it worth talking to.

### What it does

- **Three ways in, one dataset.** Profile companies you already have, look up contacts from a work email, or search for people you do not have yet. All three write into the same dataset, so an account list and its contacts sit together.
- **Reads the technology profile, not just a tag list.** Technology count, top vendors and top categories with relative strength, recently seen products with first seen and last verified dates and a high, medium or low usage level, plus cloud adoption, SaaS adoption and IT footprint scores.
- **Puts a budget band on the account.** An estimated annual IT spend range, which is the qualifier that matters for a technology sale and is filterable in a people search.
- **Scores buying signals.** An overall signal score with an intensity level and a breakdown by signal type, covering news and events, hiring and team changes, technology usage and funding.
- **Describes the market position.** Capabilities, industries served with their share, partner organizations and the products the company integrates with, which is how you find channel and integration plays rather than only direct ones.
- **Counts the hiring.** Open jobs and people profiles by region and job function, so growth and where it is happening are visible on the account row.
- **Finds people by role and by employer at once.** Job title, department, seniority, keywords, location and years in current role, combined with the employer's industry, size, revenue, IT spend band, technologies in use and account fit.
- **Targets recent movers.** The years in current role filter singles out people under a year into a job, who tend to re-evaluate what they inherited.
- **Waits out a search properly.** People discovery runs as a job at the provider, so the run submits it, reports what it is waiting for, and pages the results out when it finishes. The job identifier is logged, and results stay available at the provider for 30 days.
- **Keeps the misses.** A company or a person nobody could match still produces a row saying so, and it is not charged for.

### Input

#### Profile a list of companies

```json
{
  "mode": "organizations",
  "solutionId": "00000000-0000-0000-0000-000000000000",
  "organizations": ["snowflake.com", "cisco.com"],
  "maxResults": 100
}
```

#### Find decision makers at companies running a technology

```json
{
  "mode": "discover",
  "solutionId": "00000000-0000-0000-0000-000000000000",
  "jobTitles": ["IT Manager", "Director of IT"],
  "departments": ["Information Technology"],
  "seniorities": ["Director", "VP"],
  "yearsInCurrentRole": ["<1", "1-3"],
  "technologies": ["Salesforce"],
  "employeeRanges": ["200-500", "500-1000"],
  "itSpendRanges": ["1M-5M", "5M-25M"],
  "requireEmail": true,
  "resultsPerAccount": 5,
  "maxResults": 500
}
```

#### Look up contacts you already have

```json
{
  "mode": "people",
  "people": ["person@example.com"],
  "requireEmail": true,
  "validateEmail": true
}
```

### Example output

A company row and a person row.

```json
{
  "requested": "snowflake.com",
  "orgId": "3b0f7f5e-0000-0000-0000-000000000000",
  "found": true,
  "name": "Snowflake Inc.",
  "domain": "snowflake.com",
  "industry": "Technology",
  "employees": 7000,
  "revenueRangeLow": "1000M",
  "country": "United States",
  "city": "Bozeman",
  "linkedinUrl": "https://www.linkedin.com/company/snowflake-computing",
  "fundingStage": "Public",
  "openJobs": 412,
  "technologyCount": 186,
  "itSpendRangeLow": "100M",
  "itSpendRangeHigh": "500M",
  "topVendors": ["Amazon Web Services", "Microsoft", "Salesforce"],
  "topTechnologyCategories": ["Cloud Computing", "CRM", "Business Intelligence"],
  "recentTechnologies": [
    { "product": "Amazon S3", "category": "Cloud Storage", "vendor": "Amazon Web Services", "firstSeen": "2021-03", "lastVerified": "2026-07", "usage": "High" }
  ],
  "buyingSignalScore": 74,
  "buyingSignalIntensity": "High",
  "buyingSignalTypes": ["Hiring & Team", "Technology Usage"]
}
```

```json
{
  "personId": "9f0c1a2b-0000-0000-0000-000000000000",
  "found": true,
  "fullName": "Jane Doe",
  "title": "Director of IT",
  "seniority": "Director",
  "jobFunctions": ["Information Technology"],
  "email": "jane.doe@example.com",
  "phone": "+1 415 555 0123",
  "linkedinUrl": "https://www.linkedin.com/in/example-person",
  "companyName": "Example Inc.",
  "companyDomain": "example.com",
  "country": "United States",
  "yearsInRole": 1
}
```

### Frequently asked questions

#### What is a solution identifier and do I need one?

A subscription holds one or more solutions, each a saved targeting configuration for a particular initiative, and most accounts scope their API queries to one. The identifier is a UUID you take from the provider application. If your results come back empty or unauthorized and the key is definitely right, a missing or wrong solution identifier is the usual cause.

#### Can I find people at companies that use a specific technology?

Yes, and that is the point of discover mode. Put the technology in the technologies filter and the search returns people whose current employer uses it, narrowed further by job title, department, seniority, time in role, and the employer's size, revenue, industry and IT spend band.

#### How do I find people who recently changed jobs?

Set years in current role to under a year. A person new in a role is usually re-examining the tools they inherited, which makes them a better first conversation than someone five years into the same job.

#### What technology detail comes back on a company?

The number of technologies detected, up to ten top vendors and ten top categories each with a relative strength score, and up to ten recently seen products with the vendor, the category, the month first seen, the month last verified and a high, medium or low usage level. Alongside those are adoption scores for cloud, SaaS and overall IT footprint, and an estimated annual IT spend range.

#### What are buying signals?

A score out of 100 with a high, medium or low intensity, broken down by signal type: news and events, hiring and team changes, technology usage, and funding and advancements. It is a way of ordering an account list by which companies are moving rather than by which are largest.

#### Why did a person come back as not found when I know they exist?

Two likely reasons. If you turned on the requirement for an email address or a phone number, the provider answers that the person exists but does not carry what you required, and this actor records that as a miss with the reason rather than as a row without contact details. The other reason is that the record is keyed on a work email address, so a personal address will not resolve.

#### How long does a people search take?

It runs as a job at the provider. Small searches usually finish in under a minute and large ones take longer. The run polls until it is done, reports what it is waiting for, and pages the results out. If it runs past the wait you allow, the job identifier is in the log and the provider keeps its results for 30 days.

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

Yes. This actor is bring your own key: it calls the account intelligence API using your own subscription key, so you keep your own credits, your own rate limits and your own data agreement. The provider issues keys through its support team rather than self service.

#### How much does a run cost?

Charging is per row. A company profile carries firmographics, technology, spend, signals and market presence, and is priced accordingly. A contact row costs less. Companies and people the provider has no record of, people without the contact detail you required, and entries this actor refused before sending are all free. Note that the provider also spends its own credits per record, and only for contacts that are new to your subscription.

#### What are the rate limits?

The provider allows 1000 requests a minute and blocks a key for the remainder of the window when that is passed. This actor paces itself at 300 a minute by default and is capped at 900, and it waits out the window rather than hammering it when a limit is hit.

### Keyword map

account intelligence API, technographics API, company technology profile, IT spend data, buying signals API, intent signals by account, B2B contact search API, find contacts by technology, install base targeting, ideal customer profile data, account fit scoring, company firmographics API, funding stage data, partner and integration data, hiring signals by company, job openings by region, contact enrichment by email, work email lookup, seniority and department filters, new in role prospecting

# Actor input Schema

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

Organizations profiles companies you already have. People fills in contacts you already have from a work email address. Discover searches for people you do not have yet, using person filters and company filters together. 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, issued by its support team on request. Bring your own key: nothing is shared between runs and the key is never written to the dataset.

## `solutionId` (type: `string`):

The UUID of the solution to run these queries under. A subscription has one or more solutions, each holding its own targeting configuration, and most accounts require one. Take it from the provider application. Leave it empty only if your subscription does not use solutions.

## `organizations` (type: `array`):

Companies to profile, one per line, as a domain such as example.com or as one of the provider's own organization UUIDs. A full URL works and is reduced to its domain.

## `people` (type: `array`):

People to look up, one per line, as a work email address or as one of the provider's own person UUIDs. Anything that is neither is refused before it is sent, so it costs nothing.

## `jobTitles` (type: `array`):

Job titles to find, one per line, in discover mode. A person matching any of them is returned, and partial titles work, so Manager matches IT Manager and Procurement Manager.

## `departments` (type: `array`):

Departments to find people in, using the provider's own department names. A value outside this list is ignored rather than rejected, which is why these are a dropdown.

## `seniorities` (type: `array`):

Seniority bands to match with the person's current employer, using the provider's own vocabulary.

## `yearsInCurrentRole` (type: `array`):

How long the person has held their current role. Under a year is often the strongest buying signal a contact carries, because a new owner tends to re-evaluate what they inherited.

## `personLocations` (type: `array`):

Where the person is, one per line. Use company locations instead if you care where their employer is based rather than where they are.

## `personKeywords` (type: `array`):

Extra keywords to narrow a people search, one per line.

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

Limit a people search to these employers, one domain per line. This is how you work an account list rather than a market.

## `companyIds` (type: `array`):

Limit a people search to these companies by the provider's own organization UUIDs, one per line.

## `companyLocations` (type: `array`):

Headquarters locations of the person's current employer, one per line.

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

Industries of the person's current employer, one per line, for example Technology, Healthcare or Accounting.

## `technologies` (type: `array`):

Only find people whose employer uses these technologies, one per line, for example AWS, Salesforce or OpenAI. This is the filter that turns a contact list into a displacement or integration play.

## `employeeRanges` (type: `array`):

Employee bands of the person's current employer, using the provider's own bands.

## `revenueRanges` (type: `array`):

Annual revenue bands of the person's current employer, in US dollars, using the provider's own bands.

## `itSpendRanges` (type: `array`):

Estimated annual IT spend bands of the person's current employer, using the provider's own bands. A budget filter rather than a size filter, which is usually the better qualifier for a technology sale.

## `accountFit` (type: `array`):

Filter to companies matching an account fit band, which only works if account fit is configured in your provider settings. High fit accounts are the ones matching your ideal customer profile.

## `requireEmail` (type: `boolean`):

Return a person only when an email address is available for them. In people mode this turns a record with no email into a not found answer rather than a row without contact details.

## `requirePhone` (type: `boolean`):

Return a person only when a phone number is available for them.

## `validateEmail` (type: `boolean`):

Ask the provider to validate an email address before returning it. Slower, and worth it when the list is going straight into a sending tool.

## `onlyNewContacts` (type: `boolean`):

Leave out people already redeemed through the provider application, your CRM or an earlier API call, so a repeat search returns only what is new. Credits are charged for net new contacts either way.

## `resultsPerAccount` (type: `integer`):

Cap how many people come back from any one company in discover mode. Without it a single large employer can fill the whole result set.

## `pollIntervalSeconds` (type: `integer`):

Discover mode runs as a job at the provider. This is how often the run asks whether it has finished.

## `maxWaitMinutes` (type: `integer`):

How long to wait for a discover job before giving up. The job identifier is written to the log either way, and the provider keeps its results for 30 days, so nothing is lost by stopping early.

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

Stop after this many rows. In discover mode this is also sent to the provider as the search ceiling, which the provider caps at 10000 per search.

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

How fast this actor calls the provider. The documented limit is 1000 a minute, and passing it blocks the key for the rest of the window, so this is capped at 900.

## Actor input object example

```json
{
  "mode": "organizations",
  "organizations": [
    "snowflake.com"
  ],
  "departments": [],
  "seniorities": [],
  "yearsInCurrentRole": [],
  "employeeRanges": [],
  "revenueRanges": [],
  "itSpendRanges": [],
  "accountFit": [],
  "requireEmail": false,
  "requirePhone": false,
  "validateEmail": false,
  "onlyNewContacts": false,
  "pollIntervalSeconds": 15,
  "maxWaitMinutes": 20,
  "maxResults": 100,
  "requestsPerMinute": 300
}
```

# Actor output Schema

## `records` (type: `string`):

One row per company or person, alongside the domain, email 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 = {
    "organizations": [
        "snowflake.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/account-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 = { "organizations": ["snowflake.com"] }

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/account-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 '{
  "organizations": [
    "snowflake.com"
  ]
}' |
apify call nabeelbaghoor/account-intelligence-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/account-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/cbbIhAxfGttTBPqvj/builds/GfmDlvLe5CZngR4JL/openapi.json
