Skip to main content
Glama

Score ICP Fit

score_icp_fit
Idempotent

Score a company against your ideal customer profile using weighted signals. Get a 0-100 ICP score, A-D tier, and per-signal breakdown as Clay-ready JSON.

Instructions

Score a company against your ideal customer profile (ICP) using weighted signals. Returns a 0 to 100 icp_score, an A to D icp_tier, and a per-signal breakdown as a flat, Clay-ready JSON row. Define your ICP with a template, scoring_config, or plain-English icp_description (which requires llm_api_key). Reads public data and writes nothing; requires an APIFY_TOKEN and consumes Apify credits per call.

Input Schema

NameRequiredDescriptionDefault
industryNoThe company's industry (from the Company Firmographic Enricher, Actor ID YlUtLWjfPpqykmB8g).
templateNoName of a prebuilt scoring config.
headcountNoCurrent employee headcount. Accepts a numeric string (e.g. "3000"). Sent as a string for Clay compatibility and coerced to integer at runtime.
job_countNoNumber of open jobs found, from the Job Board Keyword Signal Scanner (Actor ID 4DvqpvhMR74NLcDDY). Scores via active_hiring_volume when at or above min_job_count (default 3). Accepts a numeric string.
uses_clayNoWhether the company uses Clay. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime.
tech_stackNoComma-separated list of technologies. Used to auto-detect CRM/sequencing tools if booleans are not set.
has_twitterNoWhether a company X/Twitter profile was found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h). Contributes to social_presence. Accepts a boolean-like string.
hq_locationNoHeadquarters location from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g). Carried for reference; not currently scored.
llm_api_keyNoYour OpenAI or Anthropic key, used only with icp_description.
company_nameNoOptional display name of the company.
crm_detectedNoWhether 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.
founded_yearNoYear the company was founded, from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g). Carried for reference; not currently scored. Accepts a numeric string (e.g. "2015").
has_linkedinNoWhether a company LinkedIn page was found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h) or the Domain to LinkedIn URL Resolver (Actor ID 3HtnSaqPHOg1Qg5gx). Contributes to social_presence. Accepts a boolean-like string.
llm_providerNoLLM provider for icp_description: openai or anthropic.
uses_hubspotNoWhether the company uses HubSpot. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime.
employee_bandNoFirmographic employee band from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g), e.g. "201-500". Scores via employee_band_match when it is in target_employee_bands.
fetch_signalsNoIf true, the actor runs the GTM Hiring Signal Scraper and the GTM Tech Stack Signal Scraper for this company before scoring and fills any hiring or tech stack signal not supplied. Both bill your Apify account at their own Store prices. If a lookup fails, the row is marked degraded and names the missing signals.
funding_stageNoFunding stage (e.g. seed, series_a, series_b, growth). Used to infer recently_funded.
headcount_maxNoMaximum headcount for the headcount_in_range signal.
headcount_minNoMinimum headcount for the headcount_in_range signal.
company_domainYesThe primary domain of the company to score, e.g. clay.com
gtm_role_countNoNumber of open GTM/sales roles. Scores via the gtm_role_count_strong signal when at or above min_gtm_roles (default 2). Accepts a numeric string (e.g. "8"). Sent as a string for Clay compatibility and coerced to integer at runtime.
industry_matchNoOverride: whether the company's industry matches your target list.
max_charge_usdNoOptional spending cap for this call, in USD, passed to the actor as max_charge_usd. The run stops before any charge that would take it past this amount and keeps every row already charged. Leave empty to rely only on the maximum charge per run set on your Apify account.
previous_scoreNoPrevious ICP score for this company. If provided, output includes score_change and score_trend fields.
scoring_configNoJSON object of scoring weights.
icp_descriptionNoPlain-English ICP description. Requires llm_api_key.
recently_fundedNoOverride: whether the company was recently funded (within funded_within_days, default 540).
tier_thresholdsNoOptional. Minimum score for each tier as { "tier_a": number, "tier_b": number, "tier_c": number }. Scores at or above tier_a are A, tier_b are B, tier_c are C, else D. Defaults to 80 / 60 / 40.
total_followersNoTotal social followers across platforms, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h). Scores via strong_social_following when at or above min_total_followers (default 1000). Accepts a numeric string.
uses_salesforceNoWhether the company uses Salesforce. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime.
revenue_estimateNoEstimated annual revenue in dollars from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g). Scores via revenue_in_range. Accepts a numeric string (e.g. "50000000"). Coerced to integer at runtime.
gtm_hiring_signalNoWhether 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.
last_funding_dateNoISO date of last funding round (legacy field; latest_funding_date is preferred). Used to auto-detect recently_funded if the boolean is not set.
seq_tool_detectedNoWhether 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.
target_industriesNoComma-separated list of target industries for the industry_match signal.
funded_within_daysNoOptional. How recent a funding round must be to count for the recently_funded signal, in days. Defaults to 540 (18 months).
headcount_in_rangeNoOverride: whether headcount is in your target range.
include_explanationNoIf true, adds a score_explanation string to the output.
keyword_match_countNoNumber of target-keyword matches found, from the Job Board Keyword Signal Scanner (Actor ID 4DvqpvhMR74NLcDDY). Scores via keyword_signal_match when at or above min_keyword_matches (default 1). Accepts a numeric string.
latest_funding_dateNoISO date of the latest funding round (from C1 Funding & Press Signal Scanner when it ships). Drives recently_funded against funded_within_days.
min_score_to_outputNoIf set, rows scoring below this threshold are skipped from output (not pushed to dataset). Skipped rows are logged only.
latest_funding_amountNoDollar amount of the latest funding round (from C1 when it ships). Scores via well_funded when at or above min_funding_amount (default 1000000). Accepts a numeric string (e.g. "50000000").
social_platforms_foundNoNumber of official social platforms found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h). Scores via social_presence when at or above min_social_platforms (default 2). Accepts a numeric string.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.14.0
    • addedInput schema / properties / max_charge_usd
      Added value: +{
      +  "description": "Optional spending cap for this call, in USD, passed to the actor as max_charge_usd. The run stops before any charge that would take it past this amount and keeps every row already charged. Leave empty to rely only on the maximum charge per run set on your Apify account.",
      +  "minimum": 0,
      +  "type": "number"
      +}
  2. Changed35 schema fields changedv1.1.1
    • addedInput schema / properties / crm_detected
      Added value: +{
      +  "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.",
      +  "type": "string"
      +}
    • addedInput schema / properties / employee_band
      Added value: +{
      +  "description": "Firmographic employee band from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g), e.g. \"201-500\". Scores via employee_band_match when it is in target_employee_bands.",
      +  "type": "string"
      +}
    • changedInput schema / properties / fetch_signals / description
      Previous value: -"If true, the actor fetches hiring and tech-stack signals automatically before scoring."New value: +"If true, the actor runs the GTM Hiring Signal Scraper and the GTM Tech Stack Signal Scraper for this company before scoring and fills any hiring or tech stack signal not supplied. Both bill your Apify account at their own Store prices. If a lookup fails, the row is marked degraded and names the missing signals."
    • addedInput schema / properties / founded_year
      Added value: +{
      +  "description": "Year the company was founded, from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g). Carried for reference; not currently scored. Accepts a numeric string (e.g. \"2015\").",
      +  "type": "string"
      +}
    • addedInput schema / properties / funded_within_days
      Added value: +{
      +  "description": "Optional. How recent a funding round must be to count for the recently_funded signal, in days. Defaults to 540 (18 months).",
      +  "type": "integer"
      +}
    • addedInput schema / properties / funding_stage
      Added value: +{
      +  "description": "Funding stage (e.g. seed, series_a, series_b, growth). Used to infer recently_funded.",
      +  "type": "string"
      +}
    • addedInput schema / properties / gtm_hiring_signal
      Added value: +{
      +  "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.",
      +  "type": "string"
      +}
    • addedInput schema / properties / gtm_role_count
      Added value: +{
      +  "description": "Number of open GTM/sales roles. Scores via the gtm_role_count_strong signal when at or above min_gtm_roles (default 2). Accepts a numeric string (e.g. \"8\"). Sent as a string for Clay compatibility and coerced to integer at runtime.",
      +  "type": "string"
      +}
    • addedInput schema / properties / has_linkedin
      Added value: +{
      +  "description": "Whether a company LinkedIn page was found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h) or the Domain to LinkedIn URL Resolver (Actor ID 3HtnSaqPHOg1Qg5gx). Contributes to social_presence. Accepts a boolean-like string.",
      +  "type": "string"
      +}
    • addedInput schema / properties / has_twitter
      Added value: +{
      +  "description": "Whether a company X/Twitter profile was found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h). Contributes to social_presence. Accepts a boolean-like string.",
      +  "type": "string"
      +}
    • addedInput schema / properties / headcount
      Added value: +{
      +  "description": "Current employee headcount. Accepts a numeric string (e.g. \"3000\"). Sent as a string for Clay compatibility and coerced to integer at runtime.",
      +  "type": "string"
      +}
    • addedInput schema / properties / headcount_in_range
      Added value: +{
      +  "description": "Override: whether headcount is in your target range.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / headcount_max
      Added value: +{
      +  "description": "Maximum headcount for the headcount_in_range signal.",
      +  "type": "integer"
      +}
    • addedInput schema / properties / headcount_min
      Added value: +{
      +  "description": "Minimum headcount for the headcount_in_range signal.",
      +  "type": "integer"
      +}
    • addedInput schema / properties / hq_location
      Added value: +{
      +  "description": "Headquarters location from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g). Carried for reference; not currently scored.",
      +  "type": "string"
      +}
    • addedInput schema / properties / industry
      Added value: +{
      +  "description": "The company's industry (from the Company Firmographic Enricher, Actor ID YlUtLWjfPpqykmB8g).",
      +  "type": "string"
      +}
    • addedInput schema / properties / industry_match
      Added value: +{
      +  "description": "Override: whether the company's industry matches your target list.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / job_count
      Added value: +{
      +  "description": "Number of open jobs found, from the Job Board Keyword Signal Scanner (Actor ID 4DvqpvhMR74NLcDDY). Scores via active_hiring_volume when at or above min_job_count (default 3). Accepts a numeric string.",
      +  "type": "string"
      +}
    • addedInput schema / properties / keyword_match_count
      Added value: +{
      +  "description": "Number of target-keyword matches found, from the Job Board Keyword Signal Scanner (Actor ID 4DvqpvhMR74NLcDDY). Scores via keyword_signal_match when at or above min_keyword_matches (default 1). Accepts a numeric string.",
      +  "type": "string"
      +}
    • addedInput schema / properties / last_funding_date
      Added value: +{
      +  "description": "ISO date of last funding round (legacy field; latest_funding_date is preferred). Used to auto-detect recently_funded if the boolean is not set.",
      +  "type": "string"
      +}
    • addedInput schema / properties / latest_funding_amount
      Added value: +{
      +  "description": "Dollar amount of the latest funding round (from C1 when it ships). Scores via well_funded when at or above min_funding_amount (default 1000000). Accepts a numeric string (e.g. \"50000000\").",
      +  "type": "string"
      +}
    • addedInput schema / properties / latest_funding_date
      Added value: +{
      +  "description": "ISO date of the latest funding round (from C1 Funding & Press Signal Scanner when it ships). Drives recently_funded against funded_within_days.",
      +  "type": "string"
      +}
    • addedInput schema / properties / min_score_to_output
      Added value: +{
      +  "description": "If set, rows scoring below this threshold are skipped from output (not pushed to dataset). Skipped rows are logged only.",
      +  "type": "integer"
      +}
    • addedInput schema / properties / previous_score
      Added value: +{
      +  "description": "Previous ICP score for this company. If provided, output includes score_change and score_trend fields.",
      +  "type": "integer"
      +}
    • addedInput schema / properties / recently_funded
      Added value: +{
      +  "description": "Override: whether the company was recently funded (within funded_within_days, default 540).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / revenue_estimate
      Added value: +{
      +  "description": "Estimated annual revenue in dollars from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g). Scores via revenue_in_range. Accepts a numeric string (e.g. \"50000000\"). Coerced to integer at runtime.",
      +  "type": "string"
      +}
    • addedInput schema / properties / seq_tool_detected
      Added value: +{
      +  "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.",
      +  "type": "string"
      +}
    • addedInput schema / properties / social_platforms_found
      Added value: +{
      +  "description": "Number of official social platforms found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h). Scores via social_presence when at or above min_social_platforms (default 2). Accepts a numeric string.",
      +  "type": "string"
      +}
    • addedInput schema / properties / target_industries
      Added value: +{
      +  "description": "Comma-separated list of target industries for the industry_match signal.",
      +  "type": "string"
      +}
    • addedInput schema / properties / tech_stack
      Added value: +{
      +  "description": "Comma-separated list of technologies. Used to auto-detect CRM/sequencing tools if booleans are not set.",
      +  "type": "string"
      +}
    • addedInput schema / properties / tier_thresholds
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Optional. Minimum score for each tier as { \"tier_a\": number, \"tier_b\": number, \"tier_c\": number }. Scores at or above tier_a are A, tier_b are B, tier_c are C, else D. Defaults to 80 / 60 / 40.",
      +  "type": "object"
      +}
    • addedInput schema / properties / total_followers
      Added value: +{
      +  "description": "Total social followers across platforms, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h). Scores via strong_social_following when at or above min_total_followers (default 1000). Accepts a numeric string.",
      +  "type": "string"
      +}
    • addedInput schema / properties / uses_clay
      Added value: +{
      +  "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.",
      +  "type": "string"
      +}
    • addedInput schema / properties / uses_hubspot
      Added value: +{
      +  "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.",
      +  "type": "string"
      +}
    • addedInput schema / properties / uses_salesforce
      Added value: +{
      +  "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.",
      +  "type": "string"
      +}
  3. First observedv1.0.3

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (destructiveHint=false, idempotentHint=true, openWorldHint=true), so the bar is lower, and the description still adds real behavioral context: it requires an APIFY_TOKEN and consumes Apify credits per call, which matters for an agent deciding to invoke it. It also declares 'reads public data and writes nothing', which sits in mild tension with readOnlyHint=false (the schema's fetch_signals spawns billable sub-actors), but this reads as credit/spend semantics rather than a genuine contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, all front-loaded: purpose and outputs first, then ICP configuration, then operational requirements. Every sentence carries information the agent needs and none repeats the title or name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 44 parameters, no output schema, and nested objects, the description does well to state the return shape inline and to disclose cost and auth requirements. It omits the degraded-row / fetch_signals behavior, but that is documented in the schema, so the omission is acceptable rather than a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already explains every one of the 44 parameters in detail. The description adds only the cross-parameter dependency that icp_description needs llm_api_key; it does not summarize the signal-override inputs or the thresholds. Adequate but not additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Score a company against your ideal customer profile') and immediately enumerates the concrete outputs (0-100 icp_score, A-D icp_tier, per-signal breakdown). It is clearly distinguishable from sibling enrichment tools like enrich_company_firmographics or aggregate_gtm_signals, which gather signals rather than score them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives useful guidance on the three ways to define an ICP (template, scoring_config, icp_description) and notes that icp_description requires llm_api_key. However, it never states when to prefer this tool over the sibling signal-gathering tools, nor what prerequisites (e.g. already-enriched firmographics) are expected. Usage is implied rather than routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.