DEV Community

Cover image for How to See Which Companies Are Hiring Right Now Without a Paid API
Tim Zinin
Tim Zinin

Posted on Originally published at apify.com

How to See Which Companies Are Hiring Right Now Without a Paid API

The problem

"Which companies are hiring right now?" is the starting question for sales prospecting, recruiting, and competitive research — and answering it manually means opening a company's careers page, finding their ATS, and counting roles by hand for every account on your list. Commercial intent platforms will sell you an answer, but it arrives as a black-box score with no source evidence attached, at a price that only makes sense for a funded sales team.

The underlying data is actually public. Companies on Greenhouse, Lever, or Ashby publish their open roles on unauthenticated job-board endpoints that anyone can read. The work is in turning those raw feeds into a consistent, comparable signal across dozens of boards — and in being honest about what a job posting does and does not prove.

What the actor does

The Company Hiring Radar reads the public Greenhouse, Lever, and Ashby board APIs for tokens you supply and returns one normalized, evidence-backed observation per board. No login, no ATS API key, no proxies.

From the README:

  • Explicit or auto-detected boards. Best input form is provider:token — greenhouse:stripe, lever:spotify, ashby:ramp — where the token is the slug in the company's careers URL. A bare token (stripe) probes all three providers and picks the board with the most open roles.
  • Honest identity handling. A token is not a company. Bare-token rows disclose the picked board's declared name (ownerName/ownerWebsite) and any other real boards found under the same token (candidates, with sameName flags). The README's live examples make the point: bare pulse resolves to Pulse Healthcare on Greenhouse (2,615 roles) while an unrelated runpulse.com sits on Ashby (9 roles), and bare juno matches two genuinely different boards both named "Juno". Explicit provider:token input has nothing to guess.
  • Normalized hiring signals per board: total open roles, a plain-English activity band (light / active / strong / aggressive hiring, derived only from the current posting count), role counts by function (sales, marketing, engineering, product, leadership, data, ops, people, finance, support, legal), remote share, a full by-location breakdown, and how many roles carry a parseable posting timestamp inside your newWindowDays window (default 30).
  • Keyword highlights in matchedRoles — only the roles whose title, department, or function contains your keywords — plus the full normalized role list (title, function, location, remote flag, posted date with its postedAtBasis, apply URL) in one shape across all three providers.
  • Decision context on every row: stable entityId/observationId/eventId, evidence[] with provider URLs and HTTP status, evidenceCoverage, confidence score with reasons, explicit dataGaps, a conservative recommendedAction, and safeToAutomate: false. A run-level KVS OUTPUT reconciles requested, unique, delivered, paid, free-failure, withheld, and replay-safe state.

The README keeps the interpretation boundary in the data: open postings are research evidence — they do not prove headcount growth, budget, expansion, purchase intent, or permission to contact anyone. A clean 404 (no board) is a free row, distinct from a source failure, which is also free.

Example: input and output

Input from the manifest:

{
  "companies": ["greenhouse:stripe", "lever:spotify", "ashby:ramp"],
  "keywords": ["sales", "marketing"]
}
Enter fullscreen mode Exit fullscreen mode

The README's real output row for ashby:ramp, trimmed:

{
    "source": "ashby:ramp",
    "provider": "ashby",
    "found": true,
    "matchBasis": "explicit",
    "signals": {
        "totalOpenRoles": 118,
        "hiringMomentum": "aggressive hiring",
        "salesHiring": 46,
        "marketingHiring": 16,
        "engineeringHiring": 30,
        "remoteShare": 0.93,
        "newRolesLast30d": 28
    },
    "matchedKeywords": ["sales", "marketing"],
    "summary": "ramp (ashby) — 118 open roles, aggressive hiring. Top: sales 46, engineering 30, marketing 16. 93% remote, 63 match your keywords, 28 new in last 30d."
}
Enter fullscreen mode Exit fullscreen mode

Each of the 118 roles also appears in the normalized roles list with title, function, location, remote flag, postedAt, postedAtBasis, and apply URL.

Pricing and the free limit

Pay-per-event: $0.005 per run start plus $0.002 per successfully delivered company-board report (result-found) — one charge per board regardless of whether it contains 0, 10, or 500 roles, with lower per-event prices on paid Apify tiers. At list prices, a 100-board run costs $0.005 + 100 × $0.002 = $0.205. Apify's free plan includes $5 of usage credits per month, covering about 24 full 100-board runs — roughly 2,500 board reports — before you pay anything. Clean not-found and source-failure rows are never billed.

Try it

Paste three board tokens from careers pages you want to watch, check the candidates disclosures on any bare-token row, then schedule the watchlist: Company Hiring Radar.

For AI agents and MCP

The actor takes JSON in and returns structured JSON via the Apify API, and the README notes it is callable from the Apify API, the SDK, or the Apify MCP server. The integration guidance is written for agents: join rows across runs on entityId, gate downstream automation on OUTPUT.status === "COMPLETE" and replaySafe === true, keep evidence, confidence, and dataGaps attached so a bounded observation never becomes an overclaim, and treat matchedRoles as a human research queue — row-level safeToAutomate is always false.

Top comments (0)