# Startup Database API - Company Search, Funding and Teams (`nabeelbaghoor/startup-database-api`) Actor

Search a startup and company database by keyword, resolve companies from a domain or LinkedIn URL, find lookalikes, read a saved search, or list a company's founders and team. Returns funding, stage, investors, headcount and contacts. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/startup-database-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 or person 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

## Startup Database API

Search a database of startups and private companies by keyword, then get funding, headcount, traction and the people behind each one as flat rows.

Public company data is easy to find. Private company data, especially for companies that are two years old and have raised once, is not. This actor wraps a startup and company database that tracks funding rounds, investors, team growth and social traction, and gives you five ways into it: discovery by keyword, enrichment from a domain or a profile URL, lookalike search, a saved search you built in the provider's own interface, and a company's team list.

### Five modes

| Mode | What it does | What you give it |
| --- | --- | --- |
| `keyword-search` | Discovers companies by free-text query, with contains-any, contains-all and exclude term lists | Keywords |
| `enrich` | Resolves companies you already have into full records | Domains or profile URLs |
| `similar-companies` | Finds lookalikes for a company you already like | Company ids or URNs |
| `saved-search` | Reads a list you built and saved in your provider account | A saved search id |
| `employees` | Lists a company's founders, executives, advisors or whole team | Company ids or URNs |

The saved search mode is the escape hatch worth knowing about. If you need a filter set richer than keywords, build it once in the provider's own interface where every filter is available, save it, then point this actor at the saved search id and run it on a schedule.

### What comes back

Company rows carry name, legal name, website and domain, description, company type, ownership status, funding stage, founding date and headcount; location as country, state, city and formatted address; funding as total raised, number of rounds, stage, last round date, last round type, valuation and named investors; contact as primary email, email list, executive email list and phone numbers; social profiles with follower counts for LinkedIn and Twitter; web traffic; departmental headcount for engineering, sales and marketing; tags and highlights.

Person rows carry name, job title, department, founder flag, email, LinkedIn and Twitter profiles, location, and the company they were found under.

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

### Example output

```json
{
  "recordType": "company",
  "entityUrn": "urn:harmonic:company:12345",
  "companyId": 12345,
  "name": "Example Labs",
  "websiteDomain": "example.com",
  "description": "Battery recycling for grid storage operators.",
  "ownershipStatus": "PRIVATE",
  "stage": "SERIES_A",
  "foundingDate": "2021-03-01",
  "headcount": 48,
  "country": "United States",
  "city": "Oakland",
  "fundingTotal": 24500000,
  "numFundingRounds": 3,
  "fundingStage": "SERIES_A",
  "lastFundingAt": "2026-02-11",
  "lastFundingType": "SERIES_A",
  "investors": ["Example Ventures", "Second Fund"],
  "primaryEmail": "hello@example.com",
  "linkedinUrl": "https://www.linkedin.com/company/example-labs",
  "linkedinFollowers": 8400,
  "headcountEngineering": 22,
  "tags": ["Climate", "Hardware"],
  "updatedAt": "2026-08-01"
}
```

### Pricing

Pay per result. You are charged once per record saved to the dataset. Duplicates are removed before charging, and an identifier that resolves to nothing is stored with `matched: false` free of charge, so a list of dead domains costs you nothing. 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 API key from Harmonic, which is the provider whose API this actor calls. The key is sent as a request header rather than as a URL parameter, so it never appears in a log line or a redirect.

### FAQ

#### What is a startup database API?

A startup database API is a company data endpoint focused on private and venture-backed companies rather than public filings. It returns funding rounds, investors, stage, team size and growth signals for companies that do not publish financial statements. This actor wraps one and turns its results into a dataset you can export as CSV, JSON or Excel, or pull from another tool.

#### How do I find companies when I only have a list of domains?

Use `enrich` mode and paste the domains into `companyIdentifiers`. Each value is routed automatically by shape: a LinkedIn, Crunchbase, PitchBook, Twitter, Instagram, Facebook, AngelList, Indeed, Glassdoor or StackOverflow URL goes to that source's lookup, a bare domain goes to the domain lookup, and any other URL is treated as the company's own website. You do not have to sort your list first.

#### Can I get founder and executive contact details?

Yes. Run `employees` mode with the company ids or URNs and set `employeeGroupType` to FOUNDER or EXECUTIVE. Person rows include job title, department, LinkedIn profile and email where the provider holds one. Set `employeeStatus` to INACTIVE to see who has left, which is often the more interesting list.

#### What is a company URN and where do I get one?

A URN is the provider's stable company identifier and looks like `urn:harmonic:company:12345`. Every company row this actor returns carries one in `entityUrn`, so the usual pattern is to run a keyword search or an enrichment first, then feed those URNs into the similar companies or people modes.

#### How does keyword search handle multiple terms?

Four fields feed one search. `keywords` is the general query. `keywordsAny` matches a company if any single term is present and widens the result set. `keywordsAll` requires every term and narrows it. `keywordsExclude` removes matches. An exclude list on its own is not a search, so at least one of the first three is required.

#### Why do results appear after the reported total?

The search endpoints answer with company identifiers rather than full records, so the actor pages the identifiers first and then fetches the records in batches of 100. The match count is known before the first row is written. Identifiers already seen earlier in a run are dropped before the fetch, so a duplicate never costs a provider call.

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

Up to 25,000 per run, paged at up to 1,000 records per request. Similar company lookups are capped at 100 per seed by the provider, so add more seeds rather than raising the page size for that mode.

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

Yes. This actor is bring your own key, and your usage is billed on your own provider plan. The actor charges separately for each result it returns.

### Keyword map

startup database API, startup data API, private company data API, company funding data API, venture capital data API, investor data API, company search API, lookalike company search, similar companies API, company enrichment API, domain to company API, founder contact data, team and headcount data, deal sourcing API, private market data API

# Actor input Schema

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

What this run does. Keyword search discovers companies. Enrich resolves companies you already have from a domain or a profile URL. Similar companies finds lookalikes for a seed company. Saved search reads a list you built in your provider account. People lists a company's team.

## `keywords` (type: `string`):

A free-text query describing the companies you want, for example a market, a technology or a product category. Keyword search mode only.

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

Match a company if any one of these terms is present. Widens a narrow query.

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

Match a company only if every one of these terms is present. Narrows a broad query.

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

Drop companies matching any of these terms. This filters an existing search rather than being a search on its own.

## `companyIdentifiers` (type: `array`):

Domains, website URLs or profile URLs to resolve into full company records. Each value is routed automatically: a LinkedIn, Crunchbase, PitchBook, Twitter, Instagram, Facebook, AngelList, Indeed, Glassdoor or StackOverflow URL goes to that source's lookup, a bare domain goes to the domain lookup, and any other URL is treated as the company website. Enrich mode only.

## `enrichMissingCompanies` (type: `boolean`):

Ask the provider to go and build a record for a company it has not profiled yet, rather than returning nothing. Turn this off for a faster run over a list you expect to be well covered already.

## `skipUnmatched` (type: `boolean`):

Leave unresolved identifiers out of the dataset entirely. By default they are stored with matched set to false, which is free, so you can see exactly which inputs failed to resolve.

## `seedCompanies` (type: `array`):

Companies to work from, as provider ids or URNs. A URN looks like urn:harmonic:company:12345. Used as the seeds in similar companies mode and as the targets in people mode.

## `employeeGroupType` (type: `string`):

Which group of people to return. People mode only.

## `employeeStatus` (type: `string`):

Whether to return current people, past people, or both. People mode only.

## `savedSearchId` (type: `string`):

The id or URN of a search you built and saved in your provider account. Saved search mode only. This is the way to run a complex filter set that this actor's keyword fields do not cover: build it once in the provider interface, then read the results here on a schedule.

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

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

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

How many records to request per API call (1 to 1,000). Larger pages mean fewer calls. Similar company lookups are capped at 100 per seed by the provider regardless of this setting.

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

Your own API key for the data provider. Required. Sent as a request header rather than in the URL, and never logged.

## Actor input object example

```json
{
  "mode": "keyword-search",
  "enrichMissingCompanies": true,
  "skipUnmatched": false,
  "employeeGroupType": "ALL",
  "employeeStatus": "ACTIVE",
  "maxResults": 100,
  "pageSize": 100
}
```

# 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/startup-database-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/startup-database-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 '{
  "maxResults": 100,
  "pageSize": 100
}' |
apify call nabeelbaghoor/startup-database-api --silent --output-dataset

```

## MCP server setup

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