isolved Jobs API

Read isolved job postings from any isolvedhire.com career site as structured JSON. isolved, and its legacy ApplicantPro sites, is the applicant tracking system behind thousands of US employers, and every posting it publishes carries a sitemap last-modified stamp. That makes this a jobs feed with honest change detection: set updatedAfter to a window like 25h on a daily schedule and each run returns only the postings that moved since yesterday, checked against the sitemap before any page is fetched, so you pay for nothing stale and keep no seen-list between runs. Give it tenant slugs or job URLs, or nothing at all and it sweeps a directory rebuilt live from isolved's own sitemap index of every hiring tenant, so the coverage never goes stale.

MEDIAN LAGon demand
PARAMETERS10
TOTAL USERS3
MONTHLY ACTIVE2
TOTAL RUNS14
SUCCESS (30D)100.0%
RATINGno ratings yet
LAST MODIFIED2026-09-11
PUBLISHED2026-09

Input parameters

PARAMETERTYPEREQDEFAULTDESCRIPTION
tenants string[] no isolved tenant slugs or URLs, mixed freely. A bare slug (davidsonoil), a tenant URL on isolvedhire.com, or a single job URL all work. Legacy applicantpro.com sites resolve too. Empty sweeps the bundled directory instead.
outputMode enum no jobs jobs · urlsOnly · tenantsOnly. Full records, the cheap link index, or the tenant discovery directory.
updatedAfter string no The change-detection cutoff. A window like 24h or 7d, or an ISO date, checked against each job's sitemap last-modified stamp before the page is fetched. A daily schedule with 25h returns only what changed, with no state to manage. Date-granular.
publishedAfter string no Same grammar, against the posting's datePosted, for a genuinely-new-roles feed rather than an any-change feed.
titleKeywords string[] no Keep only jobs whose title contains any of these. All filters run before billing, so a filtered job costs nothing.
employmentType string[] no Keep only jobs matching schema.org employment types like FULL_TIME or PART_TIME. Plain wording such as 'full time' is accepted too.
locationKeywords string[] no Keep only jobs whose location contains any of these, for example Remote or a city or state.
includeDescriptionMarkdown boolean no true The posting converted to clean Markdown, the format AI pipelines ingest without cleanup. HTML and plain-text variants are separate toggles.
maxJobs integer no 100 Hard ceiling on rows across the whole run, the main cost control. 0 means unlimited. — drives your bill
maxTenants integer no 25 Cap on tenants processed in discovery sweeps. — drives your bill

Worked examples

Basic — one tenant, full job records
{
  "tenants": ["isolved"],
  "maxJobs": 25
}
Daily change feed — the shape to put on a schedule, zero state
{
  "tenants": ["isolved", "davidsonoil"],
  "updatedAfter": "25h",
  "maxJobs": 200
}
Employers using isolved — the live tenant directory, verified
{
  "outputMode": "tenantsOnly",
  "maxTenants": 100
}
Markdown for an AI agent — descriptions the model can read cheaply
{
  "tenants": ["isolved"],
  "includeDescriptionMarkdown": true,
  "maxJobs": 25
}
ApplicantPro tenant — legacy ApplicantPro sites resolve automatically
{
  "tenants": ["https://someco.applicantpro.com"],
  "maxJobs": 25
}
POWER-USER TIP
updatedAfter is the feature to build on — Every isolved posting carries a sitemap last-modified stamp, and this API checks it before fetching the page. That is what lets a daily schedule with updatedAfter set to 25h behave as a change feed with nothing to store between runs and no wasted fetches on unchanged postings. Use publishedAfter instead when you only want genuinely new roles. Note the stamp is date-granular, so a since-window resolves to days.
POWER-USER TIP
Salary fields are honest, and often empty — Most isolved employers leave structured pay blank, so salaryRaw passes through only what the posting's JSON-LD actually serves and nothing is inferred from the description text. Expect salary on a minority of postings.
POWER-USER TIP
Discovery never goes stale — The tenant directory is rebuilt from isolved's own public sitemap index, which lists every tenant, so tenantsOnly mode and empty-input sweeps re-enumerate the live universe rather than reading a frozen list. New employers appear on their own.

Code

curl

curl -X POST "https://api.apify.com/v2/acts/johnvc~isolved-jobs-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tenants":["isolved"],"maxJobs":25}'

Python

from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("johnvc/isolved-jobs-api").call(
    run_input={
        "tenants": ["isolved", "davidsonoil"],
        "updatedAfter": "7d",
        "maxJobs": 50,
    }
)
for job in client.dataset(run.default_dataset_id).iterate_items():
    print(job.get("dateUpdated"), job.get("title"), "-", job.get("organization"))

What people use it for

  • A daily change feed across hundreds of isolved employers with zero state
  • Backfilling a job board straight from the source instead of a third-party index
  • Mapping every US employer that hires through isolved as a sales or recruiting list
  • Markdown job descriptions for AI recruiting agents over MCP
  • Covering legacy ApplicantPro career sites in the same run
  • Watching one employer's isolved site on a schedule and alerting on new roles

More sources for Hiring signals and talent intelligence, Grounding AI agents and MCP tools

Alternatives