# TheirStack Signal Orchestrator - Lead Intelligence (`apricot_blackberry/theirstack-signal-orchestrator`) Actor

Theirstack Signal Orchestrator helps teams get quick, high-signal results with reliable output, clear fields, and fast setup.

- **URL**: https://apify.com/apricot\_blackberry/theirstack-signal-orchestrator.md
- **Developed by:** [Creator Fusion](https://apify.com/apricot_blackberry) (community)
- **Categories:** Business, Automation, AI
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $40.00 / 1,000 company signals

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

![theirstack-signal-orchestrator cover](https://placehold.co/1200x630/png?text=theirstack-signal-orchestrator)

## TheirStack Signal Orchestrator

Find companies by technology stack and hiring signals, score them, and export structured lead intelligence for automations and AI agents.

### What it does

This Actor uses your **TheirStack API key** to search companies and hiring signals, then normalizes, scores, deduplicates, and exports results as structured Apify datasets — ready for CRM enrichment, outbound prospecting, AI agent workflows, and recurring signal monitoring.

**This is not a UI scraper.** It's an API-backed orchestrator with strong data quality, retry logic, and MCP-friendly output schemas.

### Key Features

- **4 search modes**: Company search, job search, domain enrichment, monitoring
- **Weighted lead scoring**: Configurable weights for technology match, hiring intent, recency, and company fit
- **Deduplication**: Merge by domain or company name, keeping highest-scored results
- **Monitoring mode**: Compare runs against baselines; flag new companies
- **MCP-ready**: Strong input/dataset/output schemas for AI agent discovery
- **Pay-per-event pricing**: No subscription — pay only for results

### Quick Start

```json
{
  "searchMode": "companySearch",
  "theirstackApiKey": "{{APIFY_SECRET:THEIRSTACK_API_KEY}}",
  "technologiesInclude": ["snowflake", "dbt"],
  "jobKeywordsAny": ["analytics engineering"],
  "companyLocations": ["United States"],
  "maxCompanies": 100
}
```

### Search Modes

#### Company Search

Find companies using specific technologies, optionally filtered by hiring signals.

#### Job Search

Search job postings first, then group by company with enrichment.

#### Domain Enrichment

Provide a list of domains and get tech stack + hiring signal data.

#### Monitoring

Run a search and compare results to a baseline dataset. New companies are flagged with `signals.newSinceBaseline = true`.

### Input Reference

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchMode` | enum | `companySearch` | Search mode |
| `theirstackApiKey` | string | required | Your TheirStack API key |
| `queryName` | string | `""` | Label for this search |
| `technologiesInclude` | string\[] | `[]` | Technologies to search for |
| `technologiesExclude` | string\[] | `[]` | Technologies to exclude |
| `jobKeywordsAny` | string\[] | `[]` | At least one keyword must match |
| `jobKeywordsAll` | string\[] | `[]` | All keywords must match |
| `maxCompanies` | integer | `250` | Max results to return |
| `dedupeBy` | enum | `companyDomain` | Deduplication strategy |
| `outputMode` | enum | `companyWithEvidence` | What to include in results |
| `monitoringMode` | boolean | `false` | Compare to baseline |
| `scoring` | object | weights | Customize lead scoring |

### Output

Each dataset item includes:

```json
{
  "companyName": "Example Corp",
  "companyDomain": "example.com",
  "companyIndustry": "Computer Software",
  "companySize": "201-500",
  "technologiesMatched": [...],
  "jobsMatched": [...],
  "signals": {
    "technologyFit": true,
    "hiringIntent": true,
    "recentHiringDays": 12,
    "newSinceBaseline": false
  },
  "leadScore": 87,
  "leadScoreBand": "high",
  "source": "theirstack"
}
```

A **SUMMARY** record is saved in the key-value store with run stats, top industries/technologies, and webhook metadata.

### Scoring Model

Lead scores range 0–100 using configurable weights:

- **Technology match** (40%): % of requested techs found × confidence
- **Job intent** (35%): Count and keyword coverage of matched jobs
- **Recency** (15%): Exponential decay from most recent evidence
- **Company fit** (10%): Size and industry alignment

Score bands: `very_high` (90+), `high` (75–89), `medium` (50–74), `low` (0–49)

### Pricing

**Pay-per-event** — no subscription. You bring your own TheirStack API key.

| Event | Price |
|-------|-------|
| Actor start | $0.15 |
| Per company result | $0.003 |
| Per new monitoring result | $0.006 |

### API Key Setup

1. Get an API key from [TheirStack](https://theirstack.com)
2. Store it as an [Apify secret](https://docs.apify.com/platform/actors/development/secret-input): `THEIRSTACK_API_KEY`
3. Reference it in input: `"theirstackApiKey": "{{APIFY_SECRET:THEIRSTACK_API_KEY}}"`

### License

Apache-2.0 — © Creator Fusion

# Actor input Schema

## `searchMode` (type: `string`):

How the Actor should query data.

## `theirstackApiKey` (type: `string`):

Your TheirStack API key. Store as an Apify secret for security.

## `queryName` (type: `string`):

Human-readable name used in summaries and exports.

## `domains` (type: `array`):

Domains to enrich directly. Required for domainEnrichment mode.

## `technologiesInclude` (type: `array`):

Technologies the company should use.

## `technologiesExclude` (type: `array`):

Technologies the company should not use.

## `jobKeywordsAny` (type: `array`):

At least one keyword should appear in job evidence.

## `jobKeywordsAll` (type: `array`):

All keywords must appear in job evidence.

## `jobKeywordsNot` (type: `array`):

Keywords to exclude from job evidence.

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

Filter companies by headquarters location.

## `jobLocations` (type: `array`):

Filter job evidence by job location.

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

Filter companies by industry classification.

## `companySizeMin` (type: `integer`):

Minimum number of employees.

## `companySizeMax` (type: `integer`):

Maximum number of employees.

## `postedAfter` (type: `string`):

Only consider job evidence posted after this date (YYYY-MM-DD).

## `maxCompanies` (type: `integer`):

Maximum number of companies to return.

## `maxJobsPerCompany` (type: `integer`):

Maximum number of job postings to include per company.

## `includeTechnologies` (type: `boolean`):

Include matched technologies in output.

## `includeJobs` (type: `boolean`):

Include matched job postings in output.

## `includeSignals` (type: `boolean`):

Include derived signal booleans (technologyFit, hiringIntent, etc.).

## `dedupeBy` (type: `string`):

Strategy for deduplicating results.

## `scoring` (type: `object`):

Weights for the lead scoring components. Should sum to 1.0.

## `outputMode` (type: `string`):

What data to include in each output record.

## `monitoringMode` (type: `boolean`):

Compare results to a baseline dataset and flag new companies.

## `baselineDatasetId` (type: `string`):

Dataset used for change detection in monitoring mode.

## `webhookMetadata` (type: `object`):

Pass-through metadata copied to summary output.

## `debug` (type: `boolean`):

Enable verbose logging for troubleshooting.

## Actor input object example

```json
{
  "searchMode": "companySearch",
  "queryName": "",
  "domains": [],
  "companySizeMin": 1,
  "companySizeMax": 10000,
  "postedAfter": "",
  "maxCompanies": 250,
  "maxJobsPerCompany": 3,
  "includeTechnologies": true,
  "includeJobs": true,
  "includeSignals": true,
  "dedupeBy": "companyDomain",
  "scoring": {
    "technologyMatchWeight": 0.4,
    "jobIntentWeight": 0.35,
    "recencyWeight": 0.15,
    "companyFitWeight": 0.1
  },
  "outputMode": "companyWithEvidence",
  "monitoringMode": false,
  "baselineDatasetId": "",
  "webhookMetadata": {},
  "debug": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "domains": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("apricot_blackberry/theirstack-signal-orchestrator").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 = { "domains": [] }

# Run the Actor and wait for it to finish
run = client.actor("apricot_blackberry/theirstack-signal-orchestrator").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 '{
  "domains": []
}' |
apify call apricot_blackberry/theirstack-signal-orchestrator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apricot_blackberry/theirstack-signal-orchestrator"
        }
    }
}

```

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/9sy1WXq9t3sFCTshu/builds/cWvYzLWvkTdXZ4Hsh/openapi.json
