# Company Job Openings: Jobs From Any Careers Page (`precious_bathmat/company-job-openings`) Actor

Give it company names or websites and it finds each employer's careers page and every open role, across nine applicant tracking systems. No board tokens, no ATS names, no setup. Every match is checked against the company name the board reports.

- **URL**: https://apify.com/precious\_bathmat/company-job-openings.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 job postings

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Company Job Openings: Jobs From Any Careers Page

**Give it company names. Get their open roles.** It works out where each employer's careers page lives, reads every posting, and checks the board really belongs to that company.

Nine applicant tracking systems, no board tokens, no API key, no account, no proxy.

### What does this do?

Every other tool for this makes you do the hard part first: find out that Figma uses Greenhouse, that Notion uses Ashby, and look up each board token by hand. For a list of 200 target accounts that is a day of work before any data arrives.

This Actor takes the company name, or better still its website, and finds the board itself.

```mermaid
flowchart LR
    A[Company names<br/>or websites] --> B[Work out the likely<br/>board address]
    B --> C[Try 9 tracking systems]
    C --> D[Check the board names<br/>the right company]
    D --> E[Open roles, with links]
```

**Measured from Apify servers on 30 well known companies: 23 resolved, 77%,** returning 4,226 open roles in 26 seconds. Stripe came back with 650 roles, Anthropic 600, Datadog 456, Notion 127.

### Systems it reads

Greenhouse, Ashby, Lever, Workable, Recruitee, SmartRecruiters, Personio, Breezy HR and Teamtailor — all through their public endpoints.

### Why matches get checked

Board addresses are worked out from the name, and a guess can land on someone else's board. This is not theoretical; all three of these came up in testing:

| Asked for | Guessed board | Who it actually belongs to |
|---|---|---|
| 1Password | Workable `1password` | **Workable** itself |
| Personio | Recruitee `personio` | **FD Sandbox** |
| Wise | Greenhouse `wise` | **Wise Worksite Field Sales** |

Where a system reports a company name, it has to match, or the board is thrown away and the search continues. In that same run all three companies were then found on their real boards: 1Password on Ashby, Personio on its own system, and Wise on SmartRecruiters with 100 open roles.

Every row carries `confidence`:

- **verified** — the board reported a matching company name
- **unverified** — this system publishes no company name, so the match rests on the address alone

Set **Only boards that confirm the company name** to keep verified matches only.

### What data do you get?

One row per open role:

| Field | Meaning |
|---|---|
| `company`, `ats`, `boardUrl`, `confidence` | Who was asked for, which system, and how sure the match is |
| `title`, `department`, `team` | The role |
| `location`, `isRemote` | Where it is, and whether it is remote |
| `employmentType`, `postedAt` | Full time or contract, and when it appeared |
| `jobUrl`, `jobId` | A direct link to apply |
| `matchedKeywords` | Which of your keywords this role matched |

A second **Companies** table has one row per company you asked for: the system, the careers page, how many roles it has, and for anything not found, a plain explanation of why.

### Example

Seven companies, September 2026, 20 roles each at most:

| Company | System | Match | Roles on board |
|---|---|---|---|
| Figma | Greenhouse | verified | 154 |
| notion.so | Ashby | unverified | 128 |
| Stripe | Greenhouse | verified | 650 |
| 1Password | Ashby | unverified | 59 |
| Personio | Personio | unverified | 1 |
| Wise | SmartRecruiters | verified | 100 |
| Deel | not found | — | — |

### How to use it

1. Add your **companies**, one per line. A website such as `figma.com` resolves more reliably than a name.
2. Optionally filter by **role keywords**, **locations** or **remote only**.
3. Set **maximum jobs per company** to cap large employers, and therefore the cost.
4. Run it, then export to CSV, Excel or JSON.

### Popular lists

Ready to run examples, each one a real set of employers:

- [Fintech Company Jobs: Open Roles at Payment Companies](https://apify.com/precious_bathmat/company-job-openings/examples/fintech-company-jobs)
- [AI Company Jobs: Open Roles at AI Companies](https://apify.com/precious_bathmat/company-job-openings/examples/ai-company-jobs)
- [Developer Tools Jobs: Open Roles at Dev Tool Companies](https://apify.com/precious_bathmat/company-job-openings/examples/developer-tools-jobs)
- [Design and Productivity Tool Company Jobs](https://apify.com/precious_bathmat/company-job-openings/examples/design-tool-company-jobs)
- [Cybersecurity Company Jobs: Open Security Roles](https://apify.com/precious_bathmat/company-job-openings/examples/cybersecurity-company-jobs)
- [European Tech Company Jobs: Open Roles](https://apify.com/precious_bathmat/company-job-openings/examples/european-tech-company-jobs)
- [Remote First Company Jobs: Open Roles](https://apify.com/precious_bathmat/company-job-openings/examples/remote-first-company-jobs)
- [Data Infrastructure Jobs: Open Roles](https://apify.com/precious_bathmat/company-job-openings/examples/data-infrastructure-jobs)
- [Ecommerce Company Jobs: Open Roles](https://apify.com/precious_bathmat/company-job-openings/examples/ecommerce-company-jobs)
- [Software Engineer Jobs at Top Tech Companies](https://apify.com/precious_bathmat/company-job-openings/examples/software-engineer-jobs-tech-companies)
- [Product Manager Jobs at Top Tech Companies](https://apify.com/precious_bathmat/company-job-openings/examples/product-manager-jobs-tech-companies)
- [Sales Jobs at Top Tech Companies](https://apify.com/precious_bathmat/company-job-openings/examples/sales-jobs-tech-companies)
- [Design Jobs at Top Tech Companies](https://apify.com/precious_bathmat/company-job-openings/examples/design-jobs-tech-companies)
- [Remote Jobs at Top Tech Companies](https://apify.com/precious_bathmat/company-job-openings/examples/remote-jobs-at-tech-companies)

### Pricing

Pay per result: **$0.002 per job posting**. Looking a company up is free, so companies that turn out not to have a public board, or that have no roles open, cost you nothing.

### FAQ

**What if a company is not found?**
The Companies table says so, with the reason. The usual causes are Workday or a custom careers page, neither of which publishes an open endpoint, or a board address that cannot be guessed from the name. Passing the website instead of the name often fixes it.

**Do I need to know which system a company uses?**
No. That is the entire point of this Actor.

**Why is a match "unverified"?**
Some systems, Ashby and Lever among them, publish jobs without naming the company anywhere in the response. The address still had to match the company name to be tried at all, but it cannot be confirmed from the data, so the row says so rather than pretending.

**How current is it?**
It reads each careers page live at run time, so it is as current as the employer's own site — usually fresher than a job board, and it includes roles that never reach one.

**Can I watch for new roles?**
Run it on a schedule with the same companies and compare `jobId` between runs.

# Actor input Schema

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

Company names or websites, one per line. A website is the strongest hint: "figma.com" beats "Figma". No board tokens or ATS names needed.

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

Keep only roles matching these words, matched against the job title, department and team. A phrase needs every word present.

## `locations` (type: `array`):

Keep only roles whose location text contains one of these, for example london, berlin, new york.

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

Keeps roles the board marks as remote, or whose location says remote.

## `atsProviders` (type: `array`):

Which applicant tracking systems to try. All nine by default.

## `requireVerifiedCompany` (type: `boolean`):

Board addresses are worked out from the name, so some systems can only be matched, not confirmed. Turn this on to keep only boards that report a matching company name. Fewer results, no doubt about whose they are.

## `tryNameVariants` (type: `boolean`):

If the obvious address fails, try variants such as dropping "Inc" or hyphenating the name.

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

A cap per company, and therefore on what a run costs. Large employers can have hundreds of open roles.

## Actor input object example

```json
{
  "companies": [
    "Datadog",
    "gitlab.com"
  ],
  "keywords": [
    "engineer",
    "product manager"
  ],
  "locations": [
    "london",
    "remote"
  ],
  "remoteOnly": false,
  "atsProviders": [
    "Greenhouse",
    "Ashby",
    "Lever",
    "Workable",
    "Recruitee",
    "SmartRecruiters",
    "Personio",
    "BreezyHR",
    "Teamtailor"
  ],
  "requireVerifiedCompany": false,
  "tryNameVariants": true,
  "maxJobsPerCompany": 100
}
```

# Actor output Schema

## `jobs` (type: `string`):

Every open role found, with link, location and department.

## `companies` (type: `string`):

Which careers page each company was found on, and why one was not.

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

Resolution rate, rejected boards and totals.

# 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",
        "notion.so",
        "Stripe"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/company-job-openings").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",
        "notion.so",
        "Stripe",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/company-job-openings").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",
    "notion.so",
    "Stripe"
  ]
}' |
apify call precious_bathmat/company-job-openings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/company-job-openings"
        }
    }
}
```

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/8dENo9RMw6VFjLVcw/builds/tLzHqX6UALI6NFqnp/openapi.json
