# ICP & Account Lead Scoring: Fit Scorer 0-100 for Clay (`mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay`) Actor

Scores pre-enriched companies against your Ideal Customer Profile using weighted signals. Returns a 0 to 100 fit score, A to D tier, and per-signal breakdown. Deterministic and LLM modes. Built for Clay enrichment and batch processing. MCP-ready for Claude Desktop and AI agents.

- **URL**: https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** Lead generation, Automation, AI
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $42.50 / 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

## ICP & Account Lead Scoring: Fit Scorer 0-100 for Clay
Scores companies against your ICP using weighted signals. Returns icp_score 0-100, icp_tier A-D, and a per-signal breakdown. Works with plain-English ICP descriptions or a custom JSON config.

---

### What's New

- **Free tier added.** Free Apify-plan users get 50 successfully scored results per calendar month (resets on the 1st). Any paid Apify plan is unlimited. See [Free tier vs paid usage](#free-tier-vs-paid-usage).
- **Clay table template available.** Pre-built table with 13 input columns, enrichment column, and 17 formula columns including ISBLANK wrappers for score fields. [Open the template →](https://app.clay.com/shared-table/share_0tfqupfMmmuotwVM5Sw)
- **v1.1.6 fixes.** Invalid scoring_config keys (gtm_role_count_above_10, signal_strength_high, funding_match) now log a warning instead of silently scoring 0. Actor.log.error crash fixed across all call sites. Input schema updated for Clay string coercion compatibility.

---

### Two ways to set up scoring

**JSON config mode.** Define exact weights per signal in a `scoring_config` object. Deterministic, auditable, no API key needed. You control exactly how much each signal is worth. Best for teams that have already defined their ICP criteria.

**Plain-English mode.** Describe your ICP in a sentence or two and provide an OpenAI or Anthropic API key. The actor calls GPT-4o-mini or Claude Haiku to generate a valid `scoring_config` automatically. Best for non-technical users who want to score leads without writing JSON.

If you provide both, the JSON config wins and the LLM call is skipped.

---

### How it works

Pass in pre-enriched company data (hiring signals, tech stack, headcount, funding, industry) along with a scoring config or ICP description. The actor evaluates each signal as true or false, applies the configured weights, and returns a score from 0 to 100 with a tier label.

No live scraping. No waiting for website crawls. Input data comes from Clay enrichment columns or from Actors 1 and 2 in the Mamba Labs suite. Scoring is fast and deterministic in JSON config mode.

---

### The Actor 1 + 2 + 6 workflow

Actor 6 input fields map directly to Actor 1 and Actor 2 output column names. This is intentional. Run them in sequence in Clay and pass outputs directly into Actor 6 with no column remapping.

**Step 1: Run Actor 1** ([GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper)) on your company list. It returns:
- `gtm_hiring_signal` (boolean): map to Actor 6 input `gtm_hiring_signal`
- `gtm_role_count` (integer): map to Actor 6 input `gtm_role_count`
- `signal_strength` (string: high/medium/low): map to Actor 6 input `signal_strength`

**Step 2: Run Actor 2** ([GTM Tech Stack Signal Scraper](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper)) on the same company list. It returns:
- `uses_hubspot` (boolean): map to Actor 6 input `uses_hubspot`
- `uses_salesforce` (boolean): map to Actor 6 input `uses_salesforce`
- `uses_clay` (boolean): map to Actor 6 input `uses_clay`
- `crm_detected` (string): map to Actor 6 input `crm_detected`
- `seq_tool_detected` (string): map to Actor 6 input `seq_tool_detected`

**Step 3: Add Clay native enrichment** columns for `headcount`, `funding_stage`, and `industry`. These are standard Clay enrichment fields, not actor outputs.

**Step 4: Run Actor 6** (this actor). Pass all the above as input fields using Clay's column token system. Set your `scoring_config` weights to reflect how much each signal matters for your ICP.

**Step 5: Filter** your Clay table on `icp_tier = A` or `lead_tag = priority` to get your send-ready list.

No other ICP scorer on the Apify Store is designed to receive these specific field names as input. This workflow is the fastest path from company list to scored outbound queue.

---

### scoring_config format

The `scoring_config` object has three parts:

- `weights`: maps signal names to integer point values. Must sum to exactly 100.
- `headcount_range`: an object with `min` and `max` for the headcount_in_range signal.
- `target_industries`: an array of industry strings for the industry_match signal.

Full example:

```json
{
  "scoring_config": {
    "weights": {
      "gtm_hiring_signal": 25,
      "uses_hubspot": 15,
      "uses_clay": 10,
      "headcount_in_range": 20,
      "recently_funded": 15,
      "industry_match": 15
    },
    "headcount_range": { "min": 50, "max": 500 },
    "target_industries": ["B2B Software", "SaaS", "Developer Tools"]
  }
}
````

Minimal 2-signal config:

```json
{
  "scoring_config": {
    "weights": {
      "gtm_hiring_signal": 60,
      "headcount_in_range": 40
    },
    "headcount_range": { "min": 100, "max": 1000 }
  }
}
```

Available signal keys: `gtm_hiring_signal`, `uses_hubspot`, `uses_salesforce`, `uses_clay`, `crm_detected`, `seq_tool_detected`, `headcount_in_range`, `recently_funded`, `industry_match`. Pick the ones that matter and distribute 100 points across them.

***

### Input schema

Provide either `scoring_config` or `icp_description`. One of the two is required.

| Field | Type | Required | Description |
|---|---|---|---|
| `company_domain` | string | Yes | Primary domain of the company to score. |
| `scoring_config` | object | No | JSON scoring weights config. Required if icp\_description is not provided. |
| `template` | string | No | Pre-built template: saas\_outbound, b2b\_services, fintech, smb\_local, enterprise. |
| `icp_description` | string | No | Plain-English ICP description. Requires llm\_api\_key. |
| `llm_api_key` | string | No | OpenAI or Anthropic API key. Required for icp\_description mode. Masked in Apify UI. |
| `llm_provider` | string | No | "openai" (default) or "anthropic". Ignored if scoring\_config is provided. |
| `company_name` | string | No | Display name of the company. |
| `gtm_hiring_signal` | boolean | No | Whether the company is hiring GTM roles. |
| `uses_hubspot` | boolean | No | HubSpot detected. |
| `uses_salesforce` | boolean | No | Salesforce detected. |
| `uses_clay` | boolean | No | Clay detected. |
| `crm_detected` | string | No | CRM platform detected. |
| `seq_tool_detected` | string | No | Sequencing tool detected. |
| `headcount` | integer | No | Current employee count. |
| `funding_stage` | string | No | Funding stage (seed, series\_a, series\_b, growth). |
| `industry` | string | No | The company's industry. |
| `previous_score` | integer | No | ICP score from a prior run. Enables delta tracking. |
| `include_explanation` | boolean | No | Add a score\_explanation string to output. Default false. |
| `min_score_to_output` | integer | No | Skip rows below this threshold. |
| `webhook_url` | string | No | POST each result to this URL after scoring. |

***

### Output schema

| Field | Type | Description |
|---|---|---|
| `company_domain` | string | Domain that was scored. |
| `company_name` | string | Company display name. |
| `icp_score` | integer | Final score 0-100. |
| `icp_tier` | string | A (80-100), B (60-79), C (40-59), D (0-39). |
| `lead_tag` | string | priority (A), nurture (B/C), disqualify (D). |
| `score_hiring` | integer | Points from hiring signals. |
| `score_tech_stack` | integer | Points from tech stack signals. |
| `score_headcount` | integer | Points from headcount signal. |
| `score_funding` | integer | Points from funding signal. |
| `score_industry` | integer | Points from industry signal. |
| `signals_matched` | string | Comma-separated signal keys that matched. |
| `signals_missing` | string | Comma-separated signal keys that did not match. |
| `scoring_config_used` | string | JSON string of the config applied. |
| `config_source` | string | "explicit" (JSON config) or "llm\_generated" (from icp\_description). |
| `previous_score` | integer | Echoed from input. Null if not provided. |
| `score_delta` | integer | Current score minus previous score. Null if no previous. |
| `score_direction` | string | "improving" (delta > 0), "declining" (delta < 0), "unchanged" (delta = 0), "no\_previous". |
| `score_explanation` | string | Human-readable breakdown. Present when include\_explanation is true. |
| `run_date` | string | ISO timestamp. |
| `error` | string | Error message if scoring failed. |

***

### Tracking score changes over time

This is the only ICP scorer on the Apify Store that tracks score change per company across runs.

Store `icp_score` from each run in your Clay table. On the next run, pass it as `previous_score`. The output includes `score_delta` (integer, can be negative) and `score_direction` ("improving", "declining", "unchanged", or "no\_previous"). Use `score_direction = improving` as a trigger for outbound timing, or filter on `score_delta > 10` to surface companies that just crossed a scoring threshold.

***

### lead\_tag values

Every output row includes a `lead_tag` field derived automatically from `icp_tier`. Values: "priority" for tier A, "nurture" for tier B or C, "disqualify" for tier D. Use these directly in Clay view filters, Instantly segment conditions, or Smartlead campaign triggers without writing a formula column.

***

### Sample output

**JSON config mode with delta:**

```json
{
  "company_domain": "linear.app",
  "company_name": "Linear",
  "icp_score": 80,
  "icp_tier": "A",
  "lead_tag": "priority",
  "score_hiring": 30,
  "score_tech_stack": 0,
  "score_headcount": 25,
  "score_funding": 25,
  "score_industry": 0,
  "signals_matched": "gtm_hiring_signal, headcount_in_range, recently_funded",
  "signals_missing": "uses_hubspot",
  "scoring_config_used": "{\"weights\":{\"gtm_hiring_signal\":30,\"uses_hubspot\":20,\"headcount_in_range\":25,\"recently_funded\":25},\"headcount_range\":{\"min\":50,\"max\":500}}",
  "config_source": "explicit",
  "previous_score": 65,
  "score_delta": 15,
  "score_direction": "improving",
  "run_date": "2026-04-15T12:00:00.000Z"
}
```

**LLM-generated config mode:**

```json
{
  "company_domain": "ramp.com",
  "company_name": "Ramp",
  "icp_score": 55,
  "icp_tier": "C",
  "lead_tag": "nurture",
  "score_hiring": 20,
  "score_tech_stack": 15,
  "score_headcount": 20,
  "score_funding": 0,
  "score_industry": 0,
  "signals_matched": "gtm_hiring_signal, uses_hubspot, headcount_in_range",
  "signals_missing": "recently_funded, industry_match",
  "scoring_config_used": "{\"weights\":{\"gtm_hiring_signal\":20,\"uses_hubspot\":15,\"headcount_in_range\":20,\"recently_funded\":25,\"industry_match\":20},\"headcount_range\":{\"min\":100,\"max\":1000},\"target_industries\":[\"B2B Software\",\"SaaS\",\"Fintech\"]}",
  "config_source": "llm_generated",
  "previous_score": null,
  "score_delta": null,
  "score_direction": "no_previous",
  "run_date": "2026-04-15T12:00:00.000Z"
}
```

***

### 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_0tfqupfMmmuotwVM5Sw)**

The template includes:

- 13 input columns mapped to Actor 1, Actor 2, and Clay native enrichment outputs
- A Run Apify Actor enrichment column with 13 pill inputs plus static target\_industries and scoring\_config
- 17 output formula columns with ISBLANK wrappers on score fields
- 7 sample companies scored against a SaaS-focused ICP config

#### Template columns

**Input columns (13 columns, your source data):**

| Column | Description |
|--------|-------------|
| Company Name | Company display name. Echoed in output. |
| Company Domain | Bare domain, e.g. stripe.com. The only required field. |
| GTM Hiring Signal | "true" or "false". From Actor 1 (GTM Hiring Signal Scraper) output. |
| GTM Role Count | Number of GTM roles found. From Actor 1 output. |
| Signal Strength | "high", "medium", or "low". From Actor 1 or Actor 2 output. |
| Uses HubSpot | "true" or "false". From Actor 2 (GTM Tech Stack Signal Scraper) output. |
| Uses Salesforce | "true" or "false". From Actor 2 output. |
| Uses Clay | "true" or "false". From Actor 2 output. |
| CRM Detected | CRM platform name (e.g. "Salesforce", "HubSpot") or empty. From Actor 2. |
| Seq Tool Detected | Sequencing tool name (e.g. "Outreach", "Apollo") or empty. From Actor 2. |
| Headcount | Company employee count. From Clay native enrichment or any headcount source. |
| Funding Stage | Exact format required: seed, series\_a, series\_b, series\_d, series\_i, growth, public, unknown. Case and format matter. See critical setup rules below. |
| Industry | Industry string. From Clay native enrichment. |

**Enrichment column (1 column):**

| Column | Description |
|--------|-------------|
| Run Apify Actor | Calls mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay with all 13 input columns as pills, plus static target\_industries and scoring\_config values. Returns raw JSON result. |

**Output formula columns (17 columns, extracted from Run Apify Actor):**

| Column | Description |
|--------|-------------|
| ICP Score | 0-100 weighted score. Uses ISBLANK wrapper so 0 displays as "0", not blank. |
| ICP Tier | A (80-100), B (60-79), C (40-59), D (0-39). |
| Lead Tag | "priority" (A), "nurture" (B), "monitor" (C), "disqualify" (D). |
| Score Hiring | Points earned from gtm\_hiring\_signal. ISBLANK wrapped. |
| Score Tech Stack | Points earned from uses\_hubspot + uses\_clay combined. ISBLANK wrapped. |
| Score Headcount | Points earned from headcount range match. ISBLANK wrapped. |
| Score Funding | Points earned from funding stage match. ISBLANK wrapped. |
| Score Industry | Points earned from industry match. ISBLANK wrapped. |
| Signals Matched | Comma-separated list of signals that scored points, with clean display names (e.g. "GTM Hiring Signal, HubSpot, Clay, Headcount, Funding, Industry"). |
| Signals Missing | Comma-separated list of signals with no data, with clean display names. |
| Score Explanation | LLM-generated explanation. Only populated in LLM mode with include\_explanation enabled. Empty in deterministic mode. |
| Config Source | "explicit" (JSON config), "template" (preset), or "llm" (LLM mode). |
| Score Delta | Difference from previous\_score. Only populated when previous\_score is provided. |
| Previous Score | The previous score passed in for delta comparison. Only populated when provided. |
| Score Direction | "improving", "declining", "stable", "new", or "no\_previous". |
| Error | Error message if the actor failed on this row. Empty on success. |
| Run Date | ISO timestamp of when the actor processed this row. |

**Columns that will be empty in the template (and why):**

Score Explanation is only populated in LLM mode. The template uses deterministic scoring\_config mode. Score Delta and Previous Score are only populated when you pass a previous\_score input, and the template rows are first-run scores with no previous score to compare. Error is empty when everything works correctly.

#### How to use this template

1. Open the template link and clone it to your Clay workspace.
2. Delete the 7 sample rows or keep them for reference.
3. Import your own company list. At minimum, populate the Company Domain column. All other input columns are optional.
4. Populate input columns from other sources. Run Actor 1 (GTM Hiring Signal Scraper) to get GTM Hiring Signal, GTM Role Count, Signal Strength. Run Actor 2 (GTM Tech Stack Signal Scraper) to get Uses HubSpot, Uses Salesforce, Uses Clay, CRM Detected, Seq Tool Detected. Use Clay native enrichment for Headcount and Industry. Funding Stage must be manually added or pulled from a funding data source in exact lowercase format (series\_a, series\_b, etc.).
5. Edit the scoring\_config in the Run Apify Actor enrichment column if your ICP differs from the template default (SaaS companies, 50-500 headcount, recently funded, using HubSpot or Clay).
6. Edit the target\_industries string if your target industries differ.
7. Run the enrichment column on all rows.
8. Sort or filter by ICP Score or ICP Tier to prioritize your outbound list.

#### Setting up the Run Apify Actor column from scratch

If building your own table instead of cloning the template, here is how to configure the enrichment column.

1. Add a "Run Apify Actor" column from Clay's enrichment menu.
2. Set the Actor ID to: `mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay`
3. In the Input Data field, build this JSON. Type each key in quotes (these are the actor's input field names, lowercase snake\_case). For values, type `/` to insert a column pill. Do NOT type column names manually as string values.

```
{
  "company_domain": "/Company Domain pill/",
  "company_name": "/Company Name pill/",
  "gtm_hiring_signal": "/GTM Hiring Signal pill/",
  "gtm_role_count": "/GTM Role Count pill/",
  "signal_strength": "/Signal Strength pill/",
  "uses_hubspot": "/Uses HubSpot pill/",
  "uses_salesforce": "/Uses Salesforce pill/",
  "uses_clay": "/Uses Clay pill/",
  "crm_detected": "/CRM Detected pill/",
  "seq_tool_detected": "/Seq Tool Detected pill/",
  "headcount": "/Headcount pill/",
  "funding_stage": "/Funding Stage pill/",
  "industry": "/Industry pill/",
  "target_industries": "SaaS, Software Development, Information Technology",
  "scoring_config": {"weights":{"gtm_hiring_signal":25,"uses_hubspot":15,"uses_clay":10,"headcount_in_range":20,"recently_funded":15,"industry_match":15},"headcount_range":{"min":50,"max":500},"funded_within_days":365}
}
```

Where `/Column Name pill/` means: type `"`, then hit `/`, search for that column name, click the pill, then type `"` to close the quotes. The last two fields (target\_industries and scoring\_config) are static values typed exactly as shown, not column pills.

#### Critical setup rules

These will break your table if ignored.

**1. Wrap every pill value in double quotes.** Type `"` before and after each pill. Without quotes, Clay sends bare values (e.g. `stripe.com` instead of `"stripe.com"`) and JSON parsing fails on Apify's side.

**2. target\_industries is a comma-separated string, not a JSON array.** The actor's input schema declares this as type string. Write `"target_industries": "SaaS, Software Development, Information Technology"` not `"target_industries": ["SaaS", "Software Development"]`.

**3. Toggle OFF optional pills.** Every pill has a blue toggle switch. Turn OFF the toggle for every pill except Company Domain. When the toggle is ON and a cell is empty, Clay blocks the entire request with "Some inputs missing." The actor handles null fields correctly on its end (scores 0, lists the signal in signals\_missing), but Clay never lets the request reach the actor if a toggled-on pill points to an empty cell.

**4. Do not use formula mode or JSON data mode** for the Input Data field. It does not work with Run Apify Actor. Use pill mode only (type `/` to insert column references).

**5. Funding Stage must be in exact lowercase format.** The actor expects: seed, series\_a, series\_b, series\_d, series\_i, growth, public, unknown. If your data has "Series B" or "Series D", the recently\_funded signal will not match and will show up in Signals Missing. Normalize your data before running.

**6. Score columns need ISBLANK wrappers.** Clay treats integer 0 as blank. Formula columns that extract score values (ICP Score, Score Hiring, Score Tech Stack, Score Headcount, Score Funding, Score Industry) need `IF(ISBLANK(value), "0", value)` so that a legitimate score of 0 displays as "0" instead of an empty cell.

***

### Pricing

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

| Volume | Cost |
|--------|------|
| 100 domains | $5.00 |
| 1,000 domains | $50.00 |
| 10,000 domains | $500.00 |

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

LLM mode uses your own OpenAI (GPT-4o-mini) or Anthropic (Claude Haiku) API key, approximately $0.001 to $0.003 per call billed directly to your API provider. JSON config mode has no LLM cost. Your key is masked in the Apify UI and redacted from run logs.

#### Free tier vs paid usage

| Plan | Limit |
|------|-------|
| **Free Apify plan** | **50 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 single-company Clay runs and larger batches both draw from the same monthly allowance. Only successfully scored results count toward the allowance; error rows do not. How it behaves when you hit the limit:

- **Within the monthly allowance:** every submitted company is scored normally.
- **A run that crosses the limit:** the remaining allowance is delivered, then one final notice row explains the cap and how to upgrade. The run still finishes successfully.
- **Already at the limit:** the run exits immediately with no results and an upgrade message in the run status.

This monthly cap applies to the per-result scoring cost only. The optional BYO-key LLM cost (the `icp_description` mode, billed directly by OpenAI or Anthropic to your own API key) is separate and is not affected by the free-tier cap.

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

***

### Known Limitations

- JSON config mode is fully deterministic. LLM mode may produce slightly different scoring\_config interpretations for the same description across runs.
- scoring\_config weights must sum to 100. The actor returns an error if they do not. Unrecognized signal keys are logged as warnings and skipped, they do not cause errors.
- Pre-enriched input only: this actor does not fetch signals on its own. Run Actors 1 and 2 first, or use the fetch\_signals option with an Apify token.
- signals\_missing will be populated for any input field that was null or absent. Review this field to identify data gaps before treating scores as final.
- signals\_missing can misclassify present-but-false fields. When a boolean field like uses\_hubspot is explicitly passed as "false", it may appear in signals\_missing even though the field was provided and evaluated correctly. This does not affect scoring (the signal correctly scores 0), but the signals\_missing list can be misleading.
- funding\_stage requires exact format and is not normalized. "Series B" does not match, only "series\_b" works. Same for all funding stages. Normalize your data in Clay with a formula column or find-and-replace before passing it to the actor.
- In LLM mode, the error message when neither scoring\_config nor icp\_description is provided says "Either scoring\_config or template is required." It should say "Either scoring\_config or icp\_description is required."

***

### 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.

***

### Part of the Mamba Labs GTM Signal Intelligence suite

Six composable, pay-per-event, Clay-ready company-intelligence actors. Each is also available as an MCP server for AI agents.

| Actor | Actor ID |
|---|---|
| GTM Hiring Signal Scraper | D7O1SA2EqwHGsGr1P |
| GTM Tech Stack Signal Enrichment | qyd7nNyqFPelQViBx |
| GTM Signals Aggregator | xKdRfnfFNkdMpFuNs |
| Job Board Keyword Signal Scanner | 4DvqpvhMR74NLcDDY |
| Domain to LinkedIn URL Resolver | 3HtnSaqPHOg1Qg5gx |
| ICP Fit Scorer | W161DT8W4kW55dMFh |

Shared ATS scraping logic is published as [@mambalabsdev/ats-scrapers](https://www.npmjs.com/package/@mambalabsdev/ats-scrapers).

### 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

Scores a single company against your ICP criteria and returns a numeric fit score from 0 to 100 along with a per-signal breakdown, a tier label (A-D), and a lead tag. It is the qualification step that sits at the end of the Mamba Labs GTM pipeline, after the data-collection actors have populated hiring, tech stack, headcount, and funding fields.

Example prompts:

- "Score how well stripe.com fits my ICP using these weights: gtm\_hiring\_signal 30, uses\_hubspot 20, headcount\_in\_range 25, recently\_funded 25."
- "Rate Linear against my ideal customer profile of B2B SaaS companies with 50 to 500 employees that recently raised funding."
- "Is ramp.com a good fit based on these criteria: uses HubSpot, hiring GTM roles, headcount 100 to 1000?"

#### 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-icp-scorer": {
      "url": "https://mcp.apify.com?tools=mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay"
    }
  }
}
```

**Bearer token:**

```json
{
  "mcpServers": {
    "mamba-labs-icp-scorer": {
      "url": "https://mcp.apify.com?tools=mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay",
      "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/icp-account-lead-scoring-fit-scorer-0-100-for-clay
```

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
```

#### What the output looks like

Flat JSON, one row per scored company, under 2KB. The most useful fields:

- `icp_score`: overall fit score from 0 to 100.
- `icp_tier`: A (80-100), B (60-79), C (40-59), or D (0-39).
- `lead_tag`: priority (A), nurture (B/C), or disqualify (D). Decision band ready for filters.
- `score_hiring`, `score_tech_stack`, `score_headcount`, `score_funding`, `score_industry`: per-criterion point breakdown.
- `signals_matched` and `signals_missing`: comma-separated lists of which signals scored and which did not.
- `config_source`: "explicit" when a JSON config was provided, "llm\_generated" when generated from an ICP description.
- `score_explanation`: human-readable summary of the scoring math. Present when `include_explanation` is true or in LLM mode.

#### Billing

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

#### Notes

The default mode is deterministic (no LLM call, no extra cost). Setting `icp_description` plus an `llm_api_key` switches to LLM mode, which adds 2 to 5 seconds per run and incurs an additional per-run API cost from your own LLM provider. For MCP usage, deterministic mode with a `scoring_config` is recommended unless natural-language summaries in the output are specifically needed.

#### Part of the Mamba Labs GTM Suite

This actor is part of the Mamba Labs GTM Suite. See all 6 actors at https://apify.com/mambalabs

***

Built by [Mamba Labs](https://apify.com/mambalabs).

# Actor input Schema

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

The primary domain of the company to score (e.g. clay.com).

## `company_name` (type: `string`):

Optional display name of the company.

## `scoring_config` (type: `object`):

JSON scoring weights config. Alternative to icp\_description. Required if icp\_description is not provided. Takes precedence over template if both are provided.

## `template` (type: `string`):

Pre-built scoring config. Used when scoring\_config is not provided. Options: saas\_outbound, b2b\_services, fintech, smb\_local, enterprise.

## `dataset_id` (type: `string`):

Apify dataset ID to fetch items from. Each item is processed as a lead to score. Works alongside or instead of inline JSON input.

## `csv_url` (type: `string`):

URL of a CSV file to fetch and parse. Each row becomes a lead to score. Works alongside inline JSON or dataset\_id.

## `fetch_signals` (type: `boolean`):

If true, call mambalabs/gtm-hiring-signal-scraper and mambalabs/gtm-tech-stack-signal-scraper for each domain before scoring. Requires apify\_token.

## `apify_token` (type: `string`):

Apify API token for fetch\_signals and dataset\_id features. Falls back to APIFY\_TOKEN env var.

## `include_explanation` (type: `boolean`):

If true, adds a score\_explanation string to each output row describing what matched, missed, and point values.

## `min_score_to_output` (type: `integer`):

If set, rows scoring below this threshold are skipped from output (not pushed to dataset). Skipped rows are logged only.

## `webhook_url` (type: `string`):

URL to POST each scored result to as JSON after pushing to dataset. Fire and forget.

## `previous_score` (type: `integer`):

Previous ICP score for this company. If provided, output includes score\_change and score\_trend fields.

## `gtm_hiring_signal` (type: `string`):

Whether the company is actively hiring for GTM/sales roles. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime.

## `gtm_role_count` (type: `string`):

Number of open GTM/sales roles. Accepts a numeric string (e.g. "155"). Sent as a string for Clay compatibility and coerced to integer at runtime.

## `uses_hubspot` (type: `string`):

Whether the company uses HubSpot. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime.

## `uses_salesforce` (type: `string`):

Whether the company uses Salesforce. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime.

## `uses_clay` (type: `string`):

Whether the company uses Clay. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime.

## `crm_detected` (type: `string`):

Whether any CRM was detected. Accepts a boolean-like string ("true"/"false") or any non-empty CRM name (e.g. "Salesforce"). Sent as a string for Clay compatibility and coerced to boolean at runtime. Auto-derived from uses\_hubspot/uses\_salesforce if not set.

## `seq_tool_detected` (type: `string`):

Whether a sales sequencing tool (Outreach, SalesLoft, Apollo, Lemlist) was detected. Accepts a boolean-like string ("true"/"false") or any non-empty tool name (e.g. "Outreach"). Sent as a string for Clay compatibility and coerced to boolean at runtime.

## `tech_stack` (type: `string`):

Comma-separated list of technologies. Used to auto-detect CRM/sequencing tools if booleans are not set.

## `headcount` (type: `string`):

Current employee headcount. Accepts a numeric string (e.g. "8000"). Sent as a string for Clay compatibility and coerced to integer at runtime.

## `headcount_min` (type: `integer`):

Minimum headcount for the headcount\_in\_range signal.

## `headcount_max` (type: `integer`):

Maximum headcount for the headcount\_in\_range signal.

## `headcount_in_range` (type: `boolean`):

Override: whether headcount is in your target range.

## `recently_funded` (type: `boolean`):

Override: whether the company was recently funded (within 18 months).

## `last_funding_date` (type: `string`):

ISO date of last funding round. Used to auto-detect recently\_funded if boolean is not set.

## `funding_stage` (type: `string`):

Funding stage (e.g. seed, series\_a, series\_b, growth). Used to infer recently\_funded.

## `industry` (type: `string`):

The company's industry.

## `industry_match` (type: `boolean`):

Override: whether the company's industry matches your target list.

## `target_industries` (type: `string`):

Comma-separated list of target industries for the industry\_match signal.

## `icp_description` (type: `string`):

Describe your target ICP in plain English. Requires llm\_api\_key. Alternative to scoring\_config for non-technical users.

## `llm_api_key` (type: `string`):

Your OpenAI or Anthropic API key. Required when using icp\_description mode. Transmitted to Apify infrastructure for the duration of the run only.

## `llm_provider` (type: `string`):

Which LLM provider to use when generating a scoring config from icp\_description. Accepts openai (GPT-4o-mini) or anthropic (claude-haiku-4-5-20251001). Ignored if scoring\_config is provided directly.

## Actor input object example

```json
{
  "company_domain": "stripe.com",
  "scoring_config": {
    "weights": {
      "gtm_hiring_signal": 25,
      "uses_hubspot": 15,
      "uses_clay": 10,
      "headcount_in_range": 20,
      "recently_funded": 15,
      "industry_match": 15
    }
  },
  "template": "saas_outbound",
  "fetch_signals": false,
  "include_explanation": false,
  "llm_provider": "openai"
}
```

# Actor output Schema

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

Company domain scored

## `company_name` (type: `string`):

Company display name

## `icp_score` (type: `string`):

ICP fit score (0-100)

## `icp_tier` (type: `string`):

Tier: A (80-100), B (60-79), C (40-59), D (0-39)

## `lead_tag` (type: `string`):

Auto-tag: priority (A), nurture (B/C), disqualify (D)

## `score_hiring` (type: `string`):

Points from hiring signals

## `score_tech_stack` (type: `string`):

Points from tech stack signals

## `score_headcount` (type: `string`):

Points from headcount signal

## `score_funding` (type: `string`):

Points from funding signal

## `score_industry` (type: `string`):

Points from industry signal

## `signals_matched` (type: `string`):

Comma-separated list of matched signal keys

## `signals_missing` (type: `string`):

Comma-separated list of missing signal keys

## `scoring_config_used` (type: `string`):

JSON-stringified scoring config used

## `config_source` (type: `string`):

Config source: explicit or llm\_generated

## `previous_score` (type: `string`):

Previous ICP score (from input)

## `score_delta` (type: `string`):

Change from previous score (current minus previous)

## `score_direction` (type: `string`):

improving / declining / unchanged / no\_previous

## `score_explanation` (type: `string`):

Human-readable scoring explanation

## `run_date` (type: `string`):

ISO timestamp of the scoring run

## `error` (type: `string`):

Error message if scoring failed

# 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 = {
    "company_domain": "stripe.com",
    "scoring_config": {
        "weights": {
            "gtm_hiring_signal": 25,
            "uses_hubspot": 15,
            "uses_clay": 10,
            "headcount_in_range": 20,
            "recently_funded": 15,
            "industry_match": 15
        }
    },
    "template": "saas_outbound"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay").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 = {
    "company_domain": "stripe.com",
    "scoring_config": { "weights": {
            "gtm_hiring_signal": 25,
            "uses_hubspot": 15,
            "uses_clay": 10,
            "headcount_in_range": 20,
            "recently_funded": 15,
            "industry_match": 15,
        } },
    "template": "saas_outbound",
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay").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 '{
  "company_domain": "stripe.com",
  "scoring_config": {
    "weights": {
      "gtm_hiring_signal": 25,
      "uses_hubspot": 15,
      "uses_clay": 10,
      "headcount_in_range": 20,
      "recently_funded": 15,
      "industry_match": 15
    }
  },
  "template": "saas_outbound"
}' |
apify call mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ICP & Account Lead Scoring: Fit Scorer 0-100 for Clay",
        "description": "Scores pre-enriched companies against your Ideal Customer Profile using weighted signals. Returns a 0 to 100 fit score, A to D tier, and per-signal breakdown. Deterministic and LLM modes. Built for Clay enrichment and batch processing. MCP-ready for Claude Desktop and AI agents.",
        "version": "1.1",
        "x-build-id": "0cq8fT4nMoIuPlLiG"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mambalabs~icp-account-lead-scoring-fit-scorer-0-100-for-clay/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mambalabs-icp-account-lead-scoring-fit-scorer-0-100-for-clay",
                "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~icp-account-lead-scoring-fit-scorer-0-100-for-clay/runs": {
            "post": {
                "operationId": "runs-sync-mambalabs-icp-account-lead-scoring-fit-scorer-0-100-for-clay",
                "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~icp-account-lead-scoring-fit-scorer-0-100-for-clay/run-sync": {
            "post": {
                "operationId": "run-sync-mambalabs-icp-account-lead-scoring-fit-scorer-0-100-for-clay",
                "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",
                "required": [
                    "company_domain"
                ],
                "properties": {
                    "company_domain": {
                        "title": "Company Domain",
                        "type": "string",
                        "description": "The primary domain of the company to score (e.g. clay.com)."
                    },
                    "company_name": {
                        "title": "Company Name",
                        "type": "string",
                        "description": "Optional display name of the company."
                    },
                    "scoring_config": {
                        "title": "Scoring Config",
                        "type": "object",
                        "description": "JSON scoring weights config. Alternative to icp_description. Required if icp_description is not provided. Takes precedence over template if both are provided."
                    },
                    "template": {
                        "title": "Scoring Template",
                        "enum": [
                            "saas_outbound",
                            "b2b_services",
                            "fintech",
                            "smb_local",
                            "enterprise"
                        ],
                        "type": "string",
                        "description": "Pre-built scoring config. Used when scoring_config is not provided. Options: saas_outbound, b2b_services, fintech, smb_local, enterprise."
                    },
                    "dataset_id": {
                        "title": "Dataset ID",
                        "type": "string",
                        "description": "Apify dataset ID to fetch items from. Each item is processed as a lead to score. Works alongside or instead of inline JSON input."
                    },
                    "csv_url": {
                        "title": "CSV URL",
                        "type": "string",
                        "description": "URL of a CSV file to fetch and parse. Each row becomes a lead to score. Works alongside inline JSON or dataset_id."
                    },
                    "fetch_signals": {
                        "title": "Fetch Signals",
                        "type": "boolean",
                        "description": "If true, call mambalabs/gtm-hiring-signal-scraper and mambalabs/gtm-tech-stack-signal-scraper for each domain before scoring. Requires apify_token.",
                        "default": false
                    },
                    "apify_token": {
                        "title": "Apify Token",
                        "type": "string",
                        "description": "Apify API token for fetch_signals and dataset_id features. Falls back to APIFY_TOKEN env var."
                    },
                    "include_explanation": {
                        "title": "Include Explanation",
                        "type": "boolean",
                        "description": "If true, adds a score_explanation string to each output row describing what matched, missed, and point values.",
                        "default": false
                    },
                    "min_score_to_output": {
                        "title": "Min Score to Output",
                        "type": "integer",
                        "description": "If set, rows scoring below this threshold are skipped from output (not pushed to dataset). Skipped rows are logged only."
                    },
                    "webhook_url": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "URL to POST each scored result to as JSON after pushing to dataset. Fire and forget."
                    },
                    "previous_score": {
                        "title": "Previous Score",
                        "type": "integer",
                        "description": "Previous ICP score for this company. If provided, output includes score_change and score_trend fields."
                    },
                    "gtm_hiring_signal": {
                        "title": "GTM Hiring Signal",
                        "type": "string",
                        "description": "Whether the company is actively hiring for GTM/sales roles. Accepts a boolean-like string (\"true\"/\"false\"). Sent as a string for Clay compatibility and coerced to boolean at runtime."
                    },
                    "gtm_role_count": {
                        "title": "GTM Role Count",
                        "type": "string",
                        "description": "Number of open GTM/sales roles. Accepts a numeric string (e.g. \"155\"). Sent as a string for Clay compatibility and coerced to integer at runtime."
                    },
                    "uses_hubspot": {
                        "title": "Uses HubSpot",
                        "type": "string",
                        "description": "Whether the company uses HubSpot. Accepts a boolean-like string (\"true\"/\"false\"). Sent as a string for Clay compatibility and coerced to boolean at runtime."
                    },
                    "uses_salesforce": {
                        "title": "Uses Salesforce",
                        "type": "string",
                        "description": "Whether the company uses Salesforce. Accepts a boolean-like string (\"true\"/\"false\"). Sent as a string for Clay compatibility and coerced to boolean at runtime."
                    },
                    "uses_clay": {
                        "title": "Uses Clay",
                        "type": "string",
                        "description": "Whether the company uses Clay. Accepts a boolean-like string (\"true\"/\"false\"). Sent as a string for Clay compatibility and coerced to boolean at runtime."
                    },
                    "crm_detected": {
                        "title": "CRM Detected",
                        "type": "string",
                        "description": "Whether any CRM was detected. Accepts a boolean-like string (\"true\"/\"false\") or any non-empty CRM name (e.g. \"Salesforce\"). Sent as a string for Clay compatibility and coerced to boolean at runtime. Auto-derived from uses_hubspot/uses_salesforce if not set."
                    },
                    "seq_tool_detected": {
                        "title": "Sequencing Tool Detected",
                        "type": "string",
                        "description": "Whether a sales sequencing tool (Outreach, SalesLoft, Apollo, Lemlist) was detected. Accepts a boolean-like string (\"true\"/\"false\") or any non-empty tool name (e.g. \"Outreach\"). Sent as a string for Clay compatibility and coerced to boolean at runtime."
                    },
                    "tech_stack": {
                        "title": "Tech Stack",
                        "type": "string",
                        "description": "Comma-separated list of technologies. Used to auto-detect CRM/sequencing tools if booleans are not set."
                    },
                    "headcount": {
                        "title": "Headcount",
                        "type": "string",
                        "description": "Current employee headcount. Accepts a numeric string (e.g. \"8000\"). Sent as a string for Clay compatibility and coerced to integer at runtime."
                    },
                    "headcount_min": {
                        "title": "Headcount Min",
                        "type": "integer",
                        "description": "Minimum headcount for the headcount_in_range signal."
                    },
                    "headcount_max": {
                        "title": "Headcount Max",
                        "type": "integer",
                        "description": "Maximum headcount for the headcount_in_range signal."
                    },
                    "headcount_in_range": {
                        "title": "Headcount In Range",
                        "type": "boolean",
                        "description": "Override: whether headcount is in your target range."
                    },
                    "recently_funded": {
                        "title": "Recently Funded",
                        "type": "boolean",
                        "description": "Override: whether the company was recently funded (within 18 months)."
                    },
                    "last_funding_date": {
                        "title": "Last Funding Date",
                        "type": "string",
                        "description": "ISO date of last funding round. Used to auto-detect recently_funded if boolean is not set."
                    },
                    "funding_stage": {
                        "title": "Funding Stage",
                        "type": "string",
                        "description": "Funding stage (e.g. seed, series_a, series_b, growth). Used to infer recently_funded."
                    },
                    "industry": {
                        "title": "Industry",
                        "type": "string",
                        "description": "The company's industry."
                    },
                    "industry_match": {
                        "title": "Industry Match",
                        "type": "boolean",
                        "description": "Override: whether the company's industry matches your target list."
                    },
                    "target_industries": {
                        "title": "Target Industries",
                        "type": "string",
                        "description": "Comma-separated list of target industries for the industry_match signal."
                    },
                    "icp_description": {
                        "title": "ICP Description",
                        "type": "string",
                        "description": "Describe your target ICP in plain English. Requires llm_api_key. Alternative to scoring_config for non-technical users."
                    },
                    "llm_api_key": {
                        "title": "LLM API Key",
                        "type": "string",
                        "description": "Your OpenAI or Anthropic API key. Required when using icp_description mode. Transmitted to Apify infrastructure for the duration of the run only."
                    },
                    "llm_provider": {
                        "title": "LLM Provider",
                        "enum": [
                            "openai",
                            "anthropic"
                        ],
                        "type": "string",
                        "description": "Which LLM provider to use when generating a scoring config from icp_description. Accepts openai (GPT-4o-mini) or anthropic (claude-haiku-4-5-20251001). Ignored if scoring_config is provided directly.",
                        "default": "openai"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
