# Company Careers Page & ATS Jobs Scraper (`maged120/company-careers-jobs-scraper`) Actor

Turn a list of company domains into their live job openings, with titles, locations, departments, salaries and full descriptions.

- **URL**: https://apify.com/maged120/company-careers-jobs-scraper.md
- **Developed by:** [Maged](https://apify.com/maged120) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.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/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

**Give it a list of company websites. Get back every job those companies are hiring for right now** — title, location, department, salary, posting date, apply link and the full description text. No job-board account, no cookies, no login, no per-company setup.

### What does Company Careers Page & ATS Jobs Scraper do?

Most companies don't post their openings on job boards — they publish them on **their own careers page**, powered by an applicant tracking system. This Actor takes a plain list of **company domains** (`figma.com`, `notion.so`, `monzo.com`), finds each company's live job board automatically, and extracts every open role into a clean, structured dataset.

It works across the applicant tracking systems behind the large majority of company careers pages, so you get consistent, structured results whichever one a company uses.

You can also paste a careers URL or job-board URL directly, or just type a company name. Results land in an Apify dataset you can export as JSON, CSV or Excel, pull through the API, schedule to re-run daily, or wire into Make, Zapier, Google Sheets and n8n.

### Why use this Actor?

- **Recruiting intelligence** — track which competitors are hiring, for what, and where.
- **Sales and lead generation** — a company posting five sales roles is a company buying sales tooling. Hiring signals are among the strongest buying signals available.
- **Job boards and aggregators** — build a niche board sourced straight from employer career sites, so listings are fresh and never duplicated by reposters.
- **Market and investment research** — headcount growth by department is a leading indicator of a company's direction.
- **Job seekers** — monitor a shortlist of dream companies and get the opening the same day it goes live.
- **AI and RAG pipelines** — full description text per posting, ready to embed.

### How to use Company Careers Page & ATS Jobs Scraper

1. Click **Try for free** and open the Input tab.
2. In **Companies**, paste one company per line: a domain (`stripe.com`), a name (`Figma`), or a careers/job-board URL.
3. Optionally narrow the results with **Job title keywords**, **Location keywords**, **Remote jobs only** or **Posted within (days)**.
4. Click **Start**. Watch the log — it reports how many openings each company holds.
5. Open the **Output** tab and export as JSON, CSV, Excel or HTML, or fetch it from the API.

To keep a list permanently fresh, use **Schedules** to run it every morning and send new rows straight to your CRM, spreadsheet or Slack.

### Input

| Field | Type | Description |
|---|---|---|
| `companies` | array | **Required.** One entry per company: domain, company name, or careers/job-board URL. |
| `titleKeywords` | array | Keep only jobs whose title contains one of these words. Empty = keep all. |
| `locationKeywords` | array | Keep only jobs matching these locations, teams or departments. Empty = keep all. |
| `remoteOnly` | boolean | Keep only postings flagged remote by the employer. Default `false`. |
| `postedWithinDays` | integer | Keep only jobs published in the last N days. `0` = no limit. |
| `fetchDescriptions` | boolean | Include full description text. Default `true`. |
| `outputJobs` | boolean | Push one row per job opening. Default `true`. |
| `outputCompanyBoards` | boolean | Push one summary row per company. Default `true`. |
| `maxJobsPerCompany` | integer | Cap job rows per company. `0` = unlimited. |
| `proxyConfiguration` | object | Proxy used for requests. |

```json
{
    "companies": ["figma.com", "notion.so", "Monzo", "https://www.company.com/careers"],
    "titleKeywords": ["engineer", "designer"],
    "locationKeywords": ["London", "Remote"],
    "remoteOnly": false,
    "postedWithinDays": 30,
    "fetchDescriptions": true,
    "maxJobsPerCompany": 0
}
```

### Output

Two row types share one dataset, separated by the `entityType` field and by the ready-made **Jobs** and **Companies & boards** views on the Output tab. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

A `job` row:

```json
{
    "entityType": "job",
    "companyInput": "figma.com",
    "companyId": "figma.com",
    "companyUrl": "https://figma.com",
    "jobId": "5426468004",
    "title": "Account Executive, Enterprise",
    "department": "Sales",
    "team": null,
    "location": "San Francisco, CA • New York, NY • United States",
    "isRemote": null,
    "employmentType": null,
    "compensation": null,
    "postedAt": "2025-01-28T18:57:29-05:00",
    "applyUrl": "https://figma.com/careers/5426468004",
    "description": "Figma is growing our team of passionate creatives and builders...",
    "scrapedAt": "2026-09-09T19:57:27.157568+00:00"
}
```

A `company_board` row:

```json
{
    "entityType": "company_board",
    "companyInput": "figma.com",
    "companyId": "figma.com",
    "jobsFound": 158,
    "error": null,
    "scrapedAt": "2026-09-09T19:57:27.157568+00:00"
}
```

#### Data fields

| Field | Description |
|---|---|
| `title` | Job title as published by the employer |
| `department` / `team` | Org unit the role sits in |
| `location` | All locations attached to the posting |
| `isRemote` | Employer's remote flag, where published |
| `employmentType` | Full time, part time, contract, permanent… |
| `compensation` | Published salary range, where the employer discloses one |
| `postedAt` | Publication date, normalized to ISO-8601 |
| `applyUrl` | Direct link to the application page |
| `description` | Full posting text, cleaned of markup |

### How much does it cost to scrape company job listings?

The Actor is billed per result, so cost scales with the number of openings you collect, not with the number of companies you check.

| Run | Jobs collected | Approximate cost |
|---|---|---|
| 10 companies, ~30 openings each | 300 | ~$0.90 |
| 100 companies, daily monitoring | ~3,000 | ~$9.00 |
| One large enterprise board | 2,000 | ~$6.00 |

Every Apify account includes free monthly platform usage, which is enough to try the Actor on a handful of companies at no cost.

### Tips

- **Cap large employers.** A single enterprise board can hold thousands of openings. Set `maxJobsPerCompany` to keep runs predictable.
- **Filter at the source.** `titleKeywords`, `locationKeywords` and `postedWithinDays` are applied before rows are stored, so filtering cuts both run time and cost.
- **Turn off descriptions for monitoring runs.** With `fetchDescriptions: false` a daily "what's new" run is much faster and lighter; switch it back on when you need the text.
- **Paste board URLs for tricky companies.** If a company's careers page is fully JavaScript-driven, giving the job-board URL directly is the most reliable input.
- **Schedule it.** Combined with Apify Schedules and integrations, this becomes a live hiring-signal feed.

### FAQ

**Which systems are supported?** The applicant tracking systems that power the large majority of company careers pages. Paste a domain, a company name or a careers/job-board URL and the Actor handles the rest.

**What if a company isn't found?** You still get a `company_board` row with `jobsFound: 0` and a clear message, so nothing silently disappears from your list. Companies on unsupported systems or fully custom careers pages can't be resolved — paste their job-board URL if they have one.

**Do I need cookies, a login or an API key?** No. Only publicly published job listings are collected.

**Why do some rows have no description?** A few careers systems do not publish description text publicly; those rows carry every other field. Some employers also leave fields such as salary or department blank.

**Is scraping job listings legal?** This Actor collects only publicly available job postings that employers publish for candidates to read, and no personal data. As with any scraping project, you are responsible for how you use the data and for complying with applicable laws and the target sites' terms.

### Support

Found a company that doesn't resolve, or want another system supported? Open an issue on the **Issues** tab and include the company URL — new board types are added based on what users ask for. Custom versions and higher-volume setups are available on request.

# Actor input Schema

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

One entry per company. Paste a website domain (apify.com), a company name (Figma), or a direct careers/job-board URL. The Actor finds the company's job board automatically.

## `titleKeywords` (type: `array`):

Keep only jobs whose title contains one of these words (case-insensitive). Leave empty to keep every job.

## `locationKeywords` (type: `array`):

Keep only jobs whose location, team or department contains one of these words (e.g. Berlin, United States). Leave empty to keep every job.

## `remoteOnly` (type: `boolean`):

Keep only postings flagged as remote by the employer or with 'remote' in the location.

## `postedWithinDays` (type: `integer`):

Keep only jobs published in the last N days. 0 = no date limit. Postings without a publication date are always kept.

## `fetchDescriptions` (type: `boolean`):

Fetch the complete description text for every posting. Turn this off for a faster, lighter run when you only need titles, locations and apply links.

## `outputJobs` (type: `boolean`):

Push one row per job opening. This is the main output.

## `outputCompanyBoards` (type: `boolean`):

Push one row per company with the detected job board, how it was found, and the number of openings.

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

Cap the number of job rows collected per company. 0 = unlimited.

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

Proxy used for the requests. The default works for most runs; switch to Residential if a company website blocks datacenter traffic.

## Actor input object example

```json
{
  "companies": [
    "figma.com",
    "notion.so",
    "monzo.com"
  ],
  "titleKeywords": [],
  "locationKeywords": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "fetchDescriptions": true,
  "outputJobs": true,
  "outputCompanyBoards": true,
  "maxJobsPerCompany": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "companies": [
        "figma.com",
        "notion.so",
        "monzo.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("maged120/company-careers-jobs-scraper").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": [
        "figma.com",
        "notion.so",
        "monzo.com",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("maged120/company-careers-jobs-scraper").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": [
    "figma.com",
    "notion.so",
    "monzo.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call maged120/company-careers-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maged120/company-careers-jobs-scraper"
        }
    }
}
```

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/AEIvMZyygwfGnfV05/builds/UzNbftNd3GieQrrFQ/openapi.json
