Skip to content

CrawlForge TeamEngineering Team

4 min read

Job Postings API for Consultants: Read the Board

Consultants read job postings for what they say about a company rather than for the jobs. A target that claims it is moving upmarket should be hiring enterprise account executives. A client's three closest rivals all opening data-engineering roles in the same quarter is a slide. An org-design engagement starts with how peers title and locate the same function.

The vendors that rank for job data sell feeds aggregated across thousands of employers, which suits a labour-market study. A job postings api for consultants usually has a narrower job: these twelve named companies, what they are hiring for, where, and since when. For that question the data already exists, published by each company, as JSON.

Where are a company's job postings, as data?

On the company's applicant tracking system. A great many careers pages, especially at venture-backed companies, are a front end for Greenhouse, Lever or Ashby, and all three serve a public, unauthenticated job-board API:

ATSEndpointWhat each role carries
Greenhouseboards-api.greenhouse.io/v1/boards/{token}/departmentstitle, location, first_published, updated_at, grouped by department
Leverapi.lever.co/v0/postings/{company}?mode=jsontext (the title), team, location, commitment, createdAt
Ashbyapi.ashbyhq.com/posting-api/job-board/{name}title, department, location, publishedAt

The {token} is in the careers page's links. One scrape with the links format costs 2 credits; look for job-boards.greenhouse.io/, jobs.lever.co/ or jobs.ashbyhq.com/ followed by a name. That name is the token. A company on Workday or a home-built page has no such endpoint, and its careers page is read with scrape like any other page.

What does one call return?

The board, unprocessed. fetch_url costs 1 credit and puts the response body in content:

Bash
curl -X POST https://crawlforge.dev/api/v1/tools/fetch_url \
  -H "X-API-Key: cf_live_NORTHWIND_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://boards-api.greenhouse.io/v1/boards/rival-a/departments",
    "max_inline_chars": 1000000
  }'

Raise max_inline_chars, because boards are bigger than they look. A 665-role Greenhouse board came back at about 480 KB through /departments, well past the 40,000-character default. Under the default you get a preview and a result_handle instead, and the rest is read with read_result for 1 credit. Lever and Ashby include each role's full description, so a large board runs to megabytes; Lever takes limit and skip to page it.

What makes this better than a scraped careers page is the date. first_published tells you a sales role has been open since last December, and a requisition open ten months says something different from one posted this week.

How do you compare a peer set over time?

Snapshot it on a schedule and diff by job id. New ids are new requisitions; ids that disappear were filled or pulled. Twelve peers cost 12 credits a snapshot, so a weekly snapshot across a 13-week engagement is 156 credits. Run it with a key named after the client and the spend sits in the request log under that name.

If the evidence lives on a rendered careers page rather than a board, a monitor per client watches it for you. When the hiring question is part of diligence, testing a target's growth story against its own open roles, the due diligence post covers where that fits.

What won't it do?

  • No aggregated feed. It searches no job sites and builds no cross-employer index. Market-wide salary or demand studies need a data vendor.
  • No history before your first snapshot. A board shows what is open now. The archive is the snapshots you keep.
  • No normalisation. Titles, departments and locations arrive as each company wrote them; mapping "AE, Mid-Market" to a common taxonomy is your work.
  • No people. It returns roles, not hiring managers or contact details.
  • robots.txt is respected by default. A disallowed URL is refused before anything is fetched and costs nothing.

Start free with 1,000 credits. That is one-time and covers a twelve-company snapshot every week for well over a year. After that a 1K pack is $3. The fetch_url reference has every parameter.

Try this yourself — no signup needed

Explore all 31 CrawlForge scraping and extraction tools in the playground, then start free with 1,000 credits.

1,000 free credits • One-time • No credit card required

Tags

  • consultants
  • job postings
  • fetch_url
  • hiring signals
  • b2b

About the Author

CrawlForge Team

Engineering Team

Building the most comprehensive web scraping MCP server. We create tools that help developers extract, analyze, and transform web data for AI applications.

Newsletter

Stay updated with the latest insights

Get tutorials, product updates, and web scraping tips delivered to your inbox.

No spam. Unsubscribe anytime.

FAQ

Frequently asked questions

01Is CrawlForge a job postings data provider?

No. It holds no job database and indexes no job sites. It fetches the URLs you give it, and for job postings the most useful URL is usually the public job-board API of the company's applicant tracking system. That makes it a fit for a named peer set rather than a market-wide labour study, which needs an aggregated feed from a data vendor.

02How do I find a company's Greenhouse, Lever or Ashby board?

Scrape its careers page with the links format for 2 credits and look for a link to job-boards.greenhouse.io, jobs.lever.co or jobs.ashbyhq.com. The path segment after the domain is the board token. If none appears, the company uses another system or its own page, and you read the careers page with scrape instead.

03What does a peer-set snapshot cost?

fetch_url costs 1 credit per board, so twelve companies cost 12 credits a snapshot and a weekly snapshot for a 13-week engagement costs 156. Finding each token is a one-off 2-credit scrape per company. The free tier is a one-time 1,000 credits, and a 1,000-credit pack costs $3 after that.

04Why is the response truncated?

Job boards are large, and fetch_url returns results up to 40,000 characters inline by default. Over that you get a preview and a result_handle, and read_result reads the rest for 1 credit. Pass max_inline_chars (up to 10,000,000) to get the whole board in one response; a 665-role Greenhouse board is about 480 KB through its departments endpoint.

Keep reading

Related Articles