Clean, normalized postings. Postings come from ATSs, job boards and aggregators. Reqbeat dedups and normalizes them: seniority, job family, skills, remote type, and declared plus inferred pay.
Less noise by default. Agencies and aggregators are excluded by default.
Hiring events. Postings move through opened, reobserved, reposted and closed.
Unknown kept separate from “no”. A coverage_status of no_ats_signal means Reqbeat does not know, not that the company is not hiring.
What Reqbeat actually filled on a given job is in that job’s sources[] entry for reqbeat, under fields. Our v1 job schema has no skills field, so Reqbeat’s skills tags are not returned.
Per Reqbeat docs, its corpus is refreshed every 3 hours. On each BetterJobs job, the reqbeat entry in sources[] carries first_seen_at and last_seen_at: when Reqbeat first and last saw that posting.
Per Reqbeat docs, no_ats_signal means unknown. BetterJobs keeps that meaning. On a company profile, is_hiring.value is true, false or null, and null means unknown.
Per Reqbeat docs, it keeps one row per company + title + country. BetterJobs then runs its own dedup across all seven sources, so a Reqbeat row and a TheirStack record for the same opening become one canonical job. The merged record is free: it counts in metadata.duplicates_merged.
Per Reqbeat docs, it runs its own MCP server with about 15 tools, including is_hiring, hiring_pulse and get_changes. The BetterJobs MCP server is a separate server with its own tools. Its is_hiring tool answers from the merged company profile (GET /v1/companies/{domain}), built from every source on your plan, not from Reqbeat alone.
We do not link to Reqbeat’s docs from this site. Everything you need to use Reqbeat data through BetterJobs is on this page and in the field dictionary.