# Tech Stack & Hiring Signal Enricher (`coregent/tech-stack-hiring-signal-enricher`) Actor

Enrich company domains with public website technology signals (CMS, ecommerce, analytics, CRM, frontend, hosting/CDN) plus current hiring signals from public careers pages - no login, cookies, or paid APIs.

- **URL**: https://apify.com/coregent/tech-stack-hiring-signal-enricher.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.60 / 1,000 company-signal-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

## Tech Stack & Hiring Signal Enricher

![Tech Stack & Hiring Signal Enricher](https://raw.githubusercontent.com/coregentdevspace/tech-stack-hiring-signal-enricher-assets/main/thumbnail-tech-stack-hiring-signal-enricher.png)

Turn a list of **company domains** into one flat, CSV-ready row per company showing **what technologies the website appears to use** (CMS, ecommerce, analytics, CRM/marketing, frontend, hosting/CDN) **and whether the company is actively hiring** (careers page, public job board, open-role estimate, hiring departments). Every row carries a transparent, explainable **growth-signal score**. Built for **B2B sales, lead generation, agencies, tech recruiters, and market researchers**.

**No login, no cookies, no paid enrichment APIs.** The actor fetches each company's public homepage plus a small, cost-bounded set of public careers pages over HTTP and runs a local technology-signature dictionary. You pay one flat event per unique company row that passes your filters.

### ✨ Why this enricher

- **Two commercial signals in one row** — detected website technologies **plus** current hiring activity, without expensive contact enrichment or deep crawling.
- **Flat & CSV-friendly** — 32 flat fields, no nested objects. Drops straight into Sheets/Excel/CRMs.
- **Transparent non-AI scoring** — a deterministic 0–100 growth-signal score with `reason_tags` explaining exactly why.
- **Cost-safe by design** — homepage + up to `maxJobPagesPerCompany` careers probes only. No website crawling, no media downloads, no residential proxy.
- **Pay-Per-Event** — one flat `company-signal-result` event per saved unique company. Duplicates, filtered rows, and unreachable companies are never charged.

---

### 🚀 Quick start — sample inputs

#### Example 1 — companies + target technologies + hiring keywords

```json
{
    "companyUrls": ["https://www.canva.com", "https://www.atlassian.com", "hubspot.com"],
    "maxCompanies": 100,
    "targetTechnologies": ["hubspot", "react", "greenhouse"],
    "technologyFilterMode": "any",
    "hiringStatusFilter": "any",
    "jobKeywordFilters": ["engineer", "sales", "data"],
    "minSignalScore": 40,
    "includeHiringDetails": true,
    "maxJobPagesPerCompany": 3,
    "deduplicateResults": true,
    "proxyConfiguration": { "useApifyProxy": true }
}
````

#### Example 2 — pasted domain list, tech-only enrichment, custom residential proxy via your own provider

```json
{
    "companyDomainsText": "shopify.com\nstripe.com\nnotion.so\nfigma.com",
    "maxCompanies": 500,
    "includeHiringDetails": false,
    "includeNoTechDetected": false,
    "proxyConfiguration": {
        "useApifyProxy": false,
        "proxyUrls": ["http://user:pass@proxy.iproyal.com:12321"]
    }
}
```

> Provide **at least one** of `companyUrls` or `companyDomainsText`. If you provide both, they are merged and deduplicated by domain.

> The actor blocks Apify Residential proxy; if you need residential routing, supply your own provider via `proxyConfiguration.proxyUrls` as shown. See **🚦 Proxy policy** below.

***

### 📦 Output

The dataset has one view: **Tech stack & hiring signals** — a 32-column flat table.

![Tech Stack & Hiring Signal Enricher — all-fields table view](https://raw.githubusercontent.com/coregentdevspace/tech-stack-hiring-signal-enricher-assets/main/tech-stack-hiring-signal-enricher-output-all-fields-table-view.png)

#### Output fields (32)

**Identity & status:** `input_url`, `company_domain`, `homepage_url`, `company_name`, `page_title`, `http_status`, `final_url`, `source_pages_checked`, `status`, `error_message`, `scraped_at`

**Technology:** `tech_detected_count`, `detected_technologies`, `technology_categories`, `matched_target_technologies`, `cms`, `ecommerce_platform`, `analytics_tools`, `crm_marketing_tools`, `frontend_frameworks`, `hosting_cdn_tools`

**Hiring:** `career_page_found`, `career_page_url`, `job_board_platform`, `hiring_status`, `open_roles_estimate`, `job_keywords_matched`, `hiring_departments`, `top_job_titles_sample`

**Scoring:** `growth_signal_score`, `growth_signal_label`, `reason_tags`

Multi-value fields are pipe-separated (`HubSpot|React`).

#### Sample record — Tech stack & hiring signals

A real row from a live run (Figma — tech detected, a matched target technology, a public job board, and active hiring with departments and sample titles):

```json
{
    "input_url": "https://www.figma.com",
    "company_domain": "figma.com",
    "homepage_url": "https://www.figma.com/",
    "company_name": "Figma",
    "page_title": "Figma: The Collaborative Interface Design Tool",
    "http_status": 200,
    "final_url": "https://www.figma.com/",
    "tech_detected_count": 4,
    "detected_technologies": "AWS CloudFront|Netlify|Next.js|React",
    "technology_categories": "cdn|frontend|hosting",
    "matched_target_technologies": "react",
    "cms": null,
    "ecommerce_platform": null,
    "analytics_tools": "",
    "crm_marketing_tools": "",
    "frontend_frameworks": "Next.js|React",
    "hosting_cdn_tools": "Netlify|AWS CloudFront",
    "career_page_found": true,
    "career_page_url": "https://www.figma.com/careers/",
    "job_board_platform": "Greenhouse",
    "hiring_status": "actively_hiring",
    "open_roles_estimate": 167,
    "job_keywords_matched": "",
    "hiring_departments": "finance|engineering|operations|marketing|sales|support|hr",
    "top_job_titles_sample": "Distribution Partner Manager|Distribution Partner Manager (Singapore)|Distribution Partner Manager (Tokyo, Japan)|Product Partner Manager|Director, Business Systems",
    "growth_signal_score": 55,
    "growth_signal_label": "medium",
    "reason_tags": "tech_detected|matches_target_technology|career_page_found|actively_hiring|homepage_reachable|uses_awscloudfront|uses_netlify|uses_nextjs|uses_react|hiring_finance|hiring_engineering|hiring_operations|hiring_marketing|hiring_sales|hiring_support|hiring_hr",
    "source_pages_checked": 4,
    "status": "success",
    "error_message": null,
    "scraped_at": "2026-06-11T23:24:29.313Z"
}
```

***

### 🧠 What gets detected

Detection uses a small, high-value local signature dictionary — HTTP headers, `<script>` src URLs, `<meta generator>`, and HTML markers. No paid API, no external lookup.

| Category    | Technologies (V1)                                              |
| ----------- | ------------------------------------------------------------- |
| CMS         | WordPress, Webflow, Drupal, Squarespace, Wix                  |
| Ecommerce   | Shopify, WooCommerce, BigCommerce, Magento                    |
| Analytics   | Google Analytics, Google Tag Manager, Segment, Hotjar         |
| CRM/marketing | HubSpot, Marketo, Intercom, Drift, Salesforce, Pardot       |
| Frontend    | React, Next.js, Vue, Nuxt, Angular, Svelte                    |
| Hosting/CDN | Cloudflare, Vercel, Netlify, AWS CloudFront, Fastly           |
| Job boards  | Greenhouse, Lever, Workable, Ashby, SmartRecruiters, BambooHR |

***

### 🎯 Growth-signal score

Transparent rule-based score (0–100) computed only from visible scraped fields — no AI.

| Signal group            | Points | Detail                                                                 |
| ----------------------- | -----: | ---------------------------------------------------------------------- |
| Technology signal       |   ≤ 35 | +10 any tech · +10 CRM/marketing · +10 ecommerce · +5 frontend/hosting |
| Target technology match |   ≤ 20 | +20 all targets match (`all` mode) · +15 ≥1 match (`any` mode)         |
| Hiring signal           |   ≤ 30 | +10 career page · +15 actively hiring · +5 job-keyword match           |
| Data confidence         |   ≤ 15 | +10 homepage 2xx · +5 company name detected                            |

Score is capped at 100. **Labels**: `high` (80–100) · `medium` (55–79) · `low` (30–54) · `weak` (0–29).

`reason_tags` is a pipe-separated list explaining the score — e.g. `tech_detected`, `uses_hubspot`, `uses_react`, `career_page_found`, `actively_hiring`, `hiring_engineering`, `matches_target_technology`, `matches_job_keyword`, `homepage_reachable`.

***

### ⚙️ Filters

Filters apply after extraction and scoring, before any row is saved or charged.

| Filter                  | Effect                                                                                   |
| ----------------------- | ---------------------------------------------------------------------------------------- |
| `targetTechnologies` + `technologyFilterMode` | `any` keeps ≥1 match · `all` keeps full match · `off` disables. Empty target list = off. |
| `hiringStatusFilter`    | `actively_hiring` / `not_detected` / `any`.                                              |
| `minSignalScore`        | Keep only `growth_signal_score >= minSignalScore`.                                       |
| `includeNoTechDetected` | When `false`, drop companies with `tech_detected_count = 0`.                             |
| `deduplicateResults`    | Drop duplicate companies by normalized domain (recommended ON).                          |

***

### 💰 Pricing

**Pay-Per-Event**. One flat event per saved row (final per-event price is configured on the Apify console):

| Event                    | Charged when                                                                            |
| ------------------------ | --------------------------------------------------------------------------------------- |
| `company-signal-result`  | Once per unique company row that passed all filters and was successfully written to the dataset. |

So your bill is simply `results_saved × price_per_event`. The actor honors the user-configured per-run spending cap: it caps how many companies it processes up-front to what the limit can pay for, and stops cleanly when the cap is reached during charging.

Not charged: duplicates, filtered-out rows, and unreachable companies.

#### 🚦 Proxy policy

Use **Apify Datacenter** proxy or **no proxy** for normal runs — both work for public company websites at this actor's conservative concurrency.

**Apify Residential proxy is not supported.** The actor will fail at startup if `proxyConfiguration.apifyProxyGroups` includes `RESIDENTIAL`. Reason: in pay-per-event actors, residential bandwidth (~/GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.

If you genuinely need residential routing, supply your own residential provider via the proxy editor's **Custom proxy URLs** field — that traffic goes through your provider, not Apify:

```
http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777
```

***

### 📊 Run summary

After each run, a `RUN_SUMMARY` entry is written to the key-value store:

```json
{
    "inputs_total": 250,
    "unique_companies": 230,
    "successful_inputs": 190,
    "partial_inputs": 25,
    "failed_inputs": 15,
    "raw_results_found": 215,
    "results_saved": 180,
    "duplicates_removed": 20,
    "filtered_out": 35,
    "charged_events": 180,
    "charge_failures": 0,
    "blocked_requests": 8,
    "retry_count": 22,
    "tech_detected_companies": 160,
    "career_page_found_companies": 120,
    "actively_hiring_companies": 75,
    "runtime_seconds": 420,
    "scraped_at": "2026-06-09T00:00:00.000Z"
}
```

`charged_events` equals the number of successfully saved unique rows.

***

### 🚧 Limitations (V1)

- **Public data only**: homepage + a few public careers pages. No login, cookies, or deep crawling.
- **Lightweight detection**: a curated V1 signature dictionary, not a full BuiltWith-level history. It favors precision on common, high-value technologies.
- **Hiring discovery is shallow**: it inspects homepage careers links and probes up to `maxJobPagesPerCompany` likely paths. Some sites render job lists via JavaScript or gate them behind an applicant flow; those return `career_page_found` without a reliable role count.
- **No** contact/email extraction, people finding, screenshots, or AI scoring (by design).
- Partial rows are saved when the homepage is reachable but one enrichment branch fails.

***

### ❓ FAQ

**Do I need any login or cookies?**
No. The actor only fetches public homepages and public careers pages.

**How is `hiring_status` decided?**
`actively_hiring` when a careers page is found with visible open roles; `not_detected` when a careers page is found but no roles are visible; `unknown` when no careers page is found (or hiring discovery is off).

**Why is a technology missing?**
Detection is signature-based on the homepage only. Tools loaded lazily, server-side, or behind consent banners may not appear. The dictionary is intentionally small and high-precision in V1.

**Can I export to CSV?**
Yes — every field is flat. Use Apify's CSV/Excel export or the dataset API with `format=csv`.

***

### 🛠️ Technical notes

- **Stack**: Node.js 22 · Apify SDK 3 · Crawlee `CheerioCrawler` · Cheerio + native fetch. No browser.
- **Per company**: 1 homepage request + up to `maxJobPagesPerCompany` careers probes.
- **Concurrency**: `min=1`, `max=10` (conservative; tune after real runs).
- **Memory**: 1 GB min · 2 GB default · 4 GB max.
- **Proxy**: Apify Proxy enabled by default; custom configs accepted; Apify Residential rejected at startup.

# Actor input Schema

## `companyUrls` (type: `array`):

Company websites to enrich, for example "canva.com", "https://www.atlassian.com". Each item is normalized to a canonical domain and homepage URL. Provide at least one of Company URLs or Company domains (text).

## `companyDomainsText` (type: `string`):

Paste one domain or URL per line. Useful for large lists. Merged with Company URLs, then deduplicated by domain.

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

Maximum number of unique companies to process after deduplication. Range 1-5000.

## `maxJobPagesPerCompany` (type: `integer`):

How many public careers/job pages to probe per company (discovered links first, then guessed paths). 0 skips hiring discovery entirely. Range 0-5.

## `includeHiringDetails` (type: `boolean`):

Discover and parse public careers/job pages for hiring signals (careers page found, job-board platform, open-role estimate, visible job titles). Turn off for tech-only enrichment.

## `jobKeywordFilters` (type: `array`):

Role keywords to detect and tag in visible job listings, for example "engineer", "sales", "data". Used to populate job\_keywords\_matched and matches\_job\_keyword.

## `targetTechnologies` (type: `array`):

Technologies of interest, for example "hubspot", "shopify", "react". Used for matched\_target\_technologies and optional filtering. Names are matched case-insensitively against detected technologies.

## `technologyFilterMode` (type: `string`):

How target technologies filter results. 'any' keeps companies matching at least one; 'all' keeps only companies matching all; 'off' disables the filter. If no target technologies are supplied this is treated as 'off'.

## `hiringStatusFilter` (type: `string`):

Filter by hiring activity. 'actively\_hiring' keeps only companies with visible open roles; 'not\_detected' keeps companies without detected active hiring; 'any' keeps all.

## `minSignalScore` (type: `integer`):

Keep only companies with growth\_signal\_score at or above this value. Range 0-100.

## `includeNoTechDetected` (type: `boolean`):

When off, companies where no technology was detected are not saved or charged.

## `deduplicateResults` (type: `boolean`):

Remove duplicate companies by normalized domain before processing so you are not charged for duplicates.

## `proxyConfiguration` (type: `object`):

Apify Proxy configuration. Defaults to Apify Proxy enabled. Apify Residential is NOT supported and will fail the run at startup; if you need residential routing, supply your own provider via Custom proxy URLs (proxyUrls).

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.canva.com",
    "https://www.atlassian.com",
    "hubspot.com"
  ],
  "companyDomainsText": "",
  "maxCompanies": 100,
  "maxJobPagesPerCompany": 3,
  "includeHiringDetails": true,
  "jobKeywordFilters": [
    "engineer",
    "sales",
    "data"
  ],
  "targetTechnologies": [
    "hubspot",
    "react"
  ],
  "technologyFilterMode": "any",
  "hiringStatusFilter": "any",
  "minSignalScore": 0,
  "includeNoTechDetected": true,
  "deduplicateResults": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Flat 32-field table view of every company row pushed to the dataset: identity, detected website technologies (CMS, ecommerce, analytics, CRM/marketing, frontend, hosting/CDN), hiring signals (careers page, job board, open roles, departments), and the derived growth-signal score.

# 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 = {
    "companyUrls": [
        "https://www.canva.com",
        "https://www.atlassian.com",
        "hubspot.com"
    ],
    "companyDomainsText": "",
    "jobKeywordFilters": [
        "engineer",
        "sales",
        "data"
    ],
    "targetTechnologies": [
        "hubspot",
        "react"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/tech-stack-hiring-signal-enricher").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 = {
    "companyUrls": [
        "https://www.canva.com",
        "https://www.atlassian.com",
        "hubspot.com",
    ],
    "companyDomainsText": "",
    "jobKeywordFilters": [
        "engineer",
        "sales",
        "data",
    ],
    "targetTechnologies": [
        "hubspot",
        "react",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/tech-stack-hiring-signal-enricher").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 '{
  "companyUrls": [
    "https://www.canva.com",
    "https://www.atlassian.com",
    "hubspot.com"
  ],
  "companyDomainsText": "",
  "jobKeywordFilters": [
    "engineer",
    "sales",
    "data"
  ],
  "targetTechnologies": [
    "hubspot",
    "react"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/tech-stack-hiring-signal-enricher --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tech Stack & Hiring Signal Enricher",
        "description": "Enrich company domains with public website technology signals (CMS, ecommerce, analytics, CRM, frontend, hosting/CDN) plus current hiring signals from public careers pages - no login, cookies, or paid APIs.",
        "version": "1.0",
        "x-build-id": "gnJP7G2PAiXVwXIJ5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/coregent~tech-stack-hiring-signal-enricher/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-coregent-tech-stack-hiring-signal-enricher",
                "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/coregent~tech-stack-hiring-signal-enricher/runs": {
            "post": {
                "operationId": "runs-sync-coregent-tech-stack-hiring-signal-enricher",
                "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/coregent~tech-stack-hiring-signal-enricher/run-sync": {
            "post": {
                "operationId": "run-sync-coregent-tech-stack-hiring-signal-enricher",
                "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": {
                    "companyUrls": {
                        "title": "Company URLs / domains",
                        "type": "array",
                        "description": "Company websites to enrich, for example \"canva.com\", \"https://www.atlassian.com\". Each item is normalized to a canonical domain and homepage URL. Provide at least one of Company URLs or Company domains (text).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "companyDomainsText": {
                        "title": "Company domains (text)",
                        "type": "string",
                        "description": "Paste one domain or URL per line. Useful for large lists. Merged with Company URLs, then deduplicated by domain.",
                        "default": ""
                    },
                    "maxCompanies": {
                        "title": "Max companies",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of unique companies to process after deduplication. Range 1-5000.",
                        "default": 100
                    },
                    "maxJobPagesPerCompany": {
                        "title": "Max careers pages per company",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "How many public careers/job pages to probe per company (discovered links first, then guessed paths). 0 skips hiring discovery entirely. Range 0-5.",
                        "default": 3
                    },
                    "includeHiringDetails": {
                        "title": "Include hiring details",
                        "type": "boolean",
                        "description": "Discover and parse public careers/job pages for hiring signals (careers page found, job-board platform, open-role estimate, visible job titles). Turn off for tech-only enrichment.",
                        "default": true
                    },
                    "jobKeywordFilters": {
                        "title": "Job keyword filters",
                        "type": "array",
                        "description": "Role keywords to detect and tag in visible job listings, for example \"engineer\", \"sales\", \"data\". Used to populate job_keywords_matched and matches_job_keyword.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "targetTechnologies": {
                        "title": "Target technologies",
                        "type": "array",
                        "description": "Technologies of interest, for example \"hubspot\", \"shopify\", \"react\". Used for matched_target_technologies and optional filtering. Names are matched case-insensitively against detected technologies.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "technologyFilterMode": {
                        "title": "Technology filter mode",
                        "enum": [
                            "any",
                            "all",
                            "off"
                        ],
                        "type": "string",
                        "description": "How target technologies filter results. 'any' keeps companies matching at least one; 'all' keeps only companies matching all; 'off' disables the filter. If no target technologies are supplied this is treated as 'off'.",
                        "default": "any"
                    },
                    "hiringStatusFilter": {
                        "title": "Hiring status filter",
                        "enum": [
                            "any",
                            "actively_hiring",
                            "not_detected"
                        ],
                        "type": "string",
                        "description": "Filter by hiring activity. 'actively_hiring' keeps only companies with visible open roles; 'not_detected' keeps companies without detected active hiring; 'any' keeps all.",
                        "default": "any"
                    },
                    "minSignalScore": {
                        "title": "Minimum signal score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Keep only companies with growth_signal_score at or above this value. Range 0-100.",
                        "default": 0
                    },
                    "includeNoTechDetected": {
                        "title": "Include companies with no detected tech",
                        "type": "boolean",
                        "description": "When off, companies where no technology was detected are not saved or charged.",
                        "default": true
                    },
                    "deduplicateResults": {
                        "title": "Deduplicate by domain",
                        "type": "boolean",
                        "description": "Remove duplicate companies by normalized domain before processing so you are not charged for duplicates.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy configuration. Defaults to Apify Proxy enabled. Apify Residential is NOT supported and will fail the run at startup; if you need residential routing, supply your own provider via Custom proxy URLs (proxyUrls).",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
