Use case

Recruiting intelligence: finding companies that are hiring now

A company that is hiring is a prospect for a recruiter or an HR-tech seller. Here is how to find them by role and place, rank them by growth and avoid false leads.

Updated 5 October 20266 min read

A staffing firm and an HR-technology vendor sell into the same moment: a company that is hiring. This guide shows how to build a daily list of companies hiring now, by role and location, from three Fokals datasets: Job Postings, which holds every role a company publishes; Hiring Activity, which gives the daily open, new and closed postings of each company; and Technology Changes, which dates the moment a company begins to publish a careers page. It covers how to rank companies by how fast they are adding roles, how to tell a company that has just begun to hire from one that has only just joined the index, and how to read a posting.

Three meanings of hiring now

Hiring now can mean three different things, and each has its own test. Pick the one that matches what you sell before you build a list.

MeaningWhere to read itTest
Has open rolescompany_hiring_daily: open_postingsAbove zero on the latest closed day
Is adding rolescompany_hiring_daily: new_postingsThe 28-day sum is above your threshold, and above the 28 days before
Has begun to hire publiclycompany_tech_events: category page, key careers, change addedAn event in the last 30 days

The first is the widest and the weakest, because a company can keep roles open for months. Rank on the second. The third is a short list of companies that did not link a careers page before. The hiring=active filter of GET /api/v1/companies returns companies with new postings in the last 30 days, which is a version of the second.

Demand by role and place

A posting carries the fields a recruiter or an HR-tech seller needs to qualify a lead. The table maps what you sell to the fields to filter and rank on, and the data dictionary defines each value.

You place or sellFields
Permanent hires in one functionlabels: job_function (26 values) and seniority (9 levels)
Contract and temporary staffemployment_type (contract, temporary) and the urgent and team_build flags
One city or regionlocations (city, region, country), country, work_mode
Hard-to-fill rolesexperience_years_min, degree, languages, visa_sponsorship
HR technologyboard_platform, the applicant tracking system behind the board, and the tools named in technologies

The urgent and team_build flags belong to postings labelled under jobs-v2, so filter on label_version before you count them. employment_type does not depend on the label version. The query lists companies in one country that opened at least three finance roles in the last 14 days, with the breadth of their hiring. The SQL is PostgreSQL, with lists and objects held as JSON as delivered.

select
  company_id,
  company,
  count(*)                                                                         as opened_14d,
  count(distinct labels::jsonb ->> 'job_function')                                 as functions_hiring,
  count(*) filter (where labels::jsonb ->> 'job_function' = 'finance_accounting')  as finance_roles,
  count(*) filter (where employment_type in ('contract', 'temporary'))             as contract_roles,
  count(*) filter (where (labels::jsonb ->> 'urgent')::boolean)                    as urgent_roles
from job_postings
where first_seen_at >= current_date - 14
  and found_on_first_read = false
  and country = 'GB'
group by company_id, company
having count(*) filter (where labels::jsonb ->> 'job_function' = 'finance_accounting') >= 3
order by finance_roles desc, opened_14d desc
limit 50;

For a stream rather than a query, GET /api/v1/postings returns every posting opened or closed since a time you set, across companies, oldest first, and filters by function, seniority and country. Walk the pages with next_cursor, then start the next day's pull from the at of the last row you saw and skip rows whose id you already hold. A call looks like this:

GET /api/v1/postings?since=2026-10-03T00:00:00Z&event=opened&function=finance_accounting&country=GB&limit=200
Authorization: Bearer <your key>

Reading the people function

For an HR-technology seller, and for a staffing firm that competes with in-house recruiting, the most informative postings are a company's own people roles. Filter job_function to people_hr and read the seniority and flags beside it.

PostingIt can indicate
A people_hr role at manager, director or vp level, with budget_owner or selects_tools setSomeone who will choose recruiting software or agencies is being added
Several people_hr roles opened together, with team_build setAn in-house recruiting team being formed
A people_hr role with the urgent flagA recruiting gap the company wants closed now

If your product works with a particular applicant tracking system, board_platform shows which system a company's board runs on: greenhouse, lever, ashby, workday, recruitee, personio, or jsonld for job markup on the company's own careers page. Count companies by platform to size the audience for an integration before you build it.

select
  board_platform,
  count(distinct company_id) as companies,
  count(*)                   as open_postings
from job_postings
where closed_at is null
group by board_platform
order by companies desc;

An illustrative lead card for a staffing seller: Acme Robotics opened nine postings in the last 14 days in one UK region, six in operations and three in finance. Four are contract roles and two carry the urgent flag. It also opened a people_hr posting at manager level with selects_tools set. The note to the seller says what was seen, with the nine posting urls, the dates they were first seen and the Hiring Activity totals.

A daily routine

  1. Pull the postings opened since the last pull, for the functions and countries you serve.
  2. Group them by company_id and add each company's latest company_hiring_daily row: open postings, and the 28-day sum of new_postings.
  3. Remove your competitors and any staffing firm by company_id. A staffing firm's board can list roles it fills for clients, which would put it at the top of every list.
  4. Remove evergreen roles. A posting advertised for months is often a standing pipeline. Age it by posted_at, the date the board gives, and not by first_seen_at, the date Fokals first saw it.
  5. Rank on postings opened in 14 days, the share that is contract or temporary, and the number of functions hiring at once.
  6. Hand over the evidence. Give the seller the posting url of each role, so that every lead can cite the exact roles.
  7. Suppress what you have worked. Keep a table of company_id, the date and the outcome, and leave a company off the list until its postings opened in 14 days exceed the level at which you last worked it.

Choose the threshold from the data. List the postings opened per company in the last 14 days for your function and country, and pick the level that gives a list your team can work in a day. A fixed number copied from another market gives a list that is too long in one and empty in another.

New boards and growth, read carefully

A baseline is not a first posting. When a company joins the index, every posting already on its board is new to the dataset. Those postings carry found_on_first_read and are left out of new_postings, because a first observation sets a baseline and is never counted as a change. If you count by first_seen_at alone, a company added to the index this week looks as if it has started hiring. For a new board, trust the careers page event in Technology Changes, which is dated by a change between two observations.

Reposted roles. A role closed and reopened inflates new postings. Compare new_postings with the change in open_postings: new postings that rise while open postings stay level mean the company is replacing roles, not growing. Replacement hiring is still demand for a recruiter, but it is a different pitch from growth.

One role, many places. A posting that lists several locations counts once, under the country of its first location. Read locations for the full list before you write a city into an outreach note.

Seasonal intakes. Graduate programmes, fiscal-year budgets and holidays move postings. Compare a company's rise with its industry in Market Series, where hiring_new shows postings opened per 100 companies, to see whether the company is moving alone or with the market.

Labels are versioned. Function, seniority and the flags are produced under named, frozen label versions, so a count made today can be repeated exactly. A posting with no function label is still in the data, so count unlabelled postings separately before you drop them.

How to read a posting

A posting records an intention to hire: it is advertised demand, published by the employer on its own board, and it carries the role, the place, the work mode and, where the employer states it, the pay. Read a rising count of new postings as demand building, and read the evidence behind it, the roles themselves, before you write to the company. Advertised pay appears on the posting where the employer states it, on one annual US-dollar scale. The list is a list of companies and roles, each with the dated postings behind it, which is what lets a seller cite exactly what was seen.

How Fokals delivers it

The hiring dataset is refreshed daily. Job Postings and Hiring Activity reach you through the REST API, described in the API reference, or as bulk files in CSV or JSON Lines, with fields and labels for every role, so a list stays a list of companies and roles. For the roles that tend to come before a purchase, see timing outreach with hiring signals, and for pay and demand from the employer's side, see benchmarking pay and talent demand.

Frequently asked questions

How do I find companies that are hiring for a specific role?

Filter postings by the job function and country you place, and count the postings each company opened in the last 14 days. The postings feed returns opened postings across companies, filtered by function and country, oldest first. Rank by postings opened, and read the title and link of each top company's roles before you reach out.

How can I tell that a company has only just started hiring?

Look in Technology Changes for the dated event that records a company adding a careers page. Do not rely on a company's first postings alone: when a company joins the index, the postings already on its board set a baseline and are flagged as such, so they are not counted as new postings.

What does a lead built from this data contain?

Each lead names the company, the roles it has opened, the function, seniority, location and work mode of each, the dates the postings were first seen and a link to every posting. Hiring Activity adds the company's open postings and its 28-day rise. A seller can cite exactly what was seen, and the company's identifiers let you match the lead to your own records.

How often is the list of open roles updated?

Daily. Hiring Activity is written once for each closed UTC day with the open, new and closed postings, and the postings feed is refreshed daily. A closure is dated when the posting is confirmed gone, so a closed date can fall a day or more after a role was withdrawn.

How do I keep staffing firms off a prospect list?

Match each company ID against a list of staffing firms and competitors and remove them before you rank. A staffing firm's own board can list roles it fills for clients, which would put it at the top of every list, so the exclusion belongs early in the routine. The remaining companies are direct employers hiring for their own teams.

How do I filter out evergreen job postings?

Age each posting by the date the board gives for it, not by the date Fokals first saw it. A posting advertised for months, with no change in the company's open postings, is often a standing pipeline. Compare new postings with the change in open postings to see whether the company is adding roles or recycling them.

The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.