# Company Tech Stack Detection: BuiltWith Alternative (`mambalabs/gtm-tech-stack-signal-scraper`) Actor

Detects which GTM tools a company uses on their website. Returns CRM, sequencer, and marketing automation flags as a flat Clay-ready row. Covers HubSpot, Salesforce, Marketo, Apollo, Outreach, and more. No JSON parsing required. MCP-ready for Claude Desktop, Cursor, and AI agent workflows.

- **URL**: https://apify.com/mambalabs/gtm-tech-stack-signal-scraper.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** Lead generation, Automation, AI
- **Stats:** 9 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.80 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Company Tech Stack Detection: BuiltWith Alternative
GTM tech stack detection for Clay. Flat boolean output. No JSON parsing required.

---

### What's Inside

- [Ready-to-Run Examples](#ready-to-run-examples)
- [What's New](#whats-new)
- [Overview](#overview)
- [Who this is for](#who-this-is-for)
- [Input](#input)
- [Output](#output)
- [How signal strength is derived](#how-signal-strength-is-derived)
- [Clay Table Template](#clay-table-template)
- [Pricing](#pricing)
- [Error Handling](#error-handling)
- [Known Limitations](#known-limitations)
- [Issues and Feature Requests](#issues-and-feature-requests)
- [Use with MCP (AI Agents)](#use-with-mcp-ai-agents)
- [Mamba Labs GTM Actor Fleet](#mamba-labs-gtm-actor-fleet)

### Ready-to-Run Examples

Each example is a pre-configured version of this actor for a specific use case. Click any link to open it in the Apify Console and run it immediately.

| Example | What it does |
|---------|-------------|
| [Bulk Tech Stack Lookup: BuiltWith Alternative](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper/examples/bulk-tech-stack-builtwith-alternative) | Enrich a list of domains with detected CRM, sequencer, and marketing automation tools. |
| [Detect Sales Sequencer: Outreach vs Salesloft](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper/examples/detect-sales-sequencer-outreach-salesloft) | Detect which sales sequencer a company runs from its website. |
| [Detect a Company CRM From Its Website](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper/examples/detect-company-crm-from-website) | Check whether a company runs HubSpot, Salesforce, or another CRM from its public website. |
| [Find Companies Using HubSpot or Marketo](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper/examples/find-companies-using-hubspot-marketo) | Segment a list of domains by detected marketing automation platform. |
| [Fresh Tech Stack Re-Scan (No Cache)](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper/examples/fresh-tech-stack-rescan-no-cache) | Force a fresh detection with no cached result, to catch a recently added or removed tool. |

> Looking for a different configuration? Open the [Input tab](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper/input-schema) to build your own.

### What's New

- **Pricing reduced.** $0.015 per result, down from $0.07. No subscription, no contract.
- **Free tier added.** Free Apify-plan users get 15 results per calendar month (resets monthly, counts only successful detections); paid plans are unlimited. Upgrade: https://apify.com/pricing.
- **Clay table template and function available.** Pre-built table plus a reusable Clay Function. [Open the template →](https://app.clay.com/shared-table/share_0tduwikWCKnZFC2dJde)
- **Detection is actually running.** Prior versions shipped with a base Docker image that had no Chromium binary. Every run in production was silently failing at `chromium.launch()` and returning all-false. v0.2.1 switches the base image to `apify/actor-node-playwright-chrome:20` which includes Chromium at the path Playwright expects.
- **Detection errors now surface in the output.** When the browser fails to launch or every fingerprint lookup errors out, `detection_error` is set to `true` and `detection_error_reason` carries the specific failure (for example `timeout`, `error: net::ERR_...`). Production failures no longer hide behind a row of false booleans.
- **Input field rename.** Primary field is now `domain` to match Actor 1. Legacy `company_domain` and `url` are still accepted for backward compatibility. Existing Clay tables keep working.
- **Apollo fingerprint updated.** New cookie patterns (`dwnjrn`, `zp__initial_landing_page`) match what Apollo's current marketing site actually sets.
- **Ground truth regression test.** `tests/ground_truth.js` runs the actor against six domains whose marketing sites carry detectable fingerprints. Five of six must pass before any release push.

---

### Overview

Takes a company domain or URL, renders the page with headless Chromium, and returns a single flat row with boolean flags for each GTM tool detected. Drop it into a Clay HTTP Request column and filter on `gtm_tool_count > 0` to qualify your list instantly.

---

### Who this is for

- Clay users building outbound qualification tables who need GTM tool flags without writing formula columns
- GTM agencies enriching lead lists with tech stack signals at scale
- RevOps teams segmenting accounts by CRM, sequencer, and marketing automation usage

---

### Input

| Field | Type | Required | Notes |
|---|---|---|---|
| `domain` | String | Yes | Bare company domain. Example: `stripe.com`. No `https://`, no `www.`, no trailing slash. |
| `company_domain` | String | No | Deprecated. Still accepted for backward compatibility with existing Clay tables. |
| `url` | String | No | Deprecated. Still accepted. |
| `crawl_additional_pages` | Boolean | No | Default `true`. Set to `false` for homepage-only runs. |
| `domains` | Array | No | List of bare domains for batch processing. Takes precedence over `domain` when provided. Each domain produces its own output row. |
| `batchSize` | Integer | No | Domains detected concurrently per wave in batch mode. Default `5`, maximum `10`. One browser is reused across the batch, so memory stays flat; raise the actor memory only if you increase this well beyond the default. |
| `skipCache` | Boolean | No | Default `false`. A clean detection is cached for 7 days and reused on repeat lookups, skipping the browser launch entirely. Set `true` to force a fresh detection. |

#### Batch usage

Pass a `domains` array to score many companies in one run. The actor reuses a single browser across the batch (one Chromium process, one fresh context per domain) and processes `batchSize` domains at a time, so a 50 domain run does not launch 50 browsers:

```json
{
  "domains": ["stripe.com", "notion.so", "figma.com"],
  "batchSize": 5,
  "crawl_additional_pages": true
}
````

Each domain is emitted as its own flat row, identical in shape to a single domain run. Free-tier runs process up to the remaining monthly allowance and stop.

#### Caching

A clean detection for a domain is cached for 7 days in a named Key-Value Store in your own account and reused on repeat lookups, skipping the Chromium launch entirely. This makes re-running the same account list cheap. Error and empty detections are never cached. Pass `skipCache: true` to force a fresh detection.

***

### Output

Every field is present in every row. No nested JSON. Ready to use as a Clay enrichment column.

| Field | Type | Description |
|---|---|---|
| `domain` | String | Normalized domain from input (new primary key) |
| `company_domain` | String | Same value as `domain`. Present for backward compatibility. |
| `crm_detected` | String | hubspot / salesforce / marketo / pardot / none |
| `seq_tool_detected` | String | outreach / salesloft / apollo / instantly / intercom / drift / none |
| `uses_hubspot` | Boolean | HubSpot CRM or Marketing Hub detected |
| `uses_salesforce` | Boolean | Salesforce detected |
| `uses_clay` | Boolean | Clay detected |
| `uses_apollo` | Boolean | Apollo.io detected |
| `uses_outreach` | Boolean | Outreach detected |
| `uses_gong` | Boolean | Gong detected |
| `uses_zoominfo` | Boolean | ZoomInfo detected |
| `uses_drift` | Boolean | Drift detected |
| `uses_intercom` | Boolean | Intercom detected |
| `uses_marketo` | Boolean | Marketo detected |
| `marketing_automation_detected` | String | marketo / pardot / hubspot / none |
| `gtm_tool_count` | Integer | Count of true boolean fields |
| `tech_stack_signal` | String | high / medium / low |
| `detected_tools` | Array | One object per detected tool: `name`, `category`, `confidence`, `evidence`. Additive structured view of the flat booleans; empty array when nothing is detected. |
| `detection_error` | Boolean | True if every fingerprint call returned a browser error or timeout |
| `detection_error_reason` | String | Specific error reason when `detection_error` is true (for example `timeout`, `error: ENOENT`). Null otherwise. |
| `run_date` | ISO Date | Timestamp of the run |

**Sample output:**

```json
{
  "domain": "hubspot.com",
  "company_domain": "hubspot.com",
  "crm_detected": "hubspot",
  "seq_tool_detected": "none",
  "uses_hubspot": true,
  "uses_salesforce": false,
  "uses_clay": false,
  "uses_apollo": false,
  "uses_outreach": false,
  "uses_gong": false,
  "uses_zoominfo": false,
  "uses_drift": false,
  "uses_intercom": false,
  "uses_marketo": false,
  "marketing_automation_detected": "hubspot",
  "gtm_tool_count": 1,
  "tech_stack_signal": "medium",
  "detected_tools": [
    {
      "name": "HubSpot",
      "category": "CRM",
      "confidence": "high",
      "evidence": "script src match: /js\\.hs-scripts\\.com/"
    }
  ],
  "detection_error": false,
  "detection_error_reason": null,
  "run_date": "2026-04-06T09:03:47.744Z"
}
```

`detected_tools[]` is additive: every flat boolean and string field is unchanged, so existing Clay tables keep working. Each entry carries:

- `name`: display name, for example `HubSpot`, `Salesforce`, `Marketo`.
- `category`: one of CRM, MAP, Analytics, Chat, CDP, ABM, Ads, A/B Testing, CDN/Framework, Other.
- `confidence`: `high` for an exact script or cookie match, `medium` for a JS global, `low` for a heuristic HTML match.
- `evidence`: the signal that triggered the match, for example `script src match: /js\.hs-scripts\.com/`.

Clay gate column: `gtm_tool_count > 0`

***

### How signal strength is derived

| Strength | Criteria |
|---|---|
| high | CRM detected AND sequencer detected AND 3 or more total tools |
| medium | CRM or sequencer detected, 1 to 2 total tools |
| low | At least 1 tool detected, no CRM and no sequencer |

***

### Clay Table Template

A pre-built Clay table template is available with the enrichment column, formula columns, and views ready to use.

**[Open the Clay template →](https://app.clay.com/shared-table/share_0tduwikWCKnZFC2dJde)**

The template includes:

- A Run Apify Actor enrichment column wired to mambalabs/gtm-tech-stack-signal-scraper
- Eight formula columns for CRM, sequencer, and tool detection flags
- A qualifier column for downstream gating

A reusable Clay Function is also available: [Open the function →](https://app.clay.com/shared-table/share_0tdutnkHyf2yPQ6Gjie). Use the function when you want updates to the detection logic to propagate automatically. Use the template when you want a static copy to modify.

#### Manual setup

One flat row per domain, Clay-ready. Add this actor as a Run Apify Actor enrichment column in any Clay table with a company\_domain column.

Input mapping:

- Apify Actor: mambalabs/gtm-tech-stack-signal-scraper
- Input Data: {"domain": "\[company\_domain pill]"}
- Run condition: company\_domain is not empty

Output fields map directly to Clay formula columns using dot notation:

- {{actor\_output}}?.uses\_hubspot
- {{actor\_output}}?.uses\_marketo
- {{actor\_output}}?.uses\_intercom
- {{actor\_output}}?.crm\_detected
- {{actor\_output}}?.seq\_tool\_detected
- {{actor\_output}}?.gtm\_tool\_count
- {{actor\_output}}?.tech\_stack\_signal
- {{actor\_output}}?.detection\_error

Gate downstream tables on gtm\_tool\_count > 0 or tech\_stack\_signal = high to focus on companies running real GTM infrastructure.

***

### Pricing

**$0.015 per result.** Pay per event, billed per domain processed. No subscription, no seat license, no contract.

| Tier | Discount | Per result | Per 1K results |
|------|----------|-----------|----------------|
| Free (no plan) | 0% | $0.015 | $15.00 |
| Starter (Bronze) | ~5% | $0.0143 | $14.30 |
| Scale (Silver) | ~10% | $0.0135 | $13.50 |
| Business (Gold) | ~15% | $0.0128 | $12.80 |

| Volume | Cost |
|--------|------|
| 100 domains | $1.50 |
| 1,000 domains | $15.00 |
| 10,000 domains | $150.00 |

We recently reduced pricing across the Mamba Labs actor suite to bring more value to GTM teams running enrichment at scale.

#### Free tier vs paid usage

| Plan | Limit |
|------|-------|
| **Free Apify plan** | **15 results per calendar month** (resets on the 1st) |
| **Any paid Apify plan** | **Unlimited** results, no cap |

Free-plan usage is counted cumulatively across all of your runs in a month, not per run, so each single-domain run draws from the same monthly allowance. Only successful detections count against the allowance; a run that errors out (bot-block, timeout) does not consume a result. How it behaves when you hit the limit:

- **Within the monthly allowance:** the domain is detected and returned normally.
- **Already at the limit:** the run exits immediately with no result and an upgrade message in the run status, before any browser cost is incurred.

Upgrade to any paid Apify plan for unlimited detection: https://apify.com/pricing. Paid-plan runs are never capped and incur no usage tracking.

***

### Error Handling

The actor is built to always emit a usable row. It never crashes mid-batch on a single bad domain, and it surfaces real browser failures so you never mistake a failed run for a confirmed negative.

| Condition | Behavior | Output |
|---|---|---|
| No `domain` or `domains` provided | Early exit before any browser launch | Run throws `Provide input.domain (single) or input.domains (array)`, no rows pushed |
| Free-tier monthly quota already reached | Quota is checked up front, before the Chromium launch, so no browser cost is incurred | Run exits immediately with an upgrade message in the run status, no rows pushed |
| Page navigation times out (15s) or the browser errors | Detection returns all-false for that domain rather than throwing | Row with `detection_error: true` and `detection_error_reason` set to `timeout` or `error: ...` |
| Browser fails to launch for the whole batch | Every domain in the batch is marked failed | Each row has `detection_error: true` and `detection_error_reason` carrying the launch error |
| Additional page (pricing/product) crawl fails | Failure is logged and skipped; homepage signals are still used | Normal row built from the homepage detection, no error flag raised |
| Bot-protected site returns a valid 200 stub | No error is thrown because the browser got a real response | Row with all-false flags and `detection_error: false` (see Known Limitations) |
| Unexpected per-row exception | The row is caught, an empty record is pushed, and the batch continues | Row built from `buildEmptyRecord` with `detection_error_reason` of `main_catch: ...` |

***

### Known Limitations

**Bot-protected domains may return negative results.** Sites fronted by Cloudflare Enterprise, Akamai Bot Manager, or PerimeterX often serve a challenge page or stub to headless Chromium requests from a datacenter IP. The detector navigates successfully, captures an empty stub HTML, and returns all-false with `detection_error: false` (no error was actually thrown, the browser got a valid 200 response). Known examples include salesforce.com, zoominfo.com, and marketo.com. If you need those, flag the rows for manual review. A stealth-mode build with residential proxies is a candidate for a future coverage-expansion release.

**Backend-only tools with no web pixel are out of scope.** Clay, Salesloft, Instantly, Lemlist, and server-side Segment leave no public client-side signal on a customer's website. The fingerprints file marks these with `detectable: false` by design. Do not expect `uses_clay: true` even on companies you know use Clay. This is documented, not a bug.

**Vendor marketing sites reflect their marketing stack, not their product.** outreach.io runs Marketo on its marketing site. apollo.io runs HubSpot plus Intercom. gong.io runs Marketo. drift.com runs Marketo post-Salesloft-acquisition. The actor reports what the page actually uses, which is the correct outbound-qualification signal. "This company uses Outreach" is not inferable from "outreach.io's marketing site loads Marketo scripts," and we do not hard-code self-domain shortcuts.

**Tools loaded only behind authenticated pages will not be detected.** The actor crawls the homepage and up to two public pages (pricing, product). Dashboards, customer portals, and auth-gated paths are unreachable.

**Heavily obfuscated CDN routing can reduce script src accuracy.** Cookie names and JS global variables are checked as primary signals to partially compensate, but companies that fully mask outbound requests through Cloudflare Workers or Fastly with custom domains may still slip through.

**LinkedIn Sales Navigator is not detectable** and was removed in v0.2.0.

***

### Issues and Feature Requests

Found a bug or want to request a feature? Open an issue in the Issues tab above. Response time: typically within 48 hours.

***

### Use with MCP (AI Agents)

This actor is callable as a tool over MCP (Model Context Protocol) by AI clients like Claude Desktop, Cursor, VS Code (GitHub Copilot), Windsurf, and any other MCP-compatible client. Apify hosts the MCP server at `mcp.apify.com`, so no custom server code is needed.

#### What this actor does in an MCP context

Give an AI agent a company domain and it returns a flat row of GTM tech stack signals: which CRM, sequencer, and marketing automation tools the company runs on its marketing site. Useful for outbound qualification, account research, and ICP scoring inside an agent loop.

Example prompts:

- "What CRM does stripe.com use?"
- "Does notion.so run HubSpot or Salesforce?"
- "Detect the marketing automation stack on shopify.com and tell me if they use Marketo or Pardot."

#### Supported MCP clients

Claude Desktop, Cursor, VS Code (GitHub Copilot), Windsurf, and any MCP-compatible client.

#### Setup: Hosted server (recommended)

Add this entry to your MCP client config. The OAuth variant prompts you to authorize on first connect, so no token sits in your config file.

**OAuth (recommended):**

```json
{
  "mcpServers": {
    "mamba-labs-tech-stack": {
      "url": "https://mcp.apify.com?tools=mambalabs/gtm-tech-stack-signal-scraper"
    }
  }
}
```

**Bearer token:**

```json
{
  "mcpServers": {
    "mamba-labs-tech-stack": {
      "url": "https://mcp.apify.com?tools=mambalabs/gtm-tech-stack-signal-scraper",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}
```

#### Setup: Full Mamba Labs GTM Suite

Load all 6 Mamba Labs GTM actors as tools in a single MCP server entry.

**OAuth:**

```json
{
  "mcpServers": {
    "mamba-labs-gtm-suite": {
      "url": "https://mcp.apify.com?tools=mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay"
    }
  }
}
```

**Bearer token:**

```json
{
  "mcpServers": {
    "mamba-labs-gtm-suite": {
      "url": "https://mcp.apify.com?tools=mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}
```

#### Setup: Local server (for development and testing)

```
npx @apify/actors-mcp-server --tools mambalabs/gtm-tech-stack-signal-scraper
```

Full suite:

```
npx @apify/actors-mcp-server --tools mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay
```

#### Setup: Dedicated MCP wrapper

Install the dedicated wrapper for this actor and point your MCP client at it:

```
npm install -g @mambalabsdev/mcp-gtm-tech-stack-signal-scraper
```

```json
{ "mcpServers": { "mamba-gtm-tech-stack": { "command": "npx", "args": ["-y","@mambalabsdev/mcp-gtm-tech-stack-signal-scraper"], "env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" } } } }
```

Prefer one install for the whole fleet? The Mamba Labs GTM Suite (https://www.npmjs.com/package/@mambalabsdev/mcp-gtm-suite) exposes eleven of these actors as tools in a single MCP server.

#### What the output looks like

One flat JSON row per domain, well under 2KB. Every field is always present. Key fields:

- `domain`: normalized input domain
- `crm_detected`: hubspot, salesforce, marketo, pardot, or none
- `seq_tool_detected`: outreach, salesloft, apollo, instantly, intercom, drift, or none
- `marketing_automation_detected`: marketo, pardot, hubspot, or none
- `gtm_tool_count`: integer count of detected tools
- `tech_stack_signal`: high, medium, or low
- `detection_error` and `detection_error_reason`: surface real browser failures so agents do not treat empty results as confirmed negatives
- Per-tool booleans: `uses_hubspot`, `uses_salesforce`, `uses_apollo`, `uses_outreach`, `uses_gong`, `uses_zoominfo`, `uses_drift`, `uses_intercom`, `uses_marketo`, `uses_clay`

#### Billing

MCP runs use the same pay-per-event pricing as direct API or Console runs. Each successful result costs $0.015.

#### Notes

This actor uses headless Chromium on Apify infrastructure. The MCP client does not need to run a browser locally. Typical run time 5 to 15 seconds.

***

### Mamba Labs GTM Actor Fleet

| Actor | What it does | Price/result |
|-------|--------------|--------------|
| [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper) | Detects GTM hiring from career pages (Greenhouse, Lever, Ashby) | $0.05 |
| [GTM Tech Stack Signal Enrichment](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper) | Detects CRM, sequencer, and marketing automation from a public site | $0.015 |
| [GTM Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay) | Combines hiring and tech signals into one composite GTM score | $0.09 |
| [Job Board Keyword Signal Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner) | Scans 5 ATS platforms for roles in any category | $0.05 |
| [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver) | Resolves a domain or name to its LinkedIn URL with firmographics | $0.006 |
| [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay) | Scores a company against your ideal customer profile | $0.05 |
| [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker) | Audits email deliverability: SPF, DKIM, DMARC, MX, health score | $0.005 |
| [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher) | Enriches a domain into employee band, industry, HQ, revenue | $0.004 |
| [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper) | Maps a domain to social URLs and follower counts | $0.015 |
| [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver) | Resolves name, domain, or LinkedIn into one canonical identity | $0.007 |
| [Company Change-Event Feed](https://apify.com/mambalabs/company-change-event-feed) | Monitors a domain and returns only what changed since last run | $0.06 |
| [Funding & Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner) | Scans news and press for funding, exec moves, launches, M\&A | $0.03 |

**One-install option:** the [Mamba Labs GTM Suite](https://www.npmjs.com/package/@mambalabsdev/mcp-gtm-suite) MCP server exposes eleven of these actors as tools in a single package. Each actor also has its own [MCP wrapper](https://www.npmjs.com/org/mambalabsdev).

All actors: [apify.com/mambalabs](https://apify.com/mambalabs) | Website: [mambabuilt.com](https://mambabuilt.com)

Built by Mamba Labs.

# Actor input Schema

## `domain` (type: `string`):

Bare domain without https:// or trailing slash. Example: stripe.com

## `company_domain` (type: `string`):

Deprecated. Use `domain` instead. Still accepted for backward compatibility with existing Clay tables and API callers.

## `url` (type: `string`):

Deprecated. Use `domain` instead.

## `crawl_additional_pages` (type: `boolean`):

If true, crawls up to 2 additional pages per domain (pricing, product) to improve detection coverage. Slightly increases run time per domain.

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

Optional list of bare domains for batch processing. When provided, this takes precedence over the single domain field. Each entry without https:// or trailing slash. Example: stripe.com

## `batchSize` (type: `integer`):

How many domains to detect concurrently per wave when using the domains list. One browser is reused across the batch. Default 5, maximum 10. Higher values run faster but use more memory; raise the actor memory if you increase this.

## `skipCache` (type: `boolean`):

By default a clean detection is cached for 7 days and reused on repeat lookups, skipping the browser launch. Set true to force a fresh detection and ignore any cached result.

## Actor input object example

```json
{
  "domain": "stripe.com",
  "crawl_additional_pages": true,
  "batchSize": 5,
  "skipCache": false
}
```

# Actor output Schema

## `results` (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 = {
    "domain": "stripe.com",
    "crawl_additional_pages": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/gtm-tech-stack-signal-scraper").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 = {
    "domain": "stripe.com",
    "crawl_additional_pages": True,
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/gtm-tech-stack-signal-scraper").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 '{
  "domain": "stripe.com",
  "crawl_additional_pages": true
}' |
apify call mambalabs/gtm-tech-stack-signal-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mambalabs/gtm-tech-stack-signal-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Company Tech Stack Detection: BuiltWith Alternative",
        "description": "Detects which GTM tools a company uses on their website. Returns CRM, sequencer, and marketing automation flags as a flat Clay-ready row. Covers HubSpot, Salesforce, Marketo, Apollo, Outreach, and more. No JSON parsing required. MCP-ready for Claude Desktop, Cursor, and AI agent workflows.",
        "version": "0.2",
        "x-build-id": "SNZgYHHebLHlbci5g"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mambalabs~gtm-tech-stack-signal-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mambalabs-gtm-tech-stack-signal-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/mambalabs~gtm-tech-stack-signal-scraper/runs": {
            "post": {
                "operationId": "runs-sync-mambalabs-gtm-tech-stack-signal-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/mambalabs~gtm-tech-stack-signal-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-mambalabs-gtm-tech-stack-signal-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "domain": {
                        "title": "Company Domain",
                        "type": "string",
                        "description": "Bare domain without https:// or trailing slash. Example: stripe.com"
                    },
                    "company_domain": {
                        "title": "Company Domain (deprecated)",
                        "type": "string",
                        "description": "Deprecated. Use `domain` instead. Still accepted for backward compatibility with existing Clay tables and API callers."
                    },
                    "url": {
                        "title": "Company Website (deprecated)",
                        "type": "string",
                        "description": "Deprecated. Use `domain` instead."
                    },
                    "crawl_additional_pages": {
                        "title": "Crawl Additional Pages",
                        "type": "boolean",
                        "description": "If true, crawls up to 2 additional pages per domain (pricing, product) to improve detection coverage. Slightly increases run time per domain.",
                        "default": true
                    },
                    "domains": {
                        "title": "Company Domains (batch)",
                        "type": "array",
                        "description": "Optional list of bare domains for batch processing. When provided, this takes precedence over the single domain field. Each entry without https:// or trailing slash. Example: stripe.com",
                        "items": {
                            "type": "string"
                        }
                    },
                    "batchSize": {
                        "title": "Batch Size",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many domains to detect concurrently per wave when using the domains list. One browser is reused across the batch. Default 5, maximum 10. Higher values run faster but use more memory; raise the actor memory if you increase this.",
                        "default": 5
                    },
                    "skipCache": {
                        "title": "Skip Cache",
                        "type": "boolean",
                        "description": "By default a clean detection is cached for 7 days and reused on repeat lookups, skipping the browser launch. Set true to force a fresh detection and ignore any cached result.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
