Buyer Intent Signals API – Hiring & Missing-Tech Scoring
Pricing
$60.00 / 1,000 company reports
Buyer Intent Signals API – Hiring & Missing-Tech Scoring
Score accounts 0-100 on buyer intent from public signals: active hiring on public ATS job boards plus a missing tech category you sell into (homepage detection). ICP lead scoring for Clay or your CRM. $0.06 per company with an open job board; no open board = free. Not third-party intent surge data.
Pricing
$60.00 / 1,000 company reports
Rating
0.0
(0)
Developer
Siftsmith
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Buyer Intent Signals — Hiring Velocity + Tech Gap Scorer
Give it a list of companies. Get back one score per company: are they growing (actively hiring) and not yet using a category of tool you sell? That combination — growth without the category you're pitching — is a classic B2B buying-intent signal, the kind Bombora and 6sense charge four/five figures a month for.
It combines two Siftsmith Actors that already run in production, Hiring Signals (public ATS job-board data) and Tech Enricher (public homepage technology detection), and turns their two outputs into one decoded score instead of two raw dumps you'd have to cross-reference by hand.
Quick start
Input:
{ "companies": ["ramp.com", "stripe.com", "lever:palantir"], "targetCategory": "CRM" }
One row per company. A run on 2026-09-29 returned this for ramp.com (trimmed):
{ "company": "ramp.com", "hiringFound": true, "ats": "ashby", "openJobs": 156, "postedLast30d": 59,"hiringScore": 68, "techFound": true, "hasTargetCategory": false, "buyerIntentScore": 100 }
Ramp is hiring fast and no CRM shows on its homepage, so its score is 68 × 1.5 = 102, capped at 100.
- Price: $0.06 per company with a public job board that has open jobs. Every other row is free, including no board, a board naming a different company, a failed job-board lookup and duplicates. There's no start fee. Details are under "Pricing".
- Best input: domains (
stripe.com). A domain beats a bare name, because the tech half needs a real website. Workday boards must be passed explicitly (workday:tenant:wdN:site). Board syntax likelever:palantirhas no domain, so it's scored on hiring alone (techFound: false). - Target category: optional. Leave it out to score hiring alone.
What you get per company
| Field | Meaning |
|---|---|
hiringFound / hiringScore / openJobs / postedLast30d / ats | Same hiring signal as Hiring Signals: is there a public job board, how many open roles, how many posted in the last 30 days, 0–100 hiring score (volume + freshness) |
bulkRepublish | true when a board with 20+ open roles has more than half of them published within one 24-hour window (any 24 hours, so a burst across midnight UTC counts), the pattern of a board migration or re-import rather than a hiring surge (a brand-new board launched within 24 hours is flagged too). Those roles still count in openJobs and postedLast30d (the job board's own dates) but not as fresh in hiringScore, so a re-imported board doesn't read as surging intent |
openJobsCapped / openJobsReported | openJobsCapped is true when the board has more open roles than one report covers (1,000 on Workday and SmartRecruiters); openJobsReported is then the job board's own total (null when it doesn't report one), and hiringScore's freshness is taken of that total (see "Scoring") |
freshnessLowerBound | true only on a capped board where every fetched role was posted in the last 30 days: postedLast30d and the freshness part of hiringScore are then lower bounds, same as in Hiring Signals |
matchConfidence / boardCompanyName | How sure the job-board match is, same as Hiring Signals: explicit (you passed ats:slug or the board's URL), high (the board's own company name matches your input; for a domain, the board's website or job links are also on that domain), medium (unchecked: the board gives no name, e.g. some Ashby boards, or for a domain the name matches but the board lists no website to compare), low (it names a different company, its website is on a different domain, e.g. linear.com finding Ashby's "Linear" at linear.app, or it is a Personio board with no name at all, so it's not used and not charged). See "Job-board matching" below |
techFound / technologies / technologiesByCategory | Same tech-stack signal as Tech Enricher: detected technologies from the homepage/headers/CSP, grouped by category (CMS, CRM, Analytics, Marketing, Support, …) |
hasTargetCategory | Only present when you set Target technology category. true if the detected stack includes that category, false if it doesn't (or if the tech lookup itself failed — check techFound/techNote) |
buyerIntentScore | The combined score. See "Scoring" below for the exact formula — no hidden weights |
domain, domainGuessed | The domain used for the tech lookup, and whether it was guessed from a bare company name (see "Input" below) |
Scoring (exact formula, no black box)
buyerIntentScore = hiringScore // no target category setbuyerIntentScore = hiringScore // target category set AND detected in their stackbuyerIntentScore = round(hiringScore × 1.5), capped at 100 // target category set, tech lookup succeeded, AND category NOT detectedbuyerIntentScore = hiringScore // target category set but tech lookup failed (unknown, never guessed as an absence)
hiringScore is Hiring Signals' own 0–100 score: round(100 × (0.6 × volume + 0.4 × freshness)), where volume is a log-scaled open-role count (saturates ~300 roles) and freshness is the share of roles posted in the last 30 days. On a bulkRepublish board, the roles published in the bulk 24-hour window don't count as fresh. On a capped board (openJobsCapped: true) the share is of the board's own total (openJobsReported), not of the 1,000 roles fetched: Workday and SmartRecruiters list newest roles first, so the fetched roles alone would over-state freshness (Bosch's first 1,000 of 4,801 are all recent: 100 before, 68 now, flagged freshnessLowerBound).
The scoring is fully transparent: a documented 1.5× boost when a company is both growing and missing the category you sell. Every score is explainable, so your team knows exactly why an account is at the top of the list.
Input
- Companies: same format as Hiring Signals — names (
Ramp), domains (stripe.com), or explicit boards (greenhouse:stripe,lever:palantir,ashby:ramp,workable:huggingface,smartrecruiters:experian,breezy:attentive,personio:deskbird,workday:tenant:wdN:site). A job board's own URL (https://jobs.lever.co/palantir,https://jobs.ashbyhq.com/resend,https://boards.greenhouse.io/stripe,https://salesforce.wd12.myworkdayjobs.com/External_Career_Site, …) is read as that explicit board; likeats:slug, it has no company domain, so the tech lookup is skipped. - Target technology category (optional): one of the categories Tech Enricher's fingerprints (84 technologies) actually group technologies into, with the number of technologies in each:
Analytics15,CMS11,Frontend10,Hosting9,Marketing9,Support7,CRM5,Ecommerce4,Recruiting4,Payments3,Video3,Fonts2,A/B Testing2. Coverage is uneven:CRMonly knows Salesforce, HubSpot CRM, Pipedrive, Zoho SalesIQ and Freshsales, and only when the homepage loads their script (a<script src>or the CSP; a link or a mention doesn't count). A company on any other CRM, or one whose CRM never appears on its homepage, showshasTargetCategory: false. It's a dropdown, not free text, so a typo isn't possible via the Console; a raw API call with an unlisted value is rejected by the input schema before the run starts, not silently mis-scored.
Job-board matching
Company names and domains are matched to job boards the same way as in Hiring Signals: likely board names are tried on each supported ATS, and each board found is checked against the company name it gives for itself. A low match (the board names a different company, e.g. Horizon finding Lever's "Horizon Robotics") is not used as a hiring signal: the row is free, hiringFound: false, with that board's ats, boardUrl and boardCompanyName and an error saying to pass the board explicitly (lever:horizon) if it is the right company. A medium match (the board gives no name, as on some Ashby boards, or a domain's board lists no website to compare with it) is used and charged but couldn't be fully checked, so look at boardUrl. Large enterprises on Workday, SAP SuccessFactors, iCIMS or their own careers pages are often not found by name. Workday works only as an explicit workday:{tenant}:{wdN}:{site} board.
Domain resolution (read this if you pass bare company names)
The tech-stack half needs an actual website to fetch. If your input is already a domain (stripe.com) or explicit board syntax has no domain to give, it's used as-is or skipped. If your input is a bare company name (Ramp, Hugging Face), the domain is guessed as the name joined together + .com (ramp.com, huggingface.com) — the same slug-guessing approach Hiring Signals already uses for job boards. This works for a lot of companies but is not a real domain lookup; it will be wrong for companies whose brand name isn't their domain. domainGuessed: true flags every guessed case so you can spot-check. If a guessed domain redirects to a different company's site (e.g. linear.com goes to analog.com, not Linear), its tech data isn't used: techFound: false and techNote says where it redirected. A redirect is accepted when the site it lands on starts with the guessed name, e.g. huggingface.com → huggingface.co, datadog.com → datadoghq.com. Inputs that are IP addresses, localhost or private-network names are never fetched. For accurate results, pass domains directly. Explicit ats:slug inputs (greenhouse:stripe) have no domain information at all — the hiring signal still works, but the tech signal is skipped (techFound: false, techNote explains why).
Pricing
Pay per result: $0.06 per company with a public job board that has open jobs (hiringFound: true). The score is built on the hiring signal, so without one buyerIntentScore is always 0. Companies with no board, a board with no open jobs, or only a low-confidence board (one that names a different company) are returned free, with any tech-stack data that was found, and an error saying why they weren't charged; so is an input whose lookup failed with an error. Set a max charge per run and the Actor stops cleanly when it's reached: every input not yet reported still gets a short free row with skipped: true and a reason, so no input goes missing from the dataset. You're never charged more than the max you set. A duplicate of a skipped input gets its own skipped row, never a pointer to a row with no data.
Duplicates are charged once. Inputs are deduplicated on the job board they resolve to (ATS + slug), not on the text you typed: Stripe, stripe.com and greenhouse:stripe are one company, and so are Linear, linear.app and ashby:linear, even though they carry different domains (or none). Inputs with no job board are deduplicated on their domain. In each group the reported row is the first input, in input order, whose homepage lookup succeeded (so linear.app is reported rather than ashby:linear, which has no domain), or the first input if none did. Every other input in the group still gets its own row, free, with duplicateOf set to the reported input. Exact repeats of the same text are collapsed to one row before processing.
Use it in Clay
Clay has a built-in Apify integration, so this works as a per-row enrichment column:
- In your Clay table, add an enrichment, search Apify, and choose Run Apify Actor.
- Connect your Apify account with your Apify API token (Apify Console → Settings → Integrations).
- Pick this Actor and enter the input as JSON, putting the row's value into the
companieslist. Clay's Apify integration guide shows how to insert a column into the JSON. - Run the column. Each row's result comes back into Clay, where you can split fields such as
buyerIntentScoreinto their own columns.
Billing: Apify charges $0.06 per company with an open job board (others are free) to your Apify account, with no per-run start fee. Clay counts the Action on its side but uses no Clay data credits when you bring your own Apify account.
Data sources & compliance
No new data source: reuses the same official public ATS job-board APIs (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Breezy HR, Workday, Personio) as Hiring Signals, and the same public homepage HTML/headers/CSP detection as Tech Enricher (its DNS checks aren't used here). No logins, no scraping of personal data.
Good to know
- One run, two signals. Uses the same detectors as Hiring Signals and Tech Enricher, cross-referenced and scored for you.
- Best results with domains. Bare company names are matched to a likely domain; passing the domain gives the most precise results.
- Homepage-only tech detection, same as Tech Enricher: a tool used only on a subpage (e.g. a CRM widget that only loads in a logged-in app) won't be detected, which can produce a false
hasTargetCategory: false(and an inflatedbuyerIntentScore) for a company that actually has the tool. Treat a high score as a strong lead to review. - Hiring-score inherits Hiring Signals' own limitations: guessed job-board matches can miss companies on unsupported ATSes (enterprises on Workday, SuccessFactors, iCIMS or custom careers pages are often not found by name; Workday needs an explicit board), a same-named company's board can come out
high, amediummatch is unchecked, andpostedAtfreshness can be inflated by roles reposted one at a time (a whole board re-published within 24 hours is caught:bulkRepublish). - No firmographic data (employee count, revenue, funding) — none of that is available from public, unauthenticated sources.
Support
Open an issue on the Actor's Issues tab or email hello@siftsmith.com. Issues are read daily and fixed promptly.
More tools from Siftsmith (formerly ToolFoundry): siftsmith.com.