# iCIMS Jobs Scraper: Any iCIMS Careers Portal, By Name (`glitchbound/icims-jobs-scraper`) Actor

Every open job from any iCIMS careers portal, where BrightSpring, EMCOR and Concentra post. Type one of 456 verified employers or paste the portal address. Pay where shown. No API key.

- **URL**: https://apify.com/glitchbound/icims-jobs-scraper.md
- **Developed by:** [Daniel Meshulam](https://apify.com/glitchbound) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

## iCIMS Jobs Scraper: Any iCIMS Careers Portal, By Name

**Every open job from any iCIMS careers portal, the system BrightSpring Health, EMCOR and Concentra hire on. Type an employer name for one of the 456 employers this Actor has already verified, or paste the portal address. Titles, places, categories and pay where the portal shows it, as clean JSON, with no API key and no login.**

### Features

- **Type an employer name, for 456 employers.** The Actor ships a map of 521 iCIMS portals it has already read open jobs from (at least 53,000 jobs when it was built), so `Concentra` works without you knowing its portal is `careers-concentrainc.icims.com`. An employer with several portals gets all of them.
- **Any portal address.** Paste the portal host or any page on it: the job list, a single job, a search. The host is the portal, and that is what the Actor reads.
- **Both portal layouts.** iCIMS portals come in two shapes, 10 jobs a page with the posting date in the card, and 50 a page with the location there instead. The Actor reads the fields by name, not by position, so both come back in the same columns.
- **Places you can filter on.** iCIMS writes `US-KY-PAINTSVILLE`; every row carries `Paintsville, KY, US` with `city`, `region` and `country` split out.
- **Pay where the portal shows it.** BrightSpring, for one, publishes a minimum and maximum on every posting; it arrives in `compensation`.
- **Full descriptions when you want them.** `includeDescription` reads each job's own page, section by section.
- **Demo accounts are not employers.** A posting titled "(Sample)" or "(Test)" is not returned as a job.
- **One row per job, as clean JSON**, with the same fields as our [Workday](https://apify.com/glitchbound/workday-jobs-scraper) and [Oracle](https://apify.com/glitchbound/oracle-jobs-scraper) scrapers, so the outputs stack.
- **Filters that cost you nothing.** Rows dropped by `titleKeywords`, `locationKeywords` or `remoteOnly` are never charged.
- **Errors are per company.** One bad address does not end the run, and error rows are not charged.

### How to use it

1. Click **Try for free**.
2. Put employer names in `companies`, or portal addresses in `boards`. The example below is real.
3. Optionally narrow it with `titleKeywords` or `locationKeywords`.
4. Run it, and download the rows as JSON, CSV or Excel, or read them through the API.

### Input

```json
{
  "companies": ["Concentra", "EMCOR"],
  "boards": ["careers-brightspring.icims.com"],
  "titleKeywords": ["nurse", "technician"],
  "locationKeywords": ["TX"],
  "maxResultsPerCompany": 100
}
```

| Field | What it does | Default |
|---|---|---|
| `companies` | employer names from the verified map, e.g. `Concentra`, `Acadia Healthcare` | none |
| `boards` | iCIMS portal addresses, or any page URL on the portal | none |
| `titleKeywords` | keep only titles containing any of these | none |
| `locationKeywords` | keep only places containing any of these | none |
| `remoteOnly` | keep only roles whose title or place says remote | false |
| `includeDescription` | read each job's page for the full description | false |
| `maxResultsPerCompany` | ceiling per portal | 1,000 |
| `maxItems` | ceiling for the whole run | none |

### Output

One row per job. A real one, from BrightSpring's portal:

```json
{
  "jobId": "196632",
  "title": "RBT BEHAVIOR TECHNICIAN",
  "company": "BrightSpring Health Services",
  "location": "Paintsville, KY, US",
  "city": "Paintsville",
  "region": "KY",
  "country": "United States",
  "departments": ["Therapy"],
  "compensation": "USD $25.00/Hr.",
  "requisitionId": "2026-196632",
  "updatedAt": "2026-09-18T18:43:21Z",
  "url": "https://careers-brightspring.icims.com/jobs/196632/rbt-behavior-technician/job",
  "atsPlatform": "icims",
  "boardToken": "careers-brightspring.icims.com",
  "boardUrl": "https://careers-brightspring.icims.com/jobs/search?ss=1"
}
```

`postedAt` is filled where the portal's list shows a posting date, and on every portal when `includeDescription` is on, from each job's own structured data. Otherwise the only date iCIMS publishes is when the posting was last edited, and that goes in `updatedAt` rather than being passed off as a posting date.

### A company name, or the exact address

For 456 employers you can type the name. Those are the portals this Actor has already read real postings from; the names come from each portal's own title, so `BrightSpring Health Services`, `brightspring` and `careers-brightspring.icims.com` all reach the same place. A name that is not in the map is refused, not guessed: the portal host is a label the employer chose, and a guess could land on someone else's account.

### What people use this for

- **Recruiters and staffing firms** watching which large employers are hiring, where, and for what.
- **Sales teams** using open roles as a buying signal: a healthcare group hiring 40 nurses in one state is a lead.
- **Market and labour research** across healthcare, facilities, hospitality and higher education, the sectors that run on iCIMS.

### Pricing

**$1.50 per 1,000 jobs, down to $0.80 per 1,000 on higher Apify plans.** No subscription. Error rows and filtered rows are free, and `maxItems` caps the whole run.

### Integrations and API

Run it from the Apify API, a schedule, Make, Zapier, n8n or any MCP client. Every run's rows are in its default dataset.

### FAQ

**Do I need an iCIMS account or an API key?** No. This reads the job list each portal publishes for its careers page. The portals' robots.txt allows it.

**Why is a big portal slower than a small one?** iCIMS has no job API, so the list is read page by page, 10 or 50 jobs at a time. A 2,000-job portal is 40 pages, about a minute.

**Is there a remote flag?** iCIMS portals publish none, so `remoteOnly` keeps roles whose title or place says remote or anywhere.

### Related

- [Workday Jobs Scraper](https://apify.com/glitchbound/workday-jobs-scraper): the largest enterprise careers system, 2,898 employers by name
- [Oracle Recruiting Jobs Scraper](https://apify.com/glitchbound/oracle-jobs-scraper): Oracle Cloud careers sites, Marriott and Hilton by name
- [Company Career Page Jobs Scraper](https://apify.com/glitchbound/ats-jobs-scraper): any company by name or domain, across 14 systems

### Use it from an AI agent

This Actor is a ready-made tool for Claude, ChatGPT, Cursor or any other MCP
client, through Apify's MCP server. Add it as a connector at:

```
https://mcp.apify.com?tools=glitchbound/icims-jobs-scraper
```

In Cursor or VS Code the same address goes in `mcp.json`:

```json
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=glitchbound/icims-jobs-scraper" } } }
```

The first call asks you to sign in to Apify, or takes an API token. From then
on the agent sees this Actor's input fields and calls it directly.

### Feedback

If this saved you time, a review on the Actor's Store page helps other people
find it. If something is missing or wrong, the Issues tab on the same page is
the fastest way to reach me, and it gets read.

# Actor input Schema

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

Employer names, one per line, e.g. 'BrightSpring Health Services', 'Concentra' or 'EMCOR'. This Actor ships a map of 456 employers whose iCIMS portals it has already read open jobs from, so a name in the map needs no address. A name that is not in it is refused rather than guessed at: the portal host is a label the employer chose, and a guess could land on someone else's account. Use `boards` with the portal address for those.

## `boards` (type: `array`):

iCIMS careers portal addresses, one per line, e.g. careers-brightspring.icims.com, or any page URL on the portal. The host is the portal: it is what the Actor reads.

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

Keep only roles whose title contains any of these, one per line, e.g. security or staff engineer. Matched as plain text, case-insensitive, so c++ and node.js mean exactly that. Filtered rows are not charged.

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

Keep only roles whose location contains any of these, one per line, e.g. London or Israel. Filtered rows are not charged.

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

Keep only roles whose title or location says remote or anywhere. iCIMS portals publish no separate remote flag.

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

Reads each job's own page for the full description, section by section. One extra request per job, four at a time, so it is off by default.

## `maxResultsPerCompany` (type: `integer`):

Ceiling on roles taken from any single portal. BrightSpring alone lists about 2,000.

## `maxItems` (type: `integer`):

A hard ceiling on rows for the entire run, across every company. The per-company limit above caps each one separately, so fifty companies at a thousand each is still fifty thousand rows; this caps the total. The run stops cleanly when it is reached and nothing beyond that point is fetched or charged. Leave empty for no ceiling.

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

Proxy settings. iCIMS portals are public web pages that answer datacenter addresses, so the default is fine.

## Actor input object example

```json
{
  "boards": [
    "careers-brightspring.icims.com"
  ],
  "remoteOnly": false,
  "includeDescription": false,
  "maxResultsPerCompany": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All rows this run produced, as JSON.

# 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 = {
    "boards": [
        "careers-brightspring.icims.com"
    ],
    "maxResultsPerCompany": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("glitchbound/icims-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 = {
    "boards": ["careers-brightspring.icims.com"],
    "maxResultsPerCompany": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("glitchbound/icims-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 '{
  "boards": [
    "careers-brightspring.icims.com"
  ],
  "maxResultsPerCompany": 100
}' |
apify call glitchbound/icims-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,glitchbound/icims-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/k27kIXyCp3sShkved/builds/Sr9k2x9sax9dmuReg/openapi.json
