# Job Posting Monitor Clay-Ready Hiring Signal Discovery (`mambalabs/gtm-job-discovery`) Actor

Keyword-driven job posting monitor that finds companies hiring for any role across job boards. Returns flat, Clay-ready, firmographic-enriched rows with company LinkedIn URL per posting.

- **URL**: https://apify.com/mambalabs/gtm-job-discovery.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** Lead generation, Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Job Posting Monitor Clay-Ready Hiring Signal Discovery

Find the companies hiring for any role right now. Give it keywords like `software engineer`, `product manager`, or `account executive`, and it scans job boards, deduplicates to one clean row per posting, filters out staffing agencies and freelance marketplaces, and enriches every company with its domain, LinkedIn URL, employee count, and industry. The output is a flat, Clay-ready dataset you can route straight into outreach.

This is the reverse of a domain-level ATS checker. You do not give it a company and ask "are they hiring?" You give it a role and ask "who is hiring for this?" It is built to replace a TheirStack plus Clay pipeline: keyword monitoring, company enrichment, and delta detection in one actor. Discovery runs on the SerpAPI google_jobs engine, so you bring a SerpAPI key (free tier covers 250 searches per month, well under the cost of a TheirStack subscription).

The keyword array is fully generic: any set of role titles works. Editorial and content hiring (`proofreader`, `copy editor`, `managing editor`) is one popular preset and ships as the default, but the same actor tracks engineering, sales, marketing, operations, or any other function just by changing the keywords.

### Features

- Keyword-driven discovery for any role via the SerpAPI google_jobs engine (Google Jobs coverage of Indeed, LinkedIn, Glassdoor, ZipRecruiter, and company career pages).
- One flat, deduplicated row per posting, keyed on company plus normalized job title. Clay-native, no nested JSON.
- Company firmographic enrichment baked in: domain, company LinkedIn URL, employee count, industry.
- Staffing and recruitment agency filtering on both company name and job description text.
- Freelance marketplace exclusion (Upwork, Fiverr, and similar) so you keep direct-employer signal only.
- Company type classification: direct_employer, staffing_agency, government, or unknown.
- Cross-run delta detection: re-runs only emit postings you have not seen before.
- Lookback window, company-size range, remote-only, and country filters.
- Self-contained: no Clay table and no TheirStack subscription. A SerpAPI key is the only external dependency.

### Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| keywords | array | yes | ["proofreader", "copy editor", "content editor"] | Role titles to search for. Any role works; the editorial default is one common preset. |
| country | string | no | United States | Geographic filter. |
| lookback_days | integer | no | 30 | Only return postings newer than this many days. |
| company_size_min | integer | no | null | Drop companies smaller than this (when size is known). |
| company_size_max | integer | no | null | Drop companies larger than this (when size is known). |
| exclude_staffing_agencies | boolean | no | true | Filter out staffing and recruitment agency postings. |
| exclude_freelance_marketplaces | boolean | no | true | Filter out postings from freelance marketplaces (Upwork, Fiverr, etc.). |
| freelance_marketplaces | array | no | Upwork, Fiverr, Freelancer, Toptal, PeoplePerHour, Guru, 99designs | Company names treated as freelance marketplaces; override or extend as needed. |
| remote_only | boolean | no | false | Only return remote postings. |
| previous_run_date | string | no | null | ISO date; only emit postings newer than this. |
| max_results | integer | no | 100 | Upper bound on raw postings scanned before filtering. |
| max_companies | integer | no | 40 | Cap on unique companies enriched per run. |
| serpapi_key | string | yes* | null | SerpAPI key for Google Jobs discovery. *Required unless a `SERPAPI_KEY` environment variable is set on the actor. |

The actor reads the key from the `serpapi_key` input first, then falls back to the `SERPAPI_KEY` environment variable. Without either, discovery returns nothing.

### Output

| Field | Type | Description | Example |
|-------|------|-------------|---------|
| company_name | string | Hiring company name. | Stripe |
| company_domain | string | Resolved canonical domain, or null. | stripe.com |
| company_linkedin_url | string | Company LinkedIn page, or null. | https://www.linkedin.com/company/stripe |
| employee_count | integer | Approximate headcount, or null. | 8000 |
| industry | string | Industry or sector, or null. | Financial Services |
| company_type | string | direct_employer, staffing_agency, government, unknown. | direct_employer |
| job_title | string | The role title. | Senior Software Engineer |
| job_url | string | Direct apply or posting URL. | https://boards.greenhouse.io/example/jobs/123 |
| posting_date | string | ISO date (YYYY-MM-DD), or null. | 2026-06-25 |
| source_board | string | google_jobs, greenhouse, lever, ashby. | google_jobs |
| location | string | Human-readable location, or null. | San Francisco, CA |
| is_remote | boolean | Remote flag, or null. | true |
| job_description_snippet | string | First 500 characters of the JD, or null. | We are seeking a backend engineer to... |
| matched_keyword | string | The searched keyword this posting matched. | software engineer |
| is_new_posting | boolean | True when not seen in a prior run. | true |
| run_date | string | ISO 8601 run timestamp. | 2026-07-01T14:06:22.297Z |

### Pricing

| Tier | Discount | Per result | Per 1K results |
|------|----------|-----------|----------------|
| Free (no plan) | 0% | $0.020 | $20.00 |
| Starter (Bronze) | ~5% | $0.019 | $19.00 |
| Scale (Silver) | ~10% | $0.018 | $18.00 |
| Business (Gold) | ~15% | $0.017 | $17.00 |

Free tier: 25 result rows per month included.

A result is one deduplicated, firmographic-enriched job posting. Enrichment sub-actor usage (identity, firmographics, LinkedIn) is billed through your own Apify account at each sub-actor's own rate, standard for fleet orchestrators. Google Jobs discovery is billed by SerpAPI against your own SerpAPI key.

### Usage Examples

#### Apify Console / API

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('mambalabs/gtm-job-discovery').call({
  keywords: ['software engineer', 'product manager'],
  country: 'United States',
  lookback_days: 30,
  exclude_staffing_agencies: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
````

Swap the `keywords` array for any function you want to monitor: sales (`account executive`, `sales development representative`), marketing (`growth marketer`, `demand generation`), operations, finance, or editorial and content (`proofreader`, `copy editor`, `managing editor`), which is one popular use case this actor was first built for.

#### Clay Integration

1. Add a "Write to Table" or "Enrichment" source and point it at this actor's dataset (or use the Apify Clay integration).
2. Map one Clay row per output row. Key columns: `company_name`, `company_domain`, `company_linkedin_url`, `job_title`, `posting_date`.
3. Use `company_linkedin_url` as the input to your LinkedIn outreach step, and `posting_date` plus `is_new_posting` to prioritize fresh signals.
4. Schedule the actor and pass `previous_run_date` (or rely on the built-in delta cache) so each Clay refresh only ingests new postings.

#### MCP Integration

An MCP wrapper for this actor is planned as part of the Mamba Labs GTM Suite. Until then, call it through the Apify MCP server or directly via the Apify API as shown above.

### Error Handling

| Condition | Behavior | Output |
|-----------|----------|--------|
| Discovery source returns nothing | Logs a warning, emits zero rows, exits cleanly. | Empty dataset. |
| Company name does not resolve to a domain | Row is still emitted with null domain and null firmographics. | company\_domain, employee\_count, industry null. |
| Firmographic or LinkedIn sub-actor fails | Logs structured error, continues with null enrichment fields. | Affected enrichment fields null. |
| Free-tier monthly cap reached | Exits before any paid work with an upgrade message. | No new rows. |
| KVS (usage or delta cache) unavailable | Fails open: proceeds without the cap or delta filter. | All postings treated as new. |

### Limitations

- Discovery depth is bounded by `max_results`; very high-volume keywords may need multiple runs or a tighter `lookback_days`.
- Company enrichment is capped per run by `max_companies` to bound sub-actor cost.
- `company_domain` and downstream enrichment depend on name-to-domain resolution; ambiguous or very small companies may not resolve.
- `employee_count` and `industry` coverage varies by company and is frequently null; the firmographic source only reports these when a company exposes them. The `company_size_min` / `company_size_max` filters apply only when a size is known. `company_linkedin_url` (the primary outreach field) resolves for the large majority of companies.
- Discovery requires a SerpAPI key (free tier: 250 searches per month). Google Jobs coverage excludes some regions where the widget is disabled (for example the EU).
- Posting dates from aggregated boards are often relative ("25 days ago") and are normalized to a best-effort ISO date.

***

**Part of the [Mamba Labs GTM Intelligence Suite](https://apify.com/mambalabs)**

| Actor | Actor ID |
|-------|----------|
| [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper) | D7O1SA2EqwHGsGr1P |
| [GTM Tech Stack Signal Enrichment](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper) | qyd7nNyqFPelQViBx |
| [GTM Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay) | xKdRfnfFNkdMpFuNs |
| [Job Board Keyword Signal Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner) | 4DvqpvhMR74NLcDDY |
| [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver) | 3HtnSaqPHOg1Qg5gx |
| [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay) | W161DT8W4kW55dMFh |
| [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker) | 0tVgxI7A6o9jMlxmc |
| [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher) | YlUtLWjfPpqykmB8g |
| [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper) | 4k6CCemkgBDz18m2h |
| [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver) | lr8fTRAmZCBZmuwwh |
| [Funding & Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner) | FS13X6dhQVgX3XOM6 |
| [Company Change-Event Feed](https://apify.com/mambalabs/company-change-event-feed) | oX44rS0fkEJ3rXLWe |
| [Job Posting Monitor](https://apify.com/mambalabs/gtm-job-discovery) | QCfICD9kOPiOdj5iI |

npm: [@mambalabsdev/ats-scrapers](https://www.npmjs.com/package/@mambalabsdev/ats-scrapers)

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

# Actor input Schema

## `keywords` (type: `array`):

Editorial / content role titles to search for across job boards.

## `country` (type: `string`):

Geographic filter, e.g. United States, United Kingdom, Canada.

## `lookback_days` (type: `integer`):

Only return postings newer than this many days.

## `company_size_min` (type: `integer`):

Optional. Drop companies with fewer employees than this (only applied when company size is known).

## `company_size_max` (type: `integer`):

Optional. Drop companies larger than this (only applied when company size is known).

## `exclude_staffing_agencies` (type: `boolean`):

Filter out staffing and recruitment agency postings using name and job-description heuristics.

## `exclude_freelance_marketplaces` (type: `boolean`):

Filter out postings where the company is a freelance marketplace (Upwork, Fiverr, etc.), which are noise for direct outreach.

## `freelance_marketplaces` (type: `array`):

Company names treated as freelance marketplaces and excluded when the toggle above is on. Defaults shown; override or extend as needed.

## `remote_only` (type: `boolean`):

Only return remote / work-from-home postings.

## `previous_run_date` (type: `string`):

Optional ISO date (e.g. 2026-06-01) of your last run. Only postings newer than this are emitted, on top of the built-in cross-run delta cache.

## `max_results` (type: `integer`):

Upper bound on raw postings pulled from the discovery source before filtering. Higher values cost more.

## `max_companies` (type: `integer`):

Cap on unique companies enriched per run (firmographics + LinkedIn). Bounds sub-actor cost.

## `serpapi_key` (type: `string`):

SerpAPI key used for Google Jobs discovery (get a free key at serpapi.com, 250 searches/month, no card). Required to produce results unless a SERPAPI\_KEY environment variable is set on the actor.

## `use_gio21` (type: `boolean`):

Best-effort fallback to the gio21 Google Jobs sub-actor when no SerpAPI key is available. Only works on Apify plans that permit running third-party public actors.

## `qa_test_mode` (type: `boolean`):

Internal QA fast-path. When true, the actor skips all sub-actor enrichment and emits a single summary row so automated checks complete well within the time budget. Not for normal use.

## Actor input object example

```json
{
  "keywords": [
    "proofreader",
    "copy editor",
    "content editor"
  ],
  "country": "United States",
  "lookback_days": 30,
  "exclude_staffing_agencies": true,
  "exclude_freelance_marketplaces": true,
  "freelance_marketplaces": [
    "Upwork",
    "Fiverr",
    "Freelancer",
    "Toptal",
    "PeoplePerHour",
    "Guru",
    "99designs"
  ],
  "remote_only": false,
  "max_results": 25,
  "max_companies": 40,
  "use_gio21": false,
  "qa_test_mode": false
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "proofreader",
        "copy editor",
        "content editor"
    ],
    "country": "United States",
    "lookback_days": 30,
    "exclude_staffing_agencies": true,
    "exclude_freelance_marketplaces": true,
    "freelance_marketplaces": [
        "Upwork",
        "Fiverr",
        "Freelancer",
        "Toptal",
        "PeoplePerHour",
        "Guru",
        "99designs"
    ],
    "max_results": 25,
    "max_companies": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/gtm-job-discovery").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 = {
    "keywords": [
        "proofreader",
        "copy editor",
        "content editor",
    ],
    "country": "United States",
    "lookback_days": 30,
    "exclude_staffing_agencies": True,
    "exclude_freelance_marketplaces": True,
    "freelance_marketplaces": [
        "Upwork",
        "Fiverr",
        "Freelancer",
        "Toptal",
        "PeoplePerHour",
        "Guru",
        "99designs",
    ],
    "max_results": 25,
    "max_companies": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/gtm-job-discovery").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 '{
  "keywords": [
    "proofreader",
    "copy editor",
    "content editor"
  ],
  "country": "United States",
  "lookback_days": 30,
  "exclude_staffing_agencies": true,
  "exclude_freelance_marketplaces": true,
  "freelance_marketplaces": [
    "Upwork",
    "Fiverr",
    "Freelancer",
    "Toptal",
    "PeoplePerHour",
    "Guru",
    "99designs"
  ],
  "max_results": 25,
  "max_companies": 40
}' |
apify call mambalabs/gtm-job-discovery --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Job Posting Monitor Clay-Ready Hiring Signal Discovery",
        "description": "Keyword-driven job posting monitor that finds companies hiring for any role across job boards. Returns flat, Clay-ready, firmographic-enriched rows with company LinkedIn URL per posting.",
        "version": "0.0",
        "x-build-id": "sJqcYHpEkot72bpzg"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mambalabs~gtm-job-discovery/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mambalabs-gtm-job-discovery",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/mambalabs~gtm-job-discovery/runs": {
            "post": {
                "operationId": "runs-sync-mambalabs-gtm-job-discovery",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/mambalabs~gtm-job-discovery/run-sync": {
            "post": {
                "operationId": "run-sync-mambalabs-gtm-job-discovery",
                "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": [
                    "keywords"
                ],
                "properties": {
                    "keywords": {
                        "title": "Role Keywords",
                        "type": "array",
                        "description": "Editorial / content role titles to search for across job boards.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "proofreader",
                            "copy editor",
                            "content editor"
                        ]
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Geographic filter, e.g. United States, United Kingdom, Canada.",
                        "default": "United States"
                    },
                    "lookback_days": {
                        "title": "Lookback Days",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Only return postings newer than this many days.",
                        "default": 30
                    },
                    "company_size_min": {
                        "title": "Minimum Employee Count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional. Drop companies with fewer employees than this (only applied when company size is known)."
                    },
                    "company_size_max": {
                        "title": "Maximum Employee Count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional. Drop companies larger than this (only applied when company size is known)."
                    },
                    "exclude_staffing_agencies": {
                        "title": "Exclude Staffing Agencies",
                        "type": "boolean",
                        "description": "Filter out staffing and recruitment agency postings using name and job-description heuristics.",
                        "default": true
                    },
                    "exclude_freelance_marketplaces": {
                        "title": "Exclude Freelance Marketplaces",
                        "type": "boolean",
                        "description": "Filter out postings where the company is a freelance marketplace (Upwork, Fiverr, etc.), which are noise for direct outreach.",
                        "default": true
                    },
                    "freelance_marketplaces": {
                        "title": "Freelance Marketplace Names",
                        "type": "array",
                        "description": "Company names treated as freelance marketplaces and excluded when the toggle above is on. Defaults shown; override or extend as needed.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "Upwork",
                            "Fiverr",
                            "Freelancer",
                            "Toptal",
                            "PeoplePerHour",
                            "Guru",
                            "99designs"
                        ]
                    },
                    "remote_only": {
                        "title": "Remote Only",
                        "type": "boolean",
                        "description": "Only return remote / work-from-home postings.",
                        "default": false
                    },
                    "previous_run_date": {
                        "title": "Previous Run Date",
                        "type": "string",
                        "description": "Optional ISO date (e.g. 2026-06-01) of your last run. Only postings newer than this are emitted, on top of the built-in cross-run delta cache."
                    },
                    "max_results": {
                        "title": "Max Postings To Scan",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Upper bound on raw postings pulled from the discovery source before filtering. Higher values cost more.",
                        "default": 100
                    },
                    "max_companies": {
                        "title": "Max Companies To Enrich",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Cap on unique companies enriched per run (firmographics + LinkedIn). Bounds sub-actor cost.",
                        "default": 40
                    },
                    "serpapi_key": {
                        "title": "SerpAPI Key",
                        "type": "string",
                        "description": "SerpAPI key used for Google Jobs discovery (get a free key at serpapi.com, 250 searches/month, no card). Required to produce results unless a SERPAPI_KEY environment variable is set on the actor."
                    },
                    "use_gio21": {
                        "title": "Use Google Jobs sub-actor fallback",
                        "type": "boolean",
                        "description": "Best-effort fallback to the gio21 Google Jobs sub-actor when no SerpAPI key is available. Only works on Apify plans that permit running third-party public actors.",
                        "default": false
                    },
                    "qa_test_mode": {
                        "title": "QA test mode",
                        "type": "boolean",
                        "description": "Internal QA fast-path. When true, the actor skips all sub-actor enrichment and emits a single summary row so automated checks complete well within the time budget. Not for normal use.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
