Hiring Signals

Hiring intent · one call

What a company is hiring for is what it’s about to buy.

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.

No subscription — pay in Ounie credits6 credits a scanREST · MCP · x402
HIRING BOARD+3−2ALL OPENSINCE LAST SCANENGINEERINGSALESMARKETINGDATA

Signal anatomy

What comes back for every open role.

One scan returns the whole board — every role, normalized into one shape across three applicant-tracking systems that agree on almost nothing.

title · team · function

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.

seniority

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.

location · remote

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.

postedAt · url

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.

summary

The shape of the org

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.

toolsMentioned

The stack, from their own words

Named tools pulled out of the job descriptions themselves — Snowflake, Salesforce, Kubernetes. Only when you buy descriptions, and never guessed from a job title.

delta

And what changed

Opened, closed, net change, and any function that appeared for the first time. The rest of this page is about that field.

The delta

A snapshot is a careers page. The change is the signal.

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.

LAST SCANTHIS SCANBackend engineerAccount executiveSupport leadDesignerBackend engineerAccount executiveDesignerData engineerSolutions engineer+2−1

The same board, read twice.

opened

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.

closed

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.

newFunctions

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

About four companies in five. Not five in five.

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.

mercury.comgreenhouse···lever···ashby···GREENHOUSE55 open roles

One domain, three probes, fired at the same time.

Read honestly

  • Greenhousehit 200 · miss 404
  • Leverhit 200 · miss 404
  • Ashbyhit 200 · miss 404

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”.

Deliberately absent

  • SmartRecruiters

    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.

  • Workable

    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.

  • Recruitee

    No keyless endpoint that answers reliably for an arbitrary company.

  • Workday

    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

Built to be called by something that isn’t a person.

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.

REST

One POST, the whole board

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"}'
MCP

A tool your agent already knows how to hold

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_…
x402

No account, no key — pay per call in USDC

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

6 credits a scan. A dead end is free.

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.

YOUR WALLETcredits111111SETTLED6 credits

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 pricing

Questions

The awkward ones first.

What happens when you can’t find a company’s job board?

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%.

Why only Greenhouse, Lever, Ashby?

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.

A company answers on two platforms. Which one wins?

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.

Why is the delta the point?

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.

Why is `remote` sometimes null?

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.

Do you return salary?

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.

What does a scan cost?

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.

Am I charged when a company has stopped hiring?

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.

Can an agent use this without an Ounie account?

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.

Is this scraping?

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.

Find out what they are staffing up for.

One domain in, the whole board out, and the change since last time. 6 credits, from the same Ounie wallet as every other app.