# iCIMS Jobs Scraper — Any Company, Salary & Full Descriptions (`yugenox/icims-careers-scraper`) Actor

Open jobs from any employer that hires through iCIMS: classic iCIMS career portals and iCIMS-powered (Jibe) career sites. Type company names or paste URLs, add keywords, location and filters. Full descriptions, salary ranges, exact posted dates, coordinates and an only-new mode for daily schedules.

- **URL**: https://apify.com/yugenox/icims-careers-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (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 $2.00 / 1,000 jobs

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

## iCIMS Jobs Scraper: any company, with salary and full descriptions

Get open jobs from **any employer that hires through iCIMS**, one of the most widely used applicant tracking systems in North America (Peraton, PetSmart, PepsiCo, Ascension, UF Health, H\&R Block, Ulta Beauty, Allied Universal, Lowes Foods and thousands more).

Type **company names**; you don't need to hunt for career-site URLs. The actor finds each company's iCIMS career portal or its iCIMS-powered career site, searches it the way the careers page does, and returns clean, structured job data: title, locations with coordinates, salary range, employment type, remote/hybrid/on-site, category, exact posted date, full description, and apply link.

### What makes it different

- **Both kinds of iCIMS career sites.** It covers classic portals (`careers-<company>.icims.com`) and the modern iCIMS-powered career sites (`<company>.jibeapply.com` and company-branded domains like `rei.jobs` or `careers.petsmart.com`). When a company has moved from one to the other, the actor follows it automatically.
- **Company names in, jobs out.** It has a built-in directory of **2,000+ iCIMS employers**, and falls back to a live lookup for anything not listed.
- **Search across all employers.** Give a keyword and no company, and the largest iCIMS employers are searched for you.
- **Salary ranges** are taken from the site's pay fields, or read from the posting text ("$112,000 - $179,000", "$15.50 - $18.00 per hour"), with currency and period.
- **Real dates.** You get exact posted dates (not "30+ days ago"), plus valid-through and last-updated dates where the site has them.
- **Coordinates** (latitude/longitude) come with every job on iCIMS-powered career sites.
- **Only-new mode.** Schedule it daily and get only the jobs you haven't seen, and pay only for those.
- **Filters:** location (city, state/province, country, or "Remote", plus a radius), job category, employment type, work arrangement, and posted-within-N-days.

### Input

| Field | What it does |
|---|---|
| **Companies** | Company names (`Peraton`, `PetSmart`, `Lowes Foods`) or careers URLs. |
| **Career site URLs** | A `careers-<company>.icims.com` search page (its filters are kept), a single job link, or an iCIMS-powered career site URL. |
| **Keywords** | Each keyword is a separate search on every company. Leave it empty to get all open jobs. |
| **Max jobs / Max jobs per company** | Caps for the whole run and for each company. |
| **Full job descriptions** | On by default. Turn it off for a faster, cheaper list of titles, locations, dates and links. |
| **Locations / Radius** | `Toronto`, `Ontario`, `Texas`, `Chantilly, VA`, `Canada`, `Remote`. Each location is a separate search. |
| **Job categories, Employment type, Work arrangement, Posted within** | Optional filters. |
| **Only new jobs** | Skips every job this actor has already returned to you (use one memory name per schedule). |

Example: every manager job at two companies:

```json
{
  "companies": ["Peraton", "Lowes Foods"],
  "keywords": ["manager"],
  "maxItemsPerCompany": 100
}
```

Example: remote cybersecurity jobs posted this week, across the largest iCIMS employers:

```json
{
  "keywords": ["cybersecurity"],
  "remoteTypes": ["remote"],
  "postedWithinDays": 7,
  "maxCompanies": 200
}
```

### Output

One row per job. Sample (description shortened):

```json
{
  "title": "All-Source Analyst - Production/Hard Target, Senior",
  "company": "Peraton",
  "location": "Fort Meade, Maryland",
  "locations": [{ "city": "Fort Meade", "state": "Maryland", "country": "US", "postalCode": "20755-0000", "street": "9800 Savage Rd" }],
  "city": "Fort Meade",
  "state": "Maryland",
  "country": "US",
  "latitude": 39.1115928,
  "longitude": -76.771067,
  "remoteType": null,
  "employmentType": "Full-time",
  "category": "Intel and Threat Analysis",
  "salaryMin": 135000,
  "salaryMax": 216000,
  "salaryCurrency": "USD",
  "salaryPeriod": "YEAR",
  "postedDate": "2026-07-24",
  "postedDaysAgo": 62,
  "url": "https://peraton.jibeapply.com/jobs/169039?lang=en-us",
  "applyUrl": "https://careers-peraton.icims.com/jobs/169039/login",
  "jobId": "169039",
  "reqId": "169039",
  "descriptionText": "Responsibilities Some of the most complex and consequential intelligence targets in the world operate in space…",
  "source": "jibe",
  "portalUrl": "https://peraton.jibeapply.com",
  "detailsIncluded": true,
  "scrapedAt": "2026-09-24T07:56:36.008Z"
}
```

Other fields include `hiringOrganization`, `locationsText` (all locations as written on the site), `postalCode`, `employmentTypeRaw`, `department`, `salaryText`, `postedDateTime`, `updatedDate`, `validThrough`, `openings`, `summary`, `descriptionHtml`, `qualifications`, `responsibilities`, `fields` (every extra field the portal shows, such as *Clearance*, *Shift* or *Requisition ID*), `tags`, `companyLogo`, `companyWebsite`, `atsSource`, `searchKeyword`, `input` and `isNew`.

The run's **Company summary** (key-value store record `SUMMARY`) shows which career site each company resolved to, how many jobs each gave, and a note for any company that wasn't found or has moved to a career site this actor doesn't cover.

### Use cases

- **Job boards and aggregators:** feed fresh postings from thousands of employers, with only-new mode for daily updates.
- **Recruiting and sales intelligence:** see who is hiring, for what, where, and at what pay.
- **Labor-market and salary research:** posted pay ranges by role, location and employer.
- **Job seekers and career coaches:** watch target companies for new roles matching your keywords and location.
- **HR benchmarking:** compare competitors' openings, categories and locations.

### FAQ

**How do I know if a company uses iCIMS?** Its job links usually contain `icims.com` or `jibeapply.com`, or the apply button leads to an `icims.com` page. Or just type the company name. If nothing is found, the run summary says so and you are not charged.

**A company isn't found by name.** Paste its careers URL into *Career site URLs*. Some companies use a custom career site that doesn't run on iCIMS; the summary tells you when that's the case.

**How fast is it?** Typically 500 to 1,000+ jobs per minute with full descriptions (1,000 jobs from two companies took under a minute in testing), and faster without them. Companies are processed in parallel.

**Does it need a login or cookies?** No. It only reads public job postings.

**How is it priced?** Pay per result: one small fee per job saved to your dataset, plus a small add-on for each job that comes with its full description. Turn off *Full job descriptions* to pay only the per-job price. Companies that aren't found, errors and empty searches are never charged.

**Is it legal to scrape iCIMS career sites?** This actor collects only public job postings that employers publish on their career sites for anyone to read. It doesn't log in or open any private area. A posting's text can occasionally include a recruiter's name or work email; if you store or use personal data like that, make sure you have a legitimate reason and follow data-protection laws such as GDPR, PIPEDA and CCPA, as well as the site's terms. If you're unsure, check with a lawyer. More background: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. It reads only the public job search and job pages that anyone can open in a browser, the same way the careers page does. It never logs in, never uses accounts or cookies, and never sees candidate profiles, applications or anything behind the *Apply* button.

**Why do some jobs have no salary?** Many postings don't state pay. When a posting does (in a pay field or in the text), the range is extracted.

**Can I get every job at a company?** Yes. Leave *Keywords* empty and clear the limits. The run stops cleanly before its time limit and keeps everything collected so far.

**What happens when a career site is down or blocks the request?** The run does not fail. Every request is retried on fresh proxy IPs with backoff; a site that keeps refusing datacenter IPs switches to residential proxies by itself; a site that stays down is named in the status message and the `SUMMARY` record while the other companies complete. You pay only for job rows that reach the dataset, never for errors, not-found companies or empty searches, and the run stops itself before your spending limit or its time limit with a "Partial" status that says how many jobs were saved.

# Actor input Schema

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

Company names — no URL hunting needed. Looked up in a built-in directory of iCIMS employers, then on iCIMS directly (e.g. Peraton, PetSmart, REI, Ascension, Lowes Foods, Quest Software). A careers URL works here too.

## `startUrls` (type: `array`):

Any iCIMS careers page: https://careers-<company>.icims.com/jobs/search (search filters in the URL are kept), a single job link (…/jobs/12345/title/job), or an iCIMS-powered career site such as https://<company>.jibeapply.com or the company's own jobs site (e.g. https://www.rei.jobs).

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

Job title or keywords, searched on each company's site (the same search as its careers page). Each keyword is a separate search; results are de-duplicated. Leave empty for all open jobs. With keywords but no companies, the largest iCIMS employers are searched.

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

Maximum number of jobs across the whole run. Leave empty for no limit.

## `maxItemsPerCompany` (type: `integer`):

Cap per company, so one big employer doesn't use up the whole run. Leave empty for no per-company limit.

## `includeDetails` (type: `boolean`):

Adds the full description (text + HTML), qualifications/responsibilities where the site has them, and the salary range stated in the posting. Turn off for a faster, cheaper list of titles, locations, dates and links.

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

Cities, states/provinces or countries, e.g. Toronto, Ontario, Texas, Chantilly VA, Canada, Remote. Each location is a separate search. Matched to each site's own location filter.

## `radiusMiles` (type: `integer`):

For city locations on iCIMS-powered career sites: include jobs within this many miles.

## `categories` (type: `array`):

Job categories as the company names them, e.g. Engineering, Nursing, Information Technology, Retail Stores. Matched to each site's category filter.

## `employmentTypes` (type: `array`):

Only these job types. Uses the site's own filter where it has one, otherwise the job's listed type.

## `remoteTypes` (type: `array`):

Only remote, hybrid or on-site jobs (from the site's telecommute field, the job's location, or the posting's wording).

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

Only jobs posted in the last N days.

## `onlyNew` (type: `boolean`):

Remembers every job this actor has returned to you and skips it next time — schedule the actor daily for a new-jobs feed. You only pay for new jobs.

## `onlyNewStateKey` (type: `string`):

Use a different name per saved task/schedule to keep their “already seen” lists separate.

## `maxCompanies` (type: `integer`):

With keywords but no companies, this many of the largest iCIMS employers in the built-in directory are searched.

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

Requests in flight across all companies.

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

Apify's datacenter proxy works for most sites and is cheapest. A site that keeps refusing it automatically switches to residential proxies.

## Actor input object example

```json
{
  "companies": [
    "Peraton",
    "Lowes Foods"
  ],
  "keywords": [
    "manager"
  ],
  "maxItems": 20,
  "maxItemsPerCompany": 10,
  "includeDetails": true,
  "onlyNew": false,
  "onlyNewStateKey": "default",
  "maxCompanies": 100,
  "maxConcurrency": 16,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped job postings.

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

Which career site each company resolved to, jobs found per company, and notes (not found, moved, unsupported).

## `run` (type: `string`):

Status and statistics for this run.

# 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": [
        "Peraton",
        "Lowes Foods"
    ],
    "keywords": [
        "manager"
    ],
    "maxItems": 20,
    "maxItemsPerCompany": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/icims-careers-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": [
        "Peraton",
        "Lowes Foods",
    ],
    "keywords": ["manager"],
    "maxItems": 20,
    "maxItemsPerCompany": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/icims-careers-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": [
    "Peraton",
    "Lowes Foods"
  ],
  "keywords": [
    "manager"
  ],
  "maxItems": 20,
  "maxItemsPerCompany": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/icims-careers-scraper --silent --output-dataset

```

## MCP server setup

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