Hiring intent · one call
Give us a domain. We find the company’s live job board, read every open role on it, and diff it against the last time we looked. A first data hire. A support team that doubled. A req quietly pulled. That is the signal — not the headcount.
Signal anatomy
One scan returns the whole board — every role, normalized into one shape across three applicant-tracking systems that agree on almost nothing.
The role as the board publishes it, plus our own function classification from the title — so Engineering means the same thing at a company that calls it “R&D” and one that calls it “Platform”. The platform’s own label is kept verbatim beside it.
Staff, director, VP, intern — read from the level token in the title. A title with no level token returns `unknown`, because inventing a level is exactly the kind of quiet fabrication that makes a signal worthless.
Where the role sits. `remote` is a real boolean on Lever and Ashby, which publish a flag, and `null` on Greenhouse, which publishes free text. We tell you which you are reading rather than parsing a string into a filter.
When the req went live and where it lives. Every role links back to the company's own posting, so anything you build on this is one click from its source.
Roles by function and by seniority, the locations they cluster in, and the remote split. Where they are spending headcount is where they are spending budget.
Named tools pulled out of the job descriptions themselves — Snowflake, Salesforce, Kubernetes. Only when you buy descriptions, and never guessed from a job title.
Opened, closed, net change, and any function that appeared for the first time. The rest of this page is about that field.
The delta
Anyone can read a company’s open roles today. What tells you something is what those roles were last month. Every scan stores a reading of that board, so the next one comes back with the difference already computed.
The same board, read twice.
Reqs that were not there last time. A first solutions engineer means they just started selling to enterprises. A first data engineer means the warehouse project got funded.
Reqs that disappeared. Filled, or pulled. Either way the window on that conversation has changed, and a pulled req across a whole function usually means a freeze.
A function with roles now that had none before. This is the loudest thing on the board: a company standing up a capability it did not have is a company about to buy tools for it.
The first scan of a company has no delta — and we say so, in a field called deltaNote, rather than returning a row of zeros that would read as “nothing changed”. Scan again later and the difference is there.
What we can and cannot reach
We scrape the company’s own careers page for a board link, then fall back to guessing the board name from their domain, then probe all three platforms at once and keep the fullest board. About half resolve from the careers page alone; about four in five once the guess is included. Some companies have no keyless board at all, and for those the honest answer is that we do not know.
One domain, three probes, fired at the same time.
All three answer a clean 404 for a board that does not exist. That single property is the whole reason they are here: it is what lets us say “not on this platform” instead of “not hiring”.
A nonsense company id returns HTTP 200 with {"totalFound":0,"content":[]} — byte-identical to a real company with no openings. There is no way to tell 'not on this platform' from 'not hiring', so shipping it would mean guessing.
The widget endpoint discriminates 200/404, but its field shape was never verified against enough real boards to normalize honestly. Absent rather than half-mapped.
No keyless endpoint that answers reliably for an arbitrary company.
Each tenant runs its own host and its own path; there is no keyless, guessable endpoint. A per-tenant integration is not the same product.
For developers & AI agents
Three rails, one meter. Every call refuses rather than overdraws: an agent that runs out of credits gets a 402 with the exact shortfall and a link to top up, never a silent debt.
Bearer key or the shared Ounie session cookie. Synchronous — discovery, every open role, the summary and the delta come back on the same request.
curl -X POST https://hiring.ounie.com/api/scans \
-H "Authorization: Bearer hrs_live_…" \
-H "Content-Type: application/json" \
-d '{"domain":"mercury.com"}'scan_company_hiring, get_hiring_scan, list_hiring_scans, get_coverage, get_credit_balance, get_pricing, whoami. Works in Claude, Cursor, ChatGPT and the Ounie AI Team — that last one can’t set headers, so the key rides the URL.
Endpoint https://hiring.ounie.com/api/mcp (legacy SSE: /api/sse)
Auth Authorization: Bearer hrs_live_…
# Hosts that can't set headers (e.g. the Ounie AI Team):
https://hiring.ounie.com/api/mcp?api_key=hrs_live_…Keyless agents pay on Base. The board is resolved for FREE before any quote, so a company with no reachable board is refused at 400 with no price attached — you never sign for work that cannot be delivered. And the 402 carries the exact final amount, not a ceiling.
curl -X POST https://hiring.ounie.com/api/x402/scan \
-H "Content-Type: application/json" \
-d '{"domain":"mercury.com"}'
# → 402 { accepts: [{ scheme:"exact", network:"base",
# maxAmountRequired:"72000", payTo:"0x…" }],
# preview: { open_roles: 55, platform: "greenhouse" } }
curl -X POST https://hiring.ounie.com/api/x402/scan \
-H "X-Payment: <base64 signed payload>" -d '{"domain":"mercury.com"}'6 credits a scan (+1 per role description) on the credit rails · $0.072 a scan on x402 · the dashboard keeps every scan you have run, free to re-read.
Credit math
Credits are reserved when the scan starts and settle on what came back. If we could not find the company’s board, all of them return — you cannot be charged for a non-answer. Role descriptions add 1 credit per role, and only when you ask for them.
6 credits reserved while the scan runs.
A board that exists and is empty is nota dead end — “this company has stopped hiring” is one of the most useful things on this site, and it is billed like any other reading.
See the pricingQuestions
You get outcome `board_not_found`, and you are not charged. It is a first-class answer, deliberately distinct from “no open roles”, because collapsing those two would be the most damaging thing this product could do — a sales team acting on a fabricated zero is worse off than one with no data. Discovery finds about half of companies from their careers page alone and about four in five once we also guess the board name from the domain. It is never 100%.
Because those three are the only ones that answer honestly. Each returns 200 for a real board and a clean 404 for a token that does not exist, which is the single property that lets us tell “not on this platform” apart from “not hiring”. SmartRecruiters, Workable, Recruitee, Workday were all tested and dropped — SmartRecruiters is the sharpest case: a nonsense company id returns HTTP 200 with totalFound:0, byte-identical to a real company with nothing open.
The one with the most roles — never the one that answered first. Airtable and Mercury both return 200 on Greenhouse and on Ashby; their Ashby boards are empty shells while the real 16 and 55 roles sit on Greenhouse. A first-match design would report zero for both companies, confidently. So we probe all three in parallel and pick the fullest board, and every candidate we ruled out comes back in the response.
Because a single snapshot is just a careers page you could have read yourself. What tells you something is the second derivative: a function that did not exist last month, a team that doubled, a req that was quietly pulled. Every scan writes a snapshot of that board, so the next scan of the same company returns opened, closed, netChange and newFunctions. The first scan of a board has no delta — and we say so rather than printing zeros.
Because Greenhouse does not publish a remote flag — its location is free text like “Remote - US” or “San Francisco, CA • New York, NY”. Lever and Ashby do publish a real flag, so their roles carry true or false. We could parse the Greenhouse string and be right most of the time, but “most of the time” is not a field you can filter on, so we return null and tell you which platform you are reading. A uniform remote filter across all three is not possible and we do not pretend otherwise.
On Ashby only, and only when you ask for role descriptions. Greenhouse and Lever publish no compensation at all. Some Ashby boards return the compensation object with every field null, so the key’s presence is not data — in that case we return null rather than an empty shell that reads like a measurement. Every scan carries a capabilities block saying exactly which fields that platform can populate.
6 Ounie credits — $0.06 in plain money, from the same wallet as every other Ounie app. Role descriptions add 1 credit per role, and only when you ask for them. No subscription, no minimum. Re-reading and listing scans you have already paid for is free forever.
Yes, and that is one of the most valuable readings here. An active board with nothing on it means the freeze is real, and knowing that is worth six credits. What is never charged is a scan where we could not reach a board at all — that taught you nothing, so it refunds in full.
Yes. The x402 endpoint takes USDC on Base with no account and no key. Because the job boards are free for us to read, discovery runs before the quote: if there is no reachable board you get a 400 with no price in it, so you never sign a payment for work that cannot be delivered. And the 402 carries the exact final amount, including descriptions, rather than a ceiling.
No. All three platforms publish a documented public JSON job-board API and we read those, keylessly, with an identifying user agent. We also fetch a company’s own careers page to find which board they use — the same request a browser makes. There is no Apify actor, no headless browser and no login anywhere in this product.
One domain in, the whole board out, and the change since last time. 6 credits, from the same Ounie wallet as every other app.