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.
Input parameters
| PARAMETER | TYPE | REQ | DEFAULT | DESCRIPTION |
|---|---|---|---|---|
| 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
{
"tenants": ["isolved"],
"maxJobs": 25
}
{
"tenants": ["isolved", "davidsonoil"],
"updatedAfter": "25h",
"maxJobs": 200
}
{
"outputMode": "tenantsOnly",
"maxTenants": 100
}
{
"tenants": ["isolved"],
"includeDescriptionMarkdown": true,
"maxJobs": 25
}
{
"tenants": ["https://someco.applicantpro.com"],
"maxJobs": 25
}
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 →