# Hiring Signals Monitor (`almoutasem_nabil/hiring-signals-monitor`) Actor

Monitor a list of companies' career pages through their ATS APIs (Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters and more) and get every open role normalized, plus change events: new roles, removed roles, hiring surges and new functions.

- **URL**: https://apify.com/almoutasem\_nabil/hiring-signals-monitor.md
- **Developed by:** [Al Moutasem Nabil](https://apify.com/almoutasem_nabil) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Hiring Signals Monitor

**Watch a list of companies and know the moment their hiring changes.** Give the Actor company career pages; it reads each one through the applicant tracking system's public API (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Workday and more), normalizes every open role, and on repeat runs reports exactly what changed: new roles, removed roles, hiring surges and new functions a company started hiring for.

Hiring is a buying signal for sales teams, a business-development signal for recruiting agencies and a strategy signal for investors and competitors. Job-board scrapers give you a pile of postings. This Actor gives you **a diff over the accounts you care about**, ready for Slack, email or your CRM.

### Who is it for

- **B2B sales teams** watching target accounts: a company that just opened five sales roles in Riyadh is expanding there; a company that started hiring data engineers is a new buyer for data tooling.
- **Recruiting agencies** spotting clients who are hiring for a function they never hired for before, or whose open roles keep growing.
- **Investors and analysts** tracking portfolio companies and competitors: headcount plans, geographic expansion, senior leadership hires.
- **Competitive intelligence** teams: which teams a rival is building, which they are closing.
- **Job seekers** watching a shortlist of dream companies for the exact role to appear.

### What makes it different

- **Company-list monitoring with change detection.** A compact snapshot per watch list is kept between runs; every run emits `job_added`, `job_removed`, `job_updated`, `hiring_surge`, `new_function` and `company_error` events.
- **ATS APIs, not HTML scraping.** Twelve ATS integrations read the same public JSON/XML endpoints the career pages themselves use, so data is fresh, complete and stable. HTML parsing is only a fallback for unknown career sites.
- **Auto-detection.** Paste a careers URL or even just the company website; the Actor finds the ATS by URL pattern, by scanning the page for embedded ATS references, or by verifying a guessed board id. No configuration per company.
- **Normalized records.** Function (13 classes) and seniority (10 levels) from rule-based classification, ISO country codes, remote/hybrid/onsite, salary when the ATS exposes it. No LLM, so classification adds zero cost per record.
- **Per-company isolation.** One unreachable ATS becomes a `company_error` event that carries the previous job count, and never fails the run.
- **No personal data.** Recruiter names, emails and phone numbers are dropped even when the ATS returns them.

### Supported ATS

| ATS                              | Data source                                                         | Detection                                                                         |
| -------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| Greenhouse                       | Job Board API                                                       | `boards.greenhouse.io/{token}`, `job-boards.greenhouse.io/{token}`, embed scripts |
| Lever                            | Postings API                                                        | `jobs.lever.co/{company}`                                                         |
| Ashby                            | Posting API (with compensation)                                     | `jobs.ashbyhq.com/{board}`                                                        |
| Workable                         | Widget API                                                          | `apply.workable.com/{subdomain}`                                                  |
| SmartRecruiters                  | Posting API (paginated)                                             | `careers.smartrecruiters.com/{Company}`                                           |
| Recruitee                        | Offers API                                                          | `{company}.recruitee.com`                                                         |
| Personio                         | Public XML feed                                                     | `{company}.jobs.personio.de`                                                      |
| BambooHR                         | Careers list JSON                                                   | `{company}.bamboohr.com/careers`                                                  |
| Breezy HR                        | Public JSON                                                         | `{company}.breezy.hr`                                                             |
| Workday                          | CXS jobs endpoint (paginated)                                       | `{tenant}.wd{N}.myworkdayjobs.com/{site}`                                         |
| Teamtailor                       | RSS feed                                                            | `{company}.teamtailor.com` or custom career domains                               |
| Rippling, Jobvite, iCIMS, JazzHR | HTML / JSON-LD                                                      | URL patterns                                                                      |
| Anything else                    | JSON-LD `JobPosting` or job links on the page (`confidence: "low"`) | fallback                                                                          |

### Input

| Field                 | Type    | Default          | Description                                                                                       |
| --------------------- | ------- | ---------------- | ------------------------------------------------------------------------------------------------- |
| `companies`           | array   | required         | Careers URLs as strings, or objects `{ name, careersUrl, website, ats, atsIdentifier }`.          |
| `trackingId`          | string  | –                | Name of the watch list; snapshots are stored under it. Required in change mode.                   |
| `emitChangesOnly`     | boolean | `false`          | Output change events instead of every open role.                                                  |
| `emitBaselineAsAdded` | boolean | `false`          | On the first run for a `trackingId`, emit every role as `job_added` instead of a silent baseline. |
| `surgeThreshold`      | integer | `5`              | New roles at one company in one run that trigger `hiring_surge`.                                  |
| `includeDescription`  | boolean | `false`          | Add the plain-text description (extra requests on SmartRecruiters and Workday).                   |
| `filters`             | object  | –                | `functions[]`, `countries[]` (ISO-2), `seniority[]`, `titleKeywords[]`, `excludeTitleKeywords[]`. |
| `maxJobsPerCompany`   | integer | `0`              | Cap per company (0 = unlimited).                                                                  |
| `maxConcurrency`      | integer | `10`             | Companies checked in parallel.                                                                    |
| `proxyConfiguration`  | object  | Apify datacenter | Proxies for the requests.                                                                         |

**Snapshot mode** (every open role, once):

```json
{
    "companies": [
        { "name": "Tamara", "careersUrl": "https://boards.greenhouse.io/tamara", "website": "https://tamara.co" },
        { "name": "Ziina", "careersUrl": "https://jobs.ashbyhq.com/ziina", "website": "https://ziina.com" },
        "https://jobs.lever.co/nium",
        "https://apply.workable.com/salla",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "filters": { "countries": ["AE", "SA"], "functions": ["engineering", "sales"] }
}
```

**Change mode** (schedule this daily):

```json
{
    "companies": [
        "https://boards.greenhouse.io/tamara",
        "https://jobs.ashbyhq.com/ziina",
        "https://jobs.lever.co/nium"
    ],
    "trackingId": "gulf-fintech-accounts",
    "emitChangesOnly": true,
    "surgeThreshold": 5
}
```

The first run under a new `trackingId` records the baseline silently (set `emitBaselineAsAdded` to get every role as `job_added` instead). Every later run emits only what changed.

### Output

**Snapshot mode**: one item per open role. A real record from a Gulf fintech on Greenhouse:

```json
{
    "company": "Tamara",
    "companyWebsite": "https://tamara.co",
    "ats": "greenhouse",
    "atsIdentifier": "tamara",
    "jobId": "4683204101",
    "title": "Application Support Engineer",
    "url": "https://job-boards.eu.greenhouse.io/tamara/jobs/4683204101",
    "department": null,
    "team": null,
    "location": {
        "raw": "Saudi Arabia",
        "city": null,
        "region": null,
        "country": "SA",
        "remote": "unknown"
    },
    "function": "engineering",
    "seniority": "mid",
    "employmentType": null,
    "postedAt": "2025-11-13T15:49:52.000Z",
    "salary": null,
    "firstSeenAt": "2026-09-05T17:05:54.732Z",
    "lastSeenAt": "2026-09-05T17:05:54.732Z",
    "confidence": "high"
}
```

**Change mode**: one item per change event. These are real items from the proof run (the snapshot was edited by hand to remove roles, so the next run reports them as added):

`hiring_surge`, when a company added at least `surgeThreshold` roles in one run:

```json
{
    "type": "hiring_surge",
    "company": "Tamara",
    "companyWebsite": "https://tamara.co",
    "ats": "greenhouse",
    "trackingId": "proof-run",
    "observedAt": "2026-09-05T17:06:07.168Z",
    "count": 6,
    "threshold": 5,
    "titles": [
        "AML Transaction Monitoring Ops - Builders Program - (Emirati National)",
        "Application Support Engineer",
        "Associate Accountant - Builders Program - (Emirati National)",
        "Associate Data Analyst - Builders Program - (Emirati National)",
        "Associate Data Scientist - Builders Program - (Emirati National)",
        "Collections Advisor"
    ]
}
```

`new_function`, when a company now has roles in a function it had none in before:

```json
{
    "type": "new_function",
    "company": "Tamara",
    "companyWebsite": "https://tamara.co",
    "ats": "greenhouse",
    "trackingId": "proof-run",
    "observedAt": "2026-09-05T17:06:07.168Z",
    "function": "data",
    "count": 2,
    "titles": [
        "Associate Data Analyst - Builders Program - (Emirati National)",
        "Associate Data Scientist - Builders Program - (Emirati National)"
    ]
}
```

`job_added` (the full normalized job is attached; `job_removed` attaches the compact snapshot entry instead):

```json
{
    "type": "job_added",
    "company": "Ziina",
    "companyWebsite": "https://ziina.com",
    "ats": "ashby",
    "trackingId": "proof-run",
    "observedAt": "2026-09-05T17:06:07.168Z",
    "job": {
        "jobId": "b52d240f-2ccb-4aea-800b-623e9ca8ae09",
        "title": "Backend Engineer, Payments Platform",
        "url": "https://jobs.ashbyhq.com/ziina/b52d240f-2ccb-4aea-800b-623e9ca8ae09",
        "department": "Engineering",
        "team": "Payments Platform",
        "location": {
            "raw": "Dubai",
            "city": "Dubai",
            "region": null,
            "country": "AE",
            "remote": "onsite"
        },
        "function": "engineering",
        "seniority": "mid",
        "employmentType": "FullTime",
        "postedAt": "2026-08-12T05:44:50.125Z",
        "firstSeenAt": "2026-09-05T17:06:07.168Z",
        "confidence": "high"
    }
}
```

`job_updated`, with the fields that changed:

```json
{
    "type": "job_updated",
    "company": "Salla",
    "companyWebsite": "https://salla.sa",
    "ats": "workable",
    "trackingId": "proof-run",
    "observedAt": "2026-09-05T17:06:07.168Z",
    "job": {
        "jobId": "B656D5F0F3",
        "title": "Accountant (Shipping or Logistic)",
        "url": "https://apply.workable.com/j/B656D5F0F3",
        "location": {
            "raw": "Makkah, Makkah Province, Saudi Arabia",
            "city": "Makkah",
            "region": "Makkah Province",
            "country": "SA",
            "remote": "unknown"
        },
        "function": "finance",
        "seniority": "mid"
    },
    "before": {
        "title": "OLD TITLE Accountant (Shipping or Logistic)",
        "location": "Makkah, Makkah Province, Saudi Arabia",
        "seniority": "mid",
        "function": "finance"
    },
    "after": {
        "title": "Accountant (Shipping or Logistic)",
        "location": "Makkah, Makkah Province, Saudi Arabia",
        "seniority": "mid",
        "function": "finance"
    }
}
```

`job_removed`:

```json
{
    "type": "job_removed",
    "company": "Lucidya",
    "companyWebsite": "https://lucidya.com",
    "ats": "workable",
    "trackingId": "proof-run",
    "observedAt": "2026-09-05T17:06:07.168Z",
    "job": {
        "title": "Ghost role",
        "location": "Riyadh",
        "function": "other",
        "seniority": "mid",
        "hash": "ffff",
        "firstSeenAt": "2026-01-01T00:00:00.000Z",
        "jobId": "FAKE-REMOVED-1"
    }
}
```

`company_error`, never charged, with the previous count so silence is not mistaken for "no jobs":

```json
{
    "type": "company_error",
    "company": "Broken Co",
    "companyWebsite": null,
    "ats": "greenhouse",
    "trackingId": "proof-run",
    "observedAt": "2026-09-05T17:06:07.168Z",
    "error": "HTTP 404 for https://boards-api.greenhouse.io/v1/boards/this-board-does-not-exist-123/jobs",
    "count": 0,
    "previousObservedAt": null
}
```

The key-value store record `SUMMARY` lists every company with detected ATS, detection method, job count, request count, duration, fallback flag and error, plus the charged events, so you can see the cost of each run.

### How to schedule and get notified

1. Open the Actor, fill in the change-mode input above with your `trackingId`, and click **Save as task**.
2. On the task, open **Schedules** and create one (daily at 07:00 is typical).
3. Open **Integrations** on the task and add **Slack**, **Email**, **Webhook**, **Make** or **Zapier** with the event *Run succeeded*. Point the integration at the run's dataset; in change mode the dataset contains only the change events, so an empty dataset means "nothing changed".
4. For your own pipeline, call the API directly:

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~hiring-signals-monitor/run-sync-get-dataset-items?token=<token>" \
  -H "Content-Type: application/json" \
  -d '{ "companies": ["https://jobs.lever.co/nium"], "trackingId": "demo", "emitChangesOnly": true }'
```

State lives in the named key-value store `hiring-signals-state` in your account, one record per `trackingId`. Delete the record to reset a watch list.

### Pricing

Pay-per-event: **you pay for signals, not for pages**. Detection requests, pagination, retries and failed companies are never charged.

| Event           | Price  | When                                                            |
| --------------- | ------ | --------------------------------------------------------------- |
| Company checked | $0.005 | Per company whose roles were fetched successfully.              |
| Job record      | $0.002 | Snapshot mode: per open role stored.                            |
| Change detected | $0.01  | Change mode: per change event stored (`company_error` is free). |

Worked example, **50 companies monitored daily** with about 8 changes per day: 50 × $0.005 + 8 × $0.01 = **$0.33 per run, about $10 per month**. A weekly snapshot of 20 companies with 1,500 open roles costs $3.10 per run. Apify platform usage (compute, a few seconds per run) is billed separately by your plan.

### Limitations

- Change detection is relative to the filtered set: changing `filters` between runs produces added/removed events.
- Workday exposes posting dates as "Posted 3 Days Ago"; dates older than 30 days are `null`.
- Generic (non-ATS) career pages yield title and URL only, with `confidence: "low"`; location and posting date depend on JSON-LD being present.
- Rippling, Jobvite, iCIMS and JazzHR are parsed from HTML and may miss roles rendered only by JavaScript.
- `hiring_surge` and `new_function` are computed per run, so a company that posts 20 roles across four days never triggers a surge with `surgeThreshold: 5` per day; lower the threshold or run less often.
- Salary is reported only when the ATS exposes it (Ashby, Lever, Recruitee, Breezy, JSON-LD).

### FAQ

**Does it need my ATS credentials?** No. Every integration uses the public endpoints the career pages call themselves.

**What happens when a career page is down?** You get one `company_error` event with the error, the previous job count and the previous observation time. The snapshot for that company is left untouched, so nothing is reported as removed.

**Can a job "move" between ids?** Some ATSs re-issue ids. A role with the same title, location, function and seniority under a new id is treated as the same role and keeps its `firstSeenAt`.

**How many requests does a run make?** One or two per company for most ATSs (Greenhouse, Ashby, Workable, Recruitee, Breezy, Personio, Teamtailor return everything in one call; Lever, SmartRecruiters and Workday paginate in 100/100/20). Detection from a website costs two to three extra requests the first time.

**Can I run it for one company from my own code?** Yes, pass a single-element `companies` array; `trackingId` can be per customer or per account list.

### Legal note

The Actor reads publicly available job postings through public endpoints, honours `robots.txt` for the HTML fallback, uses polite concurrency and stores no personal data: recruiter and hiring-manager names, emails and phone numbers are removed even when the ATS returns them. Use the data in line with the ATS and career-site terms and the laws that apply to you.

# Actor input Schema

## `companies` (type: `array`):

Companies to check. Each item is either a careers-page URL (the ATS is auto-detected) or an object { name, careersUrl, website, ats, atsIdentifier }. Supported ATS values: greenhouse, lever, ashby, workable, smartrecruiters, recruitee, personio, bamboohr, breezy, workday, teamtailor, rippling, jobvite, icims, jazzhr, generic.

## `trackingId` (type: `string`):

Name of the watch list. Snapshots are stored under this key in the 'hiring-signals-state' key-value store so the next run can diff against them. Required when 'Emit changes only' is on. Use one ID per company list.

## `emitChangesOnly` (type: `boolean`):

Output only change events (job\_added, job\_removed, job\_updated, hiring\_surge, new\_function, company\_error) compared with the previous run under the same trackingId. Off = output every open role (snapshot mode).

## `emitBaselineAsAdded` (type: `boolean`):

On the very first run for a trackingId, emit every open role as a job\_added event. Off = the first run silently records the baseline and emits nothing.

## `surgeThreshold` (type: `integer`):

Number of new roles at one company in a single run that triggers a hiring\_surge event.

## `includeDescription` (type: `boolean`):

Add the full job description (plain text) to every job. Costs extra requests on SmartRecruiters and Workday (one per job) and makes items large.

## `filters` (type: `object`):

Keep only matching roles. functions: engineering, data, product, design, sales, marketing, customer\_success, support, operations, finance, hr, legal, other. countries: ISO-2 codes (AE, SA, US...). seniority: intern, junior, mid, senior, staff, lead, manager, director, vp, c\_level. titleKeywords / excludeTitleKeywords: case-insensitive substrings.

## `maxJobsPerCompany` (type: `integer`):

Stop after this many roles per company. 0 = unlimited. Very large employers (NVIDIA on Workday has ~2,000 open roles) are paginated 20 at a time, so leaving this unlimited makes a run long; the Console form suggests 200.

## `maxConcurrency` (type: `integer`):

How many companies are checked in parallel.

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

Proxies for the requests. Apify datacenter proxies are enough for ATS APIs.

## Actor input object example

```json
{
  "companies": [
    {
      "name": "Tamara",
      "careersUrl": "https://boards.greenhouse.io/tamara",
      "website": "https://tamara.co"
    },
    {
      "name": "Ziina",
      "careersUrl": "https://jobs.ashbyhq.com/ziina",
      "website": "https://ziina.com"
    },
    {
      "name": "Nium",
      "careersUrl": "https://jobs.lever.co/nium",
      "website": "https://www.nium.com"
    },
    {
      "name": "Salla",
      "careersUrl": "https://apply.workable.com/salla",
      "website": "https://salla.sa"
    },
    {
      "name": "NVIDIA",
      "careersUrl": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
      "website": "https://www.nvidia.com"
    }
  ],
  "trackingId": "my-target-accounts",
  "emitChangesOnly": false,
  "emitBaselineAsAdded": false,
  "surgeThreshold": 5,
  "includeDescription": false,
  "filters": {
    "functions": [],
    "countries": [],
    "seniority": [],
    "titleKeywords": [],
    "excludeTitleKeywords": []
  },
  "maxJobsPerCompany": 200,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

Snapshot mode: one item per open role. Change mode: one item per change event.

## `summary` (type: `string`):

Per-company ATS, job counts, request counts, charged events and sample changes.

# 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 = {
    "companies": [
        {
            "name": "Tamara",
            "careersUrl": "https://boards.greenhouse.io/tamara",
            "website": "https://tamara.co"
        },
        {
            "name": "Ziina",
            "careersUrl": "https://jobs.ashbyhq.com/ziina",
            "website": "https://ziina.com"
        },
        {
            "name": "Nium",
            "careersUrl": "https://jobs.lever.co/nium",
            "website": "https://www.nium.com"
        },
        {
            "name": "Salla",
            "careersUrl": "https://apply.workable.com/salla",
            "website": "https://salla.sa"
        },
        {
            "name": "NVIDIA",
            "careersUrl": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
            "website": "https://www.nvidia.com"
        }
    ],
    "trackingId": "my-target-accounts",
    "filters": {
        "functions": [],
        "countries": [],
        "seniority": [],
        "titleKeywords": [],
        "excludeTitleKeywords": []
    },
    "maxJobsPerCompany": 200,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("almoutasem_nabil/hiring-signals-monitor").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 = {
    "companies": [
        {
            "name": "Tamara",
            "careersUrl": "https://boards.greenhouse.io/tamara",
            "website": "https://tamara.co",
        },
        {
            "name": "Ziina",
            "careersUrl": "https://jobs.ashbyhq.com/ziina",
            "website": "https://ziina.com",
        },
        {
            "name": "Nium",
            "careersUrl": "https://jobs.lever.co/nium",
            "website": "https://www.nium.com",
        },
        {
            "name": "Salla",
            "careersUrl": "https://apply.workable.com/salla",
            "website": "https://salla.sa",
        },
        {
            "name": "NVIDIA",
            "careersUrl": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
            "website": "https://www.nvidia.com",
        },
    ],
    "trackingId": "my-target-accounts",
    "filters": {
        "functions": [],
        "countries": [],
        "seniority": [],
        "titleKeywords": [],
        "excludeTitleKeywords": [],
    },
    "maxJobsPerCompany": 200,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("almoutasem_nabil/hiring-signals-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    {
      "name": "Tamara",
      "careersUrl": "https://boards.greenhouse.io/tamara",
      "website": "https://tamara.co"
    },
    {
      "name": "Ziina",
      "careersUrl": "https://jobs.ashbyhq.com/ziina",
      "website": "https://ziina.com"
    },
    {
      "name": "Nium",
      "careersUrl": "https://jobs.lever.co/nium",
      "website": "https://www.nium.com"
    },
    {
      "name": "Salla",
      "careersUrl": "https://apply.workable.com/salla",
      "website": "https://salla.sa"
    },
    {
      "name": "NVIDIA",
      "careersUrl": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
      "website": "https://www.nvidia.com"
    }
  ],
  "trackingId": "my-target-accounts",
  "filters": {
    "functions": [],
    "countries": [],
    "seniority": [],
    "titleKeywords": [],
    "excludeTitleKeywords": []
  },
  "maxJobsPerCompany": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call almoutasem_nabil/hiring-signals-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,almoutasem_nabil/hiring-signals-monitor"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/11Rg4vnVWokO5KgI1/builds/Wo4pIKIICvQ7uhC1F/openapi.json
