isolved Jobs, as Rows You Can Query
Tenant slugs or job URLs in, live isolved jobs out as structured rows, each carrying the posting's own last-modified stamp so a scheduled run can return only what changed.
When to use this skill
- Someone wants isolved jobs and does not want to read isolvedhire.com career sites by hand.
- You are filling a job board, a market-intel dashboard, or a sourcing tool with roles from isolved-hosted and ApplicantPro career pages.
- You need a real change feed: isolved publishes a per-job last-modified stamp, so a daily run can return only new or edited postings with no state to keep.
- You went looking for an isolved jobs API and found the vendor's product only, not a way to read the public postings as data.
Not for: finding which employers run isolved in the first place. Use the companion apify-companies-using-isolved skill, built on the same Actor but shaped for tenant discovery. See references/actor-index.md.
What you get
One dataset row per job. resultType separates job rows from error rows.
Core fields:
id, url (canonical, safe as a dedupe key), applyUrl, title
organization, organizationUrl, tenant, tenantUrl
employmentType, locationsDerived, isRemote
datePosted, dateUpdated (the sitemap last-modified stamp; date-granular)
salaryRaw (the employer's published pay, verbatim; usually null on isolved)
descriptionMarkdown (default add-on), descriptionHtml, descriptionText (opt-in add-ons)
source (always isolved), sourceType (ats), sourceUrl, scrapedAt
The Actor ships dataset views for the console: overview, changes (ordered by last-updated for monitoring), and tenants.
Prerequisites
The Actor
Run it with the Apify CLI
One tenant, full job rows, capped at 25:
apify actors call "johnvc/isolved-jobs-api" -i '{"tenants":["isolved"],"maxJobs":25}' \
--json \
--user-agent apify-awesome-skills/apify-isolved-jobs-api \
2>/dev/null
Only postings that changed in the last day, the shape to put on a daily schedule:
apify actors call "johnvc/isolved-jobs-api" -i '{"tenants":["isolved","davidsonoil"],"updatedAfter":"25h","maxJobs":200}' \
--json \
--user-agent apify-awesome-skills/apify-isolved-jobs-api \
2>/dev/null
Full-time roles only, descriptions off for cheaper metadata rows:
apify actors call "johnvc/isolved-jobs-api" -i '{"tenants":["isolved"],"employmentType":["FULL_TIME"],"includeDescriptionMarkdown":false,"maxJobs":100}' \
--json \
--user-agent apify-awesome-skills/apify-isolved-jobs-api \
2>/dev/null
A legacy ApplicantPro site resolves automatically:
apify actors call "johnvc/isolved-jobs-api" -i '{"tenants":["https://someco.applicantpro.com"],"maxJobs":25}' \
--json \
--user-agent apify-awesome-skills/apify-isolved-jobs-api \
2>/dev/null
Confirm the live schema and prices before a large batch:
apify actors info "johnvc/isolved-jobs-api" --json \
--user-agent apify-awesome-skills/apify-isolved-jobs-api \
2>/dev/null
Read the rows back from a finished run:
apify datasets get-items <DATASET_ID> --format json \
--user-agent apify-awesome-skills/apify-isolved-jobs-api \
2>/dev/null
Every call carries the three flags this repo expects: --json (or --format json), --user-agent apify-awesome-skills/apify-isolved-jobs-api, and 2>/dev/null.
Run it from Claude or another AI agent (MCP)
The Actor is MCP-ready. Add the hosted server URL:
https://mcp.apify.com/?tools=actors,docs,johnvc/isolved-jobs-api
Then ask, for example: "Pull the newest isolved postings from these tenants in the last week and return title, location, and apply URL." MCP setup docs: https://docs.apify.com/platform/integrations/mcp
Workflow
- Start with one tenant and
maxJobs around 25. Look at the row shape before you pay for a wide crawl. A tenant slug is the part before .isolvedhire.com.
- Tenant slugs, full tenant URLs, and single job URLs all work as input, mixed freely. Legacy
applicantpro.com URLs resolve too.
- Filter at the source, not downstream.
titleKeywords, locationKeywords, employmentType, hasSalary, and updatedAfter all drop jobs before they are billed.
- Use
updatedAfter for a change feed and publishedAfter for a genuinely-new-roles feed. updatedAfter is checked against the sitemap stamp before any page is fetched, so unchanged postings are never even downloaded.
- Keep
includeDescriptionMarkdown on for LLM pipelines; turn it off for metadata-only rows at a lower per-row cost.
- Check
resultType before treating a row as a job. An error row carries errorCode and a human-readable errorMessage.
- Dedupe downstream on
url. It is canonical and survives an employer editing the title.
Inputs
tenants (array): tenant slugs, tenant URLs, or single job URLs, mixed freely. Empty sweeps the bundled directory.
startUrls (array): the same values in URL-list form; merged with tenants.
outputMode (enum jobs, urlsOnly, tenantsOnly, default jobs)
titleKeywords, locationKeywords (arrays): keep-only filters, run before billing.
employmentType (array): schema.org codes like FULL_TIME, PART_TIME; plain wording is accepted.
hasSalary (boolean, default false): keep only postings with a published salary.
updatedAfter (string): 24h, 7d, 2w, or an ISO date, against the sitemap last-modified stamp.
publishedAfter (string): same grammar, against the posting's datePosted.
includeDescriptionMarkdown (boolean, default true), includeDescriptionHtml, includeDescriptionText (default false)
report (enum none, markdown, html): a whole-run digest in the key-value store.
maxJobs (integer, default 100): the primary spend cap. maxJobsPerTenant, maxTenants, maxConcurrency refine it.
proxyConfiguration (object): off by default; direct connections work.
Cost
Billing is pay per event with no start fee, so a run that returns nothing costs almost nothing. Confirm live prices with the info command above rather than trusting a number copied here.
The base job-result event fires once per delivered job row. Add-on events fire only on rows that carry the extra: job-description-markdown (on by default), job-description-html, job-description-text, and a flat run-report. Tenant discovery rows and URL index rows have their own cheaper events.
Jobs removed by your filters are never charged. As a shape, 100 jobs with Markdown descriptions is small change.
Suggested confirmation thresholds: mention the estimate under about $5, warn the user over about $5, get explicit confirmation over about $20. Present cost as "around $X", never as a guarantee.
Honest limits
- Change detection is date-granular. The sitemap last-modified stamp is a date, so
updatedAfter resolves to days, not hours. A 25h window on a daily schedule is the right shape.
- Salary appears only when the employer publishes structured pay on the posting, which most isolved employers do not, so
salaryRaw is often null. Nothing is inferred by a model.
- Public career-site data only. No applicant data, no recruiter contacts, nothing behind a login.
- US-focused. isolved career sites are almost entirely United States employers.
Troubleshooting
board_not_found: the tenant has no public job sitemap; it may not exist or has no live jobs. Check the slug or paste the tenant URL.
http_error: the source answered abnormally; the row says which HTTP status. Retry once before assuming anything.
invalid_url: the entry is not an isolved tenant slug, tenant URL, or job URL.
- Zero rows and no error row: your filters removed everything. Relax
updatedAfter or titleKeywords first.
- Duplicates across runs: dedupe on
url, never on title.
See references/gotchas.md for cost guardrails and error recovery, and references/actor-index.md for the Actor routing table.
Related Actors
1---2name: apify-isolved-jobs-api3description: Scrape isolved jobs from any isolvedhire.com career site with the isolved Jobs API Actor (johnvc/isolved-jobs-api). Returns live job rows as JSON: title, hiring organization, tenant, employment type, locations with derived country, posted date, a sitemap last-modified stamp, apply URL, the employer's published salary when present, and the description as Markdown by default. Takes tenant slugs, tenant URLs, or single job URLs, and resolves legacy ApplicantPro sites too; filters by title, location, employment type, and salary before billing. updatedAfter turns a daily schedule into a real new-or-changed-postings feed using each job's own lastmod, checked before any page is fetched, so you pay only for what moved. Use when someone wants isolved jobs data, an isolved jobs api, to scrape isolved or ApplicantPro job postings for a job board or aggregator, isolved ATS listings, or change detection on isolved postings. Billed per job delivered with no start fee, and MCP-ready for Claude and other AI agents.4license: MIT5---67# isolved Jobs, as Rows You Can Query89Tenant slugs or job URLs in, live isolved jobs out as structured rows, each carrying the posting's own last-modified stamp so a scheduled run can return only what changed.1011## When to use this skill1213- Someone wants isolved jobs and does not want to read isolvedhire.com career sites by hand.14- You are filling a job board, a market-intel dashboard, or a sourcing tool with roles from isolved-hosted and ApplicantPro career pages.15- You need a real change feed: isolved publishes a per-job last-modified stamp, so a daily run can return only new or edited postings with no state to keep.16- You went looking for an isolved jobs API and found the vendor's product only, not a way to read the public postings as data.1718Not for: finding which employers run isolved in the first place. Use the companion `apify-companies-using-isolved` skill, built on the same Actor but shaped for tenant discovery. See `references/actor-index.md`.1920## What you get2122One dataset row per job. `resultType` separates `job` rows from `error` rows.2324Core fields:2526- `id`, `url` (canonical, safe as a dedupe key), `applyUrl`, `title`27- `organization`, `organizationUrl`, `tenant`, `tenantUrl`28- `employmentType`, `locationsDerived`, `isRemote`29- `datePosted`, `dateUpdated` (the sitemap last-modified stamp; date-granular)30- `salaryRaw` (the employer's published pay, verbatim; usually null on isolved)31- `descriptionMarkdown` (default add-on), `descriptionHtml`, `descriptionText` (opt-in add-ons)32- `source` (always `isolved`), `sourceType` (`ats`), `sourceUrl`, `scrapedAt`3334The Actor ships dataset views for the console: `overview`, `changes` (ordered by last-updated for monitoring), and `tenants`.3536## Prerequisites3738- Apify account (sign up at https://apify.com?fpr=9n7kx3&fp_sid=skillrepo).39- Authentication via `apify login`, or an `APIFY_TOKEN` environment variable (Apify Console, Settings, Integrations).4041## The Actor4243- Store page: https://apify.com/johnvc/isolved-jobs-api?fpr=9n7kx3&fp_sid=skillrepo44- Actor ID: `johnvc/isolved-jobs-api`45- Pricing: pay per event, no start fee. See the cost section below and `references/gotchas.md` for the live-price command.4647## Run it with the Apify CLI4849One tenant, full job rows, capped at 25:5051```bash52apify actors call "johnvc/isolved-jobs-api" -i '{"tenants":["isolved"],"maxJobs":25}' \53 --json \54 --user-agent apify-awesome-skills/apify-isolved-jobs-api \55 2>/dev/null56```5758Only postings that changed in the last day, the shape to put on a daily schedule:5960```bash61apify actors call "johnvc/isolved-jobs-api" -i '{"tenants":["isolved","davidsonoil"],"updatedAfter":"25h","maxJobs":200}' \62 --json \63 --user-agent apify-awesome-skills/apify-isolved-jobs-api \64 2>/dev/null65```6667Full-time roles only, descriptions off for cheaper metadata rows:6869```bash70apify actors call "johnvc/isolved-jobs-api" -i '{"tenants":["isolved"],"employmentType":["FULL_TIME"],"includeDescriptionMarkdown":false,"maxJobs":100}' \71 --json \72 --user-agent apify-awesome-skills/apify-isolved-jobs-api \73 2>/dev/null74```7576A legacy ApplicantPro site resolves automatically:7778```bash79apify actors call "johnvc/isolved-jobs-api" -i '{"tenants":["https://someco.applicantpro.com"],"maxJobs":25}' \80 --json \81 --user-agent apify-awesome-skills/apify-isolved-jobs-api \82 2>/dev/null83```8485Confirm the live schema and prices before a large batch:8687```bash88apify actors info "johnvc/isolved-jobs-api" --json \89 --user-agent apify-awesome-skills/apify-isolved-jobs-api \90 2>/dev/null91```9293Read the rows back from a finished run:9495```bash96apify datasets get-items <DATASET_ID> --format json \97 --user-agent apify-awesome-skills/apify-isolved-jobs-api \98 2>/dev/null99```100101Every call carries the three flags this repo expects: `--json` (or `--format json`), `--user-agent apify-awesome-skills/apify-isolved-jobs-api`, and `2>/dev/null`.102103## Run it from Claude or another AI agent (MCP)104105The Actor is MCP-ready. Add the hosted server URL:106107`https://mcp.apify.com/?tools=actors,docs,johnvc/isolved-jobs-api`108109Then ask, for example: "Pull the newest isolved postings from these tenants in the last week and return title, location, and apply URL." MCP setup docs: https://docs.apify.com/platform/integrations/mcp110111## Workflow1121131. Start with one tenant and `maxJobs` around 25. Look at the row shape before you pay for a wide crawl. A tenant slug is the part before `.isolvedhire.com`.1142. Tenant slugs, full tenant URLs, and single job URLs all work as input, mixed freely. Legacy `applicantpro.com` URLs resolve too.1153. Filter at the source, not downstream. `titleKeywords`, `locationKeywords`, `employmentType`, `hasSalary`, and `updatedAfter` all drop jobs before they are billed.1164. Use `updatedAfter` for a change feed and `publishedAfter` for a genuinely-new-roles feed. `updatedAfter` is checked against the sitemap stamp before any page is fetched, so unchanged postings are never even downloaded.1175. Keep `includeDescriptionMarkdown` on for LLM pipelines; turn it off for metadata-only rows at a lower per-row cost.1186. Check `resultType` before treating a row as a job. An `error` row carries `errorCode` and a human-readable `errorMessage`.1197. Dedupe downstream on `url`. It is canonical and survives an employer editing the title.120121## Inputs122123- `tenants` (array): tenant slugs, tenant URLs, or single job URLs, mixed freely. Empty sweeps the bundled directory.124- `startUrls` (array): the same values in URL-list form; merged with `tenants`.125- `outputMode` (enum `jobs`, `urlsOnly`, `tenantsOnly`, default `jobs`)126- `titleKeywords`, `locationKeywords` (arrays): keep-only filters, run before billing.127- `employmentType` (array): schema.org codes like `FULL_TIME`, `PART_TIME`; plain wording is accepted.128- `hasSalary` (boolean, default false): keep only postings with a published salary.129- `updatedAfter` (string): `24h`, `7d`, `2w`, or an ISO date, against the sitemap last-modified stamp.130- `publishedAfter` (string): same grammar, against the posting's `datePosted`.131- `includeDescriptionMarkdown` (boolean, default true), `includeDescriptionHtml`, `includeDescriptionText` (default false)132- `report` (enum `none`, `markdown`, `html`): a whole-run digest in the key-value store.133- `maxJobs` (integer, default 100): the primary spend cap. `maxJobsPerTenant`, `maxTenants`, `maxConcurrency` refine it.134- `proxyConfiguration` (object): off by default; direct connections work.135136## Cost137138Billing is pay per event with no start fee, so a run that returns nothing costs almost nothing. Confirm live prices with the info command above rather than trusting a number copied here.139140The base `job-result` event fires once per delivered job row. Add-on events fire only on rows that carry the extra: `job-description-markdown` (on by default), `job-description-html`, `job-description-text`, and a flat `run-report`. Tenant discovery rows and URL index rows have their own cheaper events.141142Jobs removed by your filters are never charged. As a shape, 100 jobs with Markdown descriptions is small change.143144Suggested confirmation thresholds: mention the estimate under about $5, warn the user over about $5, get explicit confirmation over about $20. Present cost as "around $X", never as a guarantee.145146## Honest limits147148- **Change detection is date-granular.** The sitemap last-modified stamp is a date, so `updatedAfter` resolves to days, not hours. A `25h` window on a daily schedule is the right shape.149- Salary appears only when the employer publishes structured pay on the posting, which most isolved employers do not, so `salaryRaw` is often null. Nothing is inferred by a model.150- Public career-site data only. No applicant data, no recruiter contacts, nothing behind a login.151- US-focused. isolved career sites are almost entirely United States employers.152153## Troubleshooting154155- `board_not_found`: the tenant has no public job sitemap; it may not exist or has no live jobs. Check the slug or paste the tenant URL.156- `http_error`: the source answered abnormally; the row says which HTTP status. Retry once before assuming anything.157- `invalid_url`: the entry is not an isolved tenant slug, tenant URL, or job URL.158- Zero rows and no error row: your filters removed everything. Relax `updatedAfter` or `titleKeywords` first.159- Duplicates across runs: dedupe on `url`, never on title.160161See `references/gotchas.md` for cost guardrails and error recovery, and `references/actor-index.md` for the Actor routing table.162163## Related Actors164165- Greenhouse Job Board API: https://apify.com/johnvc/greenhouse-job-board-api?fpr=9n7kx3&fp_sid=skillrepo166- Ashby Job Board API: https://apify.com/johnvc/ashby-job-board-scraper?fpr=9n7kx3&fp_sid=skillrepo167- iCIMS Careers API: https://apify.com/johnvc/icims-careers-api?fpr=9n7kx3&fp_sid=skillrepo168- Workday Careers API: https://apify.com/johnvc/workday-careers-api?fpr=9n7kx3&fp_sid=skillrepo