AI Job Search Agent — Web Job Finder (BYOK) avatar

AI Job Search Agent — Web Job Finder (BYOK)

Pricing

Pay per usage

Go to Apify Store
AI Job Search Agent — Web Job Finder (BYOK)

AI Job Search Agent — Web Job Finder (BYOK)

An AI agent (Claude, bring your own Anthropic API key) that searches the open web for live job postings matching your free-text query — beyond any single job board. Returns verified records: title, company, location and a working apply URL. Finds roles other scrapers miss.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Nomad.Dev

Nomad.Dev

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

39 minutes ago

Last modified

Categories

Share

An AI agent (BYO API key — Anthropic or Mistral) that hunts the open web for postings matching your query — company career pages, niche boards, anywhere a single job board wouldn't cover.

Bring your own key. Pick a provider in the input: anthropic (default) uses Claude with its built-in web-search tool; mistral uses keenable (no-auth open-web search) for discovery plus a Mistral model for per-page judging/extraction. Either way, model usage is billed separately by the provider you picked, see Pricing below. Without a valid key for the selected provider the AI step is skipped and the run returns no items.

Two providers, same output

provider: "anthropic" (default)provider: "mistral"
DiscoveryOne Claude agent loop forms its own queries, browses, and judges results (built-in web_search_20250305 tool)keenable web search (no key needed) — queries built mechanically from your keywords/titleMustMatch
Page judging + extractionSame agent loop, inlineOne Mistral call per candidate page — vetoes index/aggregator/closed/stale pages, extracts the rest
Key requiredanthropicApiKeymistralApiKey
Output shapeIdentical — same fields, same downstream liveness check either way

Pick mistral if you'd rather not hold an Anthropic key, or want a cheaper/faster run — testing found it succeeds more reliably per attempt and finishes faster when Claude's agent loop does too, at a small precision cost the extraction prompt corrects for (rejects closed/stale/third-party-repost pages explicitly).

What this scraper returns

Each result is one flat JSON record per job posting. Before a result is returned, its URL is checked for basic liveness (see Verification below).

FieldMeaning
idStable identifier derived from the posting URL
sourceAlways "web_search" for this Actor
titleJob title as posted
companyHiring company / organisation
locationLocation / duty station (may include remote hints)
urlDirect link to the posting
postedAtPosting date where the source provides it (YYYY-MM-DD)
snippetShort description excerpt
salarySalary text where available — currently always null (this Actor's discovery agent does not extract salary yet)
verifiedtrue when the liveness check confirmed the URL reachable at run time; false when the check couldn't complete (timeout, connection error) but the result was kept (see below)

How to scrape AI job search with this Actor

  1. Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
  2. Adjust the input (keyword, filters, maxItems) or keep the defaults.
  3. Run it and export the dataset as JSON, CSV or Excel, or read it over the API.

Run it from your own code:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nomad-jobs/web-search-scraper").call(run_input={"maxItems": 15, "anthropicApiKey": "sk-ant-..."})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], "—", item["company"], item["url"])

Or a single HTTP call that runs the Actor and returns items in one response:

curl -X POST \
"https://api.apify.com/v2/acts/nomad-jobs~web-search-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"maxItems": 15, "anthropicApiKey": "sk-ant-..."}'

Verification

"Verified" means one thing only: the posting URL is HTTP-reachable and does not redirect to the site's homepage/root. After the discovery agent proposes candidate postings, this Actor issues a HEAD (falling back to GET) request to each URL with a 10-second timeout and modest concurrency. A result is dropped only when:

  • the final response is 404 or 410 (the posting is gone), or
  • the URL redirects to the site's root path (/ or empty path) — a common pattern for expired listings.

Anything else — a normal 200, a 403/5xx from a bot-defensive site, a timeout, or a connection error — is kept, since those don't reliably distinguish "blocked us" from "actually dead." Results kept because the check couldn't complete (timeout/connection error) carry verified: false so you can tell them apart from confirmed-reachable ones. This is a structural HTTP liveness check, not a claim about listing accuracy, freshness, or relevance — that judgment still comes from the discovery agent and any downstream scoring you apply.

Run-level counts (rawPostings, titleExcluded, urlsChecked, kept, dropped) are written to the run's key-value store under VERIFICATION_STATS and logged at the end of each run.

Input

FieldTypeDefaultNotes
providerstring (select)"anthropic"anthropic (Claude + built-in web search) or mistral (keenable web search + Mistral extraction). See Two providers above.
anthropicApiKeystring— (required when provider: "anthropic")Your Anthropic API key (sk-ant-…).
modelstring"claude-haiku-4-5-20251001"Claude model for the discovery agent (provider: "anthropic" only). Haiku is fast and inexpensive; switch to Sonnet or Opus for higher-quality extraction on complex pages.
mistralApiKeystring— (required when provider: "mistral")Your Mistral API key. Used only for per-page judging/extraction — the search itself (keenable) needs no key.
mistralModelstring (select)"mistral-medium-latest"Mistral model for per-page judging/extraction (provider: "mistral" only). Testing found Small matches Medium on quality for this task at ~5x the speed — switch to Small for faster/cheaper runs.
keywordsarrayRole or technology keywords the agent should search for (e.g. "frontend", "react", "typescript"). Each entry is one keyword or short phrase.
locationsarrayPreferred locations or "remote". Biases results toward these and skips obvious mismatches.
remotestring (select)"any"Remote work preference: any, remote-only, hybrid, on-site. provider: "anthropic" only — the mistral path doesn't currently read this field.
senioritystring (select)"any"Target seniority level: any, junior, mid, senior, lead. provider: "anthropic" only — the mistral path doesn't currently read this field.
titleMustMatcharrayBoth providers: preferred/searched title terms. On mistral, used to build the keenable search queries when keywords is empty.
titleExcludearrayPostings whose title contains any of these terms are dropped — enforced client-side after discovery, both providers.
maxItemsinteger15Maximum number of job postings to return (1–30). Either provider may return fewer if it can't find enough good candidates, or if some fail the liveness check.
maxAgeHoursinteger168Preferred maximum age of postings in hours (minimum 24). provider: "anthropic" only — the mistral path's extraction prompt has its own fixed ~30-day freshness cutoff instead.
userDescriptionstringFree-text description of what you are looking for. provider: "anthropic" only — the mistral path doesn't currently read this field.

Note on seniority: this field used to accept free text and now uses a fixed dropdown (any / junior / mid / senior / lead). If you have a saved input configuration with an old free-text value that isn't one of these options, it will fail validation on the next run — open the input and re-select from the dropdown.

Output example

{
"id": "ws-3f9a1c2b7d",
"source": "web_search",
"title": "Computational Linguist",
"company": "DeepJudge",
"location": "Zurich / Remote EU",
"url": "https://deepjudge.ai/careers/computational-linguist",
"postedAt": "2026-06-25",
"snippet": "Found on company careers page during agent web search.",
"salary": null,
"verified": true
}

Integrations

Send results straight to Google Sheets, Slack, Make, Zapier or any webhook via Apify integrations — no code required, or pull the dataset over the API.

Pricing

Your API key is billed separately by whichever provider you picked. The Apify pricing below covers Actor usage only:

  • provider: "anthropic" — Anthropic charges for model + built-in web-search tool usage on your key. See Anthropic's pricing.
  • provider: "mistral" — keenable's search needs no key (free to you). Mistral charges only for the small per-page judging/extraction calls on your key — typically far fewer tokens per run than the Anthropic agent-loop path. See Mistral's pricing.

Apify side — pay per event: $0.05 per Actor start and $0.004 per job returned. 100 jobs ≈ $0.45 on Apify. No subscription, no rental — you pay only for what you fetch.

Use cases

  • Long-tail job discovery beyond big boards
  • Passive-candidate tooling (find who hires for X)
  • Niche-role hunting (rare stacks, rare titles)
  • Backfilling gaps in board coverage

FAQ

Is it legal to scrape AI job search? This Actor reads only publicly available job postings — data any visitor can see without logging in. No personal data behind authentication is touched. Review the target site's terms and your local regulations for your specific use case.

Do I need an account on the target site? No. Postings are discovered via web search and fetched from public pages — no login, cookies or session tokens.

Does "verified" mean the listing is accurate or still accepting applications? No. It means the URL was HTTP-reachable and did not redirect to the site's homepage at check time (see Verification). A posting can still have closed between the check and when you view it.

How many jobs can I get? maxItems caps the run between 1 and 30 (default 15). The agent may return fewer than the cap if it can't find enough good candidates or if some fail the liveness check.

Why is salary always null? The discovery agent does not currently extract salary text from postings. The field is included in every record for schema consistency with other Actors in this collection.

Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.