# isolved Jobs API | Live Postings, Tenants & New Jobs (`johnvc/isolved-jobs-api`) Actor

isolved and ApplicantPro job data without keys: live postings from any isolvedhire.com career site, tenant discovery across every hiring employer, and new-or-changed-posting detection. Titles, locations, employment type, timestamps, and Markdown/HTML/text descriptions. Pay per delivered row.

- **URL**: https://apify.com/johnvc/isolved-jobs-api.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## isolved Jobs API

The isolved jobs API pulls live jobs from any isolved career site through the public isolvedhire.com sitemaps, with no key and no login. Give it tenant names or job URLs and get back structured job records with titles, locations, employment type, timestamps, and full descriptions. Or give it nothing and let it discover tenants from its bundled directory of every isolved hiring employer.

isolved (and its ApplicantPro career sites) is the applicant tracking system behind thousands of US employers, from small businesses to mid-market companies. This API reads their public job pages live at run time, so every row reflects what the employer's site says right now, not what an index remembered from last week.

### What the isolved jobs API returns per job

| Field group | Fields |
|---|---|
| Identity | id, title, organization, organizationUrl, tenant, tenantUrl, url, applyUrl |
| Classification | employmentType, locationsDerived, isRemote |
| Timestamps | datePosted, dateUpdated (the job's own sitemap last-modified stamp) |
| Compensation | salaryRaw (published pay range, verbatim, when the employer sets one) |
| Content | descriptionMarkdown, descriptionHtml, descriptionText |
| Provenance | source, sourceType, sourceUrl, scrapedAt |

### Three modes in one actor

1. **Full job records** (default): every open job on the tenants you name, with descriptions in the formats you pick.
2. **Job URLs only**: the cheapest way to index everything: id, tenant, link, and the change timestamp, without descriptions.
3. **Tenant directory**: one row per employer that hires through isolved, live-verified with a current open-jobs count. The bundled directory is rebuilt from the public sitemap index, which lists every tenant.

Leave the tenant list empty and the API sweeps the directory for you, capped by maxTenants and maxJobs so an exploratory run stays small.

### Track new and changed postings without state

Every isolved job carries its own last-modified stamp in the sitemap. Set updatedAfter to 25h on a daily schedule and each run returns only what changed since yesterday, and because the cutoff is checked against the sitemap before any job page is fetched, you pay only for the postings that actually moved. There is no seen-list or delta store to maintain between runs. Use publishedAfter for a genuinely-new-roles feed.

### Pay for exactly what you receive

Billing is per delivered row, with no start fee and no minimum spend. Filters (title, location, employment type, salary, dates) run before billing, so filtered jobs cost nothing. The base job record is one event; Markdown, HTML, or plain-text descriptions and the whole-run report are optional add-ons, each billed only on the rows that actually carry them. Turn everything off and a job row costs a fraction of a cent.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| tenants | array | \["isolved"] | Tenant slugs or any tenant or single-job URL, mixed freely |
| startUrls | array | \[] | Same values in URL-list form; merged with tenants |
| outputMode | select | jobs | jobs, urlsOnly, or tenantsOnly |
| discoveryQuery | string | "" | Scopes tenantsOnly runs and empty-input sweeps |
| verifyTenants | boolean | true | Live-verify each tenant in tenantsOnly mode |
| titleKeywords | array | \[] | Keep only jobs whose title contains any of these |
| locationKeywords | array | \[] | Keep only jobs whose location contains any of these |
| employmentType | array | \[] | Keep only jobs of these types (FULL\_TIME, PART\_TIME, ...) |
| hasSalary | boolean | false | Keep only jobs with a published salary |
| updatedAfter | string | "" | Change detection: 24h, 7d, 2w, or an ISO date |
| publishedAfter | string | "" | Keep only jobs first posted on or after this cutoff |
| includeDescriptionMarkdown | boolean | true | Add a Markdown description (paid add-on) |
| includeDescriptionHtml | boolean | false | Add the original HTML description (paid add-on) |
| includeDescriptionText | boolean | false | Add a plain-text description (paid add-on) |
| report | select | none | Write a whole-run Markdown or HTML digest (paid add-on) |
| maxTenants | integer | 25 | Cap tenants in a sweep or tenantsOnly run |
| maxJobsPerTenant | integer | 0 | Cap job rows per tenant (0 = no cap) |
| maxJobs | integer | 100 | Hard ceiling on rows for the whole run (0 = unlimited) |
| maxConcurrency | integer | 5 | Parallel per-job page requests within a tenant |

### Example output

```json
{
  "resultType": "job",
  "id": "1848571",
  "title": "HR, Payroll & Marketing Specialist",
  "organization": "Davidson Oil",
  "tenant": "davidsonoil",
  "tenantUrl": "https://davidsonoil.isolvedhire.com",
  "url": "https://davidsonoil.isolvedhire.com/jobs/1848571.html",
  "employmentType": ["FULL_TIME"],
  "locationsDerived": ["Amarillo, TX, United States"],
  "isRemote": false,
  "datePosted": "2026-08-21T00:00:00+00:00",
  "dateUpdated": "2026-08-21T00:00:00+00:00",
  "descriptionMarkdown": "## About the role ...",
  "source": "isolved",
  "sourceType": "ats",
  "scrapedAt": "2026-09-08T12:00:00Z"
}
```

### Use cases

- Build or backfill a job board with live openings from thousands of US employers on the isolved ATS.
- Pull jobs from legacy ApplicantPro career sites too; this API resolves ApplicantPro tenants automatically.
- Feed an AI agent or LLM pipeline clean, per-job Markdown descriptions.
- Track new and changed postings for a set of employers on a daily or weekly schedule.
- Enumerate the isolved tenant universe for HR-tech market research and lead generation.
- Monitor a competitor's hiring by pointing the API at their isolved tenant.

### Getting started

1. Open the API on the Apify Store and click Try for free.
2. Put one or more tenant slugs in `tenants` (the slug is the part before `.isolvedhire.com`), or leave it empty for a small directory sweep.
3. Pick `outputMode`, set any filters, and run. Results stream to the dataset; export as JSON, CSV, or Excel.

[View on Apify Store](https://apify.com/johnvc/isolved-jobs-api?fpr=9n7kx3)

### Integrations

Run this API on a schedule and connect the dataset to your stack: n8n, Make, Zapier, and webhooks all read Apify datasets, and the run output loads straight into Google Sheets, Airtable, or a database. Every run is also reachable over the Apify API and, for AI agents, the MCP server below.

### Related tools

- [Greenhouse Job Board API](https://apify.com/johnvc/greenhouse-job-board-api?fpr=9n7kx3)
- [Ashby Job Board API](https://apify.com/johnvc/ashby-job-board-scraper?fpr=9n7kx3)
- [iCIMS Careers API](https://apify.com/johnvc/icims-careers-api?fpr=9n7kx3)
- [Oracle Taleo Jobs API](https://apify.com/johnvc/oracle-taleo-jobs-api?fpr=9n7kx3)
- [Workday Careers API](https://apify.com/johnvc/workday-careers-api?fpr=9n7kx3)

### 🔌 Use this API from Claude (MCP)

This API is an MCP server, so [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial) and other AI agents can call it directly. Add it with:

```
https://mcp.apify.com/?tools=actors,docs,johnvc/isolved-jobs-api
```

Then ask Claude to find isolved jobs for a tenant, discover isolved employers, or track new postings, and it runs this API and reads the results.

https://www.youtube.com/watch?v=4nxStxC1BJM

### 💸 Pay per run with crypto (x402)

The isolved Jobs API supports agentic payments via the x402 protocol, so an autonomous agent can pay for a run in USDC with no account or API token, on demand. This suits pay-as-you-go AI workflows that need job data without a standing subscription.

### Pricing

This API bills per delivered row on a pay-per-event model, with no start fee and no minimum. The base job record is one event, and the Markdown, HTML, and plain-text descriptions and the whole-run report are optional add-ons billed only on the rows that carry them. Job URLs only and the tenant directory are billed at their own lower per-row rates. Filters run before billing, so you never pay for rows you filtered out. Current per-event prices are shown on the Store page.

### FAQ

#### Is this an official isolved API?

No. This is an independent API that reads the public, unauthenticated job sitemaps that isolved career sites publish. It is not affiliated with or endorsed by isolved.

#### Is this an isolved scraper or an API?

Both. This isolved jobs scraper reads public isolved career-site sitemaps and returns the data as a clean JSON API, so you can call it from code, a no-code tool, or an AI agent. There is no key and no login.

#### What is a tenant slug?

The tenant slug is the subdomain of an employer's isolved career site. For `https://davidsonoil.isolvedhire.com` the slug is `davidsonoil`. You can pass the slug, the full site URL, or a single job URL.

#### How do I get only new or changed jobs?

Set `updatedAfter` to a relative window such as `25h` or `7d`, or an ISO date. The cutoff is checked against each job's sitemap last-modified stamp before the page is fetched, so a scheduled run returns and bills only what changed.

#### Does it return salaries?

When an employer publishes a structured salary on the posting, it comes through in `salaryRaw`. Most isolved employers leave salary blank, so this field is often empty, and the API never guesses a salary from the description text.

#### Can I call the isolved jobs API from an MCP client or AI agent?

Yes. The API is MCP-compatible. Add the MCP URL above in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial) or any MCP client and the agent can call it directly.

### 🌐 About Alpha OSINT

This API is part of Alpha OSINT, a family of open-data APIs for research and monitoring. More data sources and documentation: https://www.alphaosint.com . Questions or a data request? Open an issue: https://apify.com/johnvc/isolved-jobs-api/issues/open?fpr=9n7kx3

Last Updated: 2026.09.08

# Actor input Schema

## `tenants` (type: `array`):

isolved tenant slugs or URLs, mixed freely: a bare slug (davidsonoil), a tenant URL (https://davidsonoil.isolvedhire.com), or a single job URL (https://davidsonoil.isolvedhire.com/jobs/1778327.html). A tenant slug is the subdomain before .isolvedhire.com. Leave empty together with startUrls to sweep tenants from the bundled directory instead.

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

Alternative to the tenants field for URL-shaped input; both lists are merged. Accepts the same tenant and single-job URL forms.

## `outputMode` (type: `string`):

jobs returns full job records. urlsOnly returns the job index with change timestamps but no descriptions, the cheapest way to list everything. tenantsOnly returns one row per tenant from the discovery directory with a live job count.

## `discoveryQuery` (type: `string`):

Case-insensitive text matched against tenant slugs and names in the bundled directory. Scopes tenantsOnly runs and empty-input sweeps. Leave empty to take the largest tenants first.

## `verifyTenants` (type: `boolean`):

tenantsOnly mode: fetch each candidate tenant's live sitemap before returning it, adding a current job count. Dead tenants are skipped and never billed. Turn off to list the directory snapshot without network checks.

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

Keep only jobs whose title contains any of these words, for example nurse, driver, manager. Filters run before billing, so filtered jobs cost nothing. Ignored in urlsOnly mode, which has no titles.

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

Keep only jobs whose location contains any of these values, for example Remote, Charlotte, Texas.

## `employmentType` (type: `array`):

Keep only jobs matching any of these employment types. Values are matched against schema.org codes: FULL\_TIME, PART\_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER\_DIEM, OTHER. Plain wording like 'full time' is accepted too.

## `hasSalary` (type: `boolean`):

Keep only jobs whose posting carries a structured salary. Most isolved employers leave salary blank, so this filter is strict by design.

## `updatedAfter` (type: `string`):

Keep only jobs changed on or after this cutoff. Accepts a relative window (24h, 7d, 2w) or an ISO date or datetime (2026-08-01 or 2026-08-01T12:00:00Z). Uses each job's own sitemap lastmod, applied before any job page is fetched, so a daily schedule with 25h pays only for what changed. No state to manage. Note: lastmod is date-granular.

## `publishedAfter` (type: `string`):

Keep only jobs first posted on or after this cutoff. Same formats as updatedAfter. Uses the posting's datePosted, so it applies in jobs mode. Use this for genuinely-new-roles feeds.

## `includeDescriptionMarkdown` (type: `boolean`):

Add descriptionMarkdown to each job row: the posting converted to clean Markdown, compact and ready for AI agents and LLM pipelines. Billed per job row that carries it. Uncheck for cheaper metadata-only rows.

## `includeDescriptionHtml` (type: `boolean`):

Add descriptionHtml to each job row: the original posting markup, entity-decoded. Billed per job row that carries it.

## `includeDescriptionText` (type: `boolean`):

Add descriptionText to each job row: the posting flattened to plain prose. Billed per job row that carries it.

## `report` (type: `string`):

Also write a human-readable digest of every scraped job, grouped by employer, to the key-value store under the REPORT key. One flat charge per report. Capped at 5000 rows.

## `maxTenants` (type: `integer`):

Cap on tenants processed in a directory sweep or tenantsOnly run. Keeps empty-input runs small and predictable.

## `maxJobsPerTenant` (type: `integer`):

Cap on job rows per tenant after filtering. 0 means no per-tenant cap.

## `maxJobs` (type: `integer`):

Hard ceiling on rows across the entire run, all tenants combined. The main cost control. 0 means unlimited.

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

Parallel per-job page requests within a tenant. Lower it to be gentler on a tenant, raise it for speed.

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

Optional. isolved career sites answer direct connections, so leave this off unless your network requires a proxy.

## Actor input object example

```json
{
  "tenants": [
    "isolved"
  ],
  "startUrls": [],
  "outputMode": "jobs",
  "discoveryQuery": "",
  "verifyTenants": true,
  "titleKeywords": [],
  "locationKeywords": [],
  "employmentType": [],
  "hasSalary": false,
  "updatedAfter": "",
  "publishedAfter": "",
  "includeDescriptionMarkdown": true,
  "includeDescriptionHtml": false,
  "includeDescriptionText": false,
  "report": "none",
  "maxTenants": 25,
  "maxJobsPerTenant": 0,
  "maxJobs": 100,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every row this run produced.

## `overview` (type: `string`):

Job rows with the headline fields: title, employer, locations, type, dates, and the link.

## `changes` (type: `string`):

Job rows ordered for monitoring, with the last-updated date first.

## `tenants` (type: `string`):

One row per discovered tenant with a live open-jobs count and a link to their careers site.

## `report` (type: `string`):

The whole-run Markdown or HTML report, when the report add-on was enabled.

# 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 = {
    "tenants": [
        "isolved"
    ],
    "startUrls": [],
    "titleKeywords": [],
    "locationKeywords": [],
    "employmentType": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/isolved-jobs-api").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 = {
    "tenants": ["isolved"],
    "startUrls": [],
    "titleKeywords": [],
    "locationKeywords": [],
    "employmentType": [],
}

# Run the Actor and wait for it to finish
run = client.actor("johnvc/isolved-jobs-api").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 '{
  "tenants": [
    "isolved"
  ],
  "startUrls": [],
  "titleKeywords": [],
  "locationKeywords": [],
  "employmentType": []
}' |
apify call johnvc/isolved-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johnvc/isolved-jobs-api"
        }
    }
}

```

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/WxrIr3frNRVn3uWO9/builds/5Zt0CRVK71ux8DNmb/openapi.json
