TL;DR
The job is structured listings, not a pile of HTML. Job board scraping software should return title, company, location, and URL so you can scrape job postings without clicking every board. ScrapeGraphAI did that on Airbnb's public Greenhouse board: eight jobs, 5 credits for extract.
Indeed returned no rows on a normal extract, then timed out with stealth. LinkedIn failed until stealth was on, which adds 5 credits. Start with a public company board if you need a sample that actually runs. Use Octoparse or Browse AI if you do not want to write code.
If you are comparing job board scraping software in 2026, you probably want a job scraper that turns listings into a spreadsheet or a JSON feed. Job scraping is the process: fetch a public listings page, keep the fields you care about, skip the chrome. Web scraping job postings used to mean CSS selectors and a proxy pool. Now it is often one schema and a hosted fetch.
I would not start on Indeed or LinkedIn. Both boards block aggressively. The runnable sample later in this post uses Airbnb's Greenhouse board, which returned real titles, companies, locations, and URLs. The Indeed and LinkedIn sections show how you would point the same job scraper at those sites, and what happened when I did.
The companion Google Colab runs the Greenhouse extract with getpass for the key. The notebook stores neither the key nor run output.
I checked public pricing pages. ScrapeGraphAI numbers match packages/shared/src/plans.ts. Vendors change cards, so confirm before you budget.
What job board scraping software actually does
Job board scraping software is a scraper aimed at listings. The useful output is a row per job: title, company, location, salary when the page shows it, posting date, and a URL you can open later. That is different from a crawl that dumps every careers page into Markdown and hopes an analyst will sort it.
Job scraping shows up in a few jobs:
- Recruiters watching competitor openings and new roles in a city
- Researchers building a labor-market snapshot from public boards
- Job seekers who are tired of checking five sites by hand
- Internal tools that refresh a team's own pipeline from Greenhouse, Lever, or a company careers page
Getting HTML is cheap. Getting the same four fields from Airbnb's board, a Lever page, and a We Work Remotely category without rewriting selectors every month is the actual work. Layouts change. Cookie banners sit on top of the list. Some boards render the grid in JavaScript. Some answer a bot with an empty shell.
An indeed scraper and a linkedin job scraper use the same fields. The target is what changes. Indeed and LinkedIn invest in bot detection. A public Greenhouse or Lever board is usually calmer: same fields, fewer puzzles. If your pipeline can start there, start there.
ScrapeGraphAI bills this work by service, not as one credit per HTTP call. Markdown scrape is 1 credit. Structured extract is 5. Stealth is +5 on top of that. On ScrapeGraphAI pricing, Free is 500 credits once, Starter is $20 for 10,000 credits a month ($204 billed yearly), Growth is $100 for 100,000, and Pro is $500 for 750,000. Full cards live on the pricing page.
Comparison: 6 job scrapers for 2026
| Tool | Best for | Starting price | Code? | Notes |
|---|---|---|---|---|
| ScrapeGraphAI | Schema extract from public boards | Starter $20 / 10k credits | Yes | Extract 5 credits; stealth +5 |
| Apify | Ready-made job-board Actors | Free $5 credit; Starter $29 | Optional | Compute plus Actor fees |
| Octoparse | Point-and-click job scraping | Free; Standard from $83/mo | No | Cloud schedules and templates |
| ScrapingBee | HTML access, you parse | Freelance $49/mo | Yes | JS render and proxies |
| Browse AI | Record a robot, monitor listings | Free 50 credits; Personal $19/mo billed annually | No | Monthly Personal is higher |
| Firecrawl | Markdown or JSON for agents | Hobby $19 / 5k credits | Yes | JSON format adds 4 credits |
"Starting price" is the first paid card that is useful, or the free tier when it exists. Apify's $29 Starter is a usage budget, not a pile of job rows. Firecrawl Hobby's 5,000 credits become 1,000 JSON pages once you turn structured output on. Browse AI prints $19/month on annual Personal billing; the monthly Personal card is higher.
1. ScrapeGraphAI
ScrapeGraphAI is the one I would use to scrape job postings when I already have URLs and I care about a stable schema. You describe the fields, pass a Pydantic model, and get JSON. When Airbnb redesigns the careers page, the prompt still asks for title and location. You are not married to a CSS class named job-card-v3.
I ran this against https://boards.greenhouse.io/airbnb. Eight listings came back with title, company, location, and URL. That call is 5 credits for extract. No stealth. The same schema is what you would reuse on a Lever board or a company /careers page.

Create a key in the dashboard, then install the current SDK. It needs Python 3.12+ (Python SDK docs):
pip install "scrapegraph-py>=2.1.0" "pydantic>=2"import json
from getpass import getpass
from pydantic import BaseModel, Field
from scrapegraph_py import ScrapeGraphAI
class JobPosting(BaseModel):
title: str = Field(description="Job title as shown")
company: str = Field(description="Hiring company name")
location: str = Field(description="Location text, or Remote if shown")
url: str = Field(description="Absolute listing URL if linked, else empty string")
class JobBoard(BaseModel):
jobs: list[JobPosting] = Field(description="Up to 8 visible job listings")
api_key = getpass("ScrapeGraphAI API key: ")
sgai = ScrapeGraphAI(api_key=api_key)
source_url = "https://boards.greenhouse.io/airbnb"
response = sgai.extract(
(
"This is a public job listings page. Extract up to 8 visible individual "
"job listings, not category links. For each job return title, company, "
"location, and the absolute listing URL. Use only facts visible on the page."
),
url=source_url,
schema=JobBoard.model_json_schema(),
)
if response.status != "success":
raise RuntimeError(response.error)
board = JobBoard.model_validate(response.data.json_data)
print(json.dumps([job.model_dump() for job in board.jobs[:3]], indent=2))Live output from that run (first three rows):
[
{
"title": "(Contract) Senior Data Scientist, Platform Inference - MarTech DS Measurement",
"company": "Airbnb",
"location": "United States",
"url": "https://careers.airbnb.com/positions/7732569/"
},
{
"title": "Acquisition Manager",
"company": "Airbnb",
"location": "Paris, France",
"url": "https://careers.airbnb.com/positions/7995199/"
},
{
"title": "Acquisition Manager",
"company": "Airbnb",
"location": "Berlin, Germany",
"url": "https://careers.airbnb.com/positions/7995153/"
}
]
To dump a CSV, validate the schema and write rows. Keep source_url on the Python side. The page does not have to print its own URL:
import csv
from datetime import datetime, timezone
rows = [
{**job.model_dump(), "source_url": source_url, "collected_at": datetime.now(timezone.utc).isoformat()}
for job in board.jobs
]
with open("job_postings.csv", "w", newline="") as handle:
writer = csv.DictWriter(handle, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)Stealth is a separate meter. Leave it off until a board actually blocks you. Markdown scrape of the same URL is 1 credit if you only want readable text for an agent. Details: extract and the price calculator.
2. Apify
If someone on your team already lives in Apify, look at the store before you write a parser. There are Actors aimed at Indeed, LinkedIn, and generic job boards. A maintained one can give you rows in an afternoon. You pay in compute units, proxy traffic, and sometimes extra Actor fees. Free includes $5 of platform credit a month. Starter is $29. Scale is $199. Business is $999. Those dollars are a usage budget. A slow headless Actor can burn the Starter card faster than a thin HTTP Actor.
I would use Apify when the Actor already exists and is maintained. I would not use it as a "cheap Indeed API" without reading the Actor's billing notes. For the meter itself, see Apify Pricing in 2026: Plans, Compute Units, and Real Costs.
3. Octoparse
Octoparse is the point-and-click option. You click the title, company, and location, save a template, and schedule it in the cloud. That is the right shape if the person who needs the jobs does not want a Python environment. Octoparse still sells a free plan with local runs and a 50,000-row monthly export cap. Paid Standard starts at $83/month on monthly billing, or $69/month billed annually, per Octoparse's public plan copy. Professional is $299/month ($249 billed annually).
Templates help on common job sites. They also go stale. If the board A/B tests its markup, you are back in the editor. For a longer pricing walkthrough, see Octoparse Pricing: Plans, Tasks, and Real Costs and ScrapeGraphAI vs Octoparse: Best AI Web Scraper in 2026.
4. ScrapingBee
ScrapingBee will not parse the job grid for you. You send a URL, they handle proxies, JavaScript rendering, and a chunk of the anti-bot work, and you get HTML or a screenshot. Freelance is $49/month. Startup is $99/month. Business+ is $599/month. Credits stop meaning one page once rendering is on.
This is a reasonable job scraper backend if you already have selectors and you are tired of rotating proxies. It is a poor fit if you wanted JSON out of the box. Alternatives with a different meter: 6 Best ScrapingBee Alternatives for Web Scraping in 2026.
5. Browse AI
Browse AI records a robot in the browser: open the board, click the list, map columns, then monitor. Prebuilt robots exist for some sites. The Free plan is 50 credits a month. Personal is $19/month billed annually (the monthly Personal card is higher; Browse AI's pricing page showed $48/month when I checked). Professional is $69/month billed annually. Premium starts at $500/month billed annually. Credits are tied to rows and to "premium" sites that need a more expensive fetch.
If a recruiter wants a Google Sheet that refreshes overnight, this is closer to their workflow than an SDK. If you need a typed schema across 40 company career pages, you will fight the robot list. Comparison: ScrapeGraphAI vs Browse AI: AI Scraper Comparison.
6. Firecrawl
Firecrawl is built for turning pages into Markdown or JSON for agents. Hobby is $19/month for 5,000 credits ($16 billed annually). Standard is $99 for 100,000. Growth is $399 for 500,000. Scrape, crawl, and map are 1 credit per page. JSON format adds 4, so structured extraction is 5 credits a page, the same base extract cost as ScrapeGraphAI before stealth. Enhanced Mode adds another 4.
Use it when you want a site map and Markdown from a careers subdomain. Use a schema extract when you already have the listing URL and you want rows. Firecrawl's public cards: firecrawl.dev/pricing. Wider list: 7 Best Firecrawl Alternatives for AI Web Scraping in 2026.
Indeed scraper: what actually works
Indeed is the board people name first, and it is a bad first target. An indeed scraper has to get past a JavaScript search grid, location cookies, and bot checks that empty the page for automated clients.
I sent https://www.indeed.com/jobs?q=software+engineer&l=Remote to ScrapeGraphAI extract with the same schema as the Greenhouse run. The request succeeded. It returned zero jobs. A second call with stealth enabled (FetchConfig(stealth=True), +5 credits) timed out. I am not going to pretend that is a production Indeed feed.
If you still need Indeed, use it as a second stage after a public board pipeline works. Prefer a company careers URL when Indeed is only mirroring it. Read Best Indeed Scraper: Extract Jobs and Salaries in 2026 for the Indeed-specific field list (salary estimates, ratings) and the same legal caution.
Pointing an indeed job scraper at a search URL
The snippet below is how you would point an indeed job scraper at a search page. It is the same schema as the working Greenhouse sample. Swap the URL. Keep stealth off until you see an empty or blocked page, then turn it on and budget 10 credits (5 extract + 5 stealth). Do not treat this as a guaranteed Indeed integration. My live run did not return rows.
from scrapegraph_py import FetchConfig, ScrapeGraphAI
sgai = ScrapeGraphAI(api_key=api_key)
indeed_url = "https://www.indeed.com/jobs?q=software+engineer&l=Remote"
response = sgai.extract(
(
"Extract up to 8 visible job listings with title, company, location, "
"and listing URL. If the page is a block or empty shell, return an empty list."
),
url=indeed_url,
schema=JobBoard.model_json_schema(),
fetch_config=FetchConfig(stealth=True),
)Indeed's terms restrict automated access. Public listings are still subject to the site's rules and to whatever your counsel says about the use case. This post is not legal advice.
LinkedIn job scraper
A linkedin job scraper is the other high-intent search. LinkedIn's job search is a logged-in product with a public slice. The public search URL still fails a lot of naive fetches.
Same day, same schema, https://www.linkedin.com/jobs/search/?keywords=software%20engineer: a normal extract returned a server error. With stealth, the call succeeded in about 57 seconds and returned listings (title, company, location, LinkedIn job URL). That is 10 credits for that page, not 5. It also is not a license to ignore LinkedIn's terms. LinkedIn is explicit about unauthenticated scraping in its user agreement. Use official products when you need LinkedIn's graph. Use a public company board when you need roles the company already published.
If the data you actually want is public profiles rather than jobs, that is a different article: LinkedIn Scraper with ScrapeGraphAI: Profiles to JSON. For outbound workflows that start from public pages, How to Generate Leads Using ScrapeGraphAI from LinkedIn Data is the adjacent guide. Neither one is a bypass for LinkedIn's paid APIs.
linkedin_url = "https://www.linkedin.com/jobs/search/?keywords=software%20engineer"
response = sgai.extract(
(
"Extract up to 8 visible job listings with title, company, location, "
"and listing URL. If the page is a login wall, return an empty list."
),
url=linkedin_url,
schema=JobBoard.model_json_schema(),
fetch_config=FetchConfig(stealth=True),
)For anything you ship, keep the Greenhouse-style public board as the default path. Treat LinkedIn as optional, metered, and likely to break.
How to scrape job postings without a dedicated board API
Most companies do not sell a jobs API. Greenhouse, Lever, Ashby, and a careers subdomain are the public record. Web scraping job postings from those pages is a fetch-plus-schema problem:
- Collect listing URLs you are allowed to fetch (a board index, a sitemap, or a search you already have).
- Define the fields you can actually see. Do not ask the model for salary if the page never shows one.
- Extract with that schema. Validate with Pydantic so a bad row fails in your code, not in a spreadsheet.
- Store
source_urland a timestamp yourself. - Add stealth only after a plain extract comes back empty or blocked.
Markdown scrape (1 credit) is useful when an agent needs the description text and you do not want JSON yet. Extract (5 credits) is the row builder. Crawl is a different meter: 2 credits to start, then per-page scrape cost. You rarely need a full-site crawl to watch one company's open roles.
What to look for in a job scraper
If the operator is not a developer, a click-and-record tool will beat an SDK. Price the meter you will actually burn: credits, compute, or rows, not a headline that says unlimited. Indeed and LinkedIn need anti-bot handling. A public Greenhouse index often does not. CSV and JSON cover most pipelines. Support shows up the first time a board ships a new layout.
I care more about a schema I control than about a template gallery. Templates are fast on day one and quiet until they fail. A schema still needs a working fetch, which is why the live test used a board that returned data.
Legal notes
Collecting public listings is not automatically allowed just because a page loads without a password. Read the board's terms, respect robots.txt as a policy signal even when the law in your jurisdiction treats it as one, and do not walk through login walls, CAPTCHA bypass theater, or credential stuffing. Salary and applicant data can be personal data. If that is in scope, talk to counsel. A practical overview: Is Web Scraping Legal? Legality Guide and Best Practices.
ScrapeGraphAI fetches pages you point it at. It does not decide whether your use is permitted.
Run it in Google Colab
The companion notebook has the same workflow: install, getpass for the key, schema extract, CSV. Open it, paste your own key, run top to bottom. The key is not stored in the notebook.
FAQ
What is job board scraping software?
Job board scraping software collects public listings into structured rows: title, company, location, URL, and whatever else the page shows. That might be a hosted API, a recorded robot, a desktop app, or an Apify Actor. You are buying the table.
What is the best job scraper in 2026?
For a developer who wants JSON from URLs they already have, ScrapeGraphAI. For a no-code schedule, Octoparse or Browse AI. For a marketplace Actor aimed at one board, Apify. There is no single winner on Indeed or LinkedIn because those boards block.
Can I scrape job postings from Indeed?
Sometimes, and not reliably in the test for this article. A normal extract against an Indeed search URL returned no jobs. Stealth timed out. Use a public company board when you can, and read Indeed's terms before you build around that domain.
How do I use a LinkedIn job scraper?
Point the same schema at a LinkedIn jobs search URL. In this test, that only returned listings with stealth enabled, at 10 credits for the page. LinkedIn's terms restrict automated access. Prefer the company's own careers page when the role is posted in both places.
Is job scraping legal?
It depends on the site, the data, and the use. Public listings are still covered by terms of service and, in some cases, privacy law. See the web scraping legality guide. This article is not legal advice.
How much does it cost to scrape job postings with ScrapeGraphAI?
Extract is 5 credits per call. Markdown scrape is 1. Stealth is +5. Starter is $20/month for 10,000 credits, which is 2,000 extracts with no stealth, or 1,000 extracts with stealth. Model a mix on the price calculator.
Related Articles
- Best Indeed Scraper: Extract Jobs and Salaries in 2026
- LinkedIn Scraper with ScrapeGraphAI: Profiles to JSON
- ScrapeGraphAI Pricing: Plans and Credits Guide
- Is Web Scraping Legal? Legality Guide and Best Practices
- Apify Pricing in 2026: Plans, Compute Units, and Real Costs
- 7 Best Firecrawl Alternatives for AI Web Scraping in 2026
- 6 Best ScrapingBee Alternatives for Web Scraping in 2026
- ScrapeGraphAI vs Octoparse: Best AI Web Scraper in 2026