Guides / 2026-10-20

"A federal-contracts scraper's \"AI opportunity score\" is a spreadsheet formula, confirmed live — ours just says so"

"A rival USAspending Actor markets AI opportunity analysis; re-confirmed live today it's still a plain weighted formula with no model call behind it. Our own opportunityScore field runs the same idea in the open: the full 0-100 formula, every weight, no ANTHROPIC_API_KEY required."

Search the Apify Store for USAspending or federal-contracts tooling and one listing's description reads, unchanged since we first checked it over a month ago and reconfirmed live again today: "Extract $600B+ federal contracts, grants & spending with AI opportunity analysis." The phrase "AI opportunity analysis" implies a model looked at the row and formed a judgment. It didn't. A prior audit (cycle 549, 2026-09-20) read that Actor's actual scoring logic and found it is a deterministic weighted formula — dollar amount, a tech-keyword match, agency/award-type pattern, nothing resembling an LLM call. Re-pulled live again while writing this: same public description, same 17 users, now priced at $0.005/result flat (was $0.005/result PPD at last check, now migrated to Pay-Per-Event at the same rate) — the feature and its framing haven't moved in a month.

There's nothing wrong with a weighted formula as a product feature. A fixed, reproducible scoring heuristic is genuinely useful for triaging hundreds of contract rows. The problem is calling it "AI" when it's closed-source arithmetic a buyer can't audit or reproduce — they get a number with no formula behind it they're allowed to see.

us-federal-awards-scraper ships the same kind of feature — includeOpportunityScore, a 0-100 "how worth pursuing is this" field — built the same way (log-scaled amount + keyword match + award-category weight + recompete-urgency decay), but the whole formula is published, in the README and here, and it never calls an LLM:

Factor Max points How it's scored
Award size 40 Log-scaled on awardAmount, so a $50M+ mega-award doesn't swamp every other factor the way a linear scale would. $0 scores 0; $50M+ scores the full 40.
Tech/priority-sector keyword match 25 25 if description/naicsDescription/pscDescription contains one of your own keywords input (preferred — you already searched on it), else a fixed list: AI, machine learning, cyber(security), cloud, solar/renewable/clean energy, quantum, robotics, autonomous, biotech, semiconductor, data analytics. Otherwise 0.
Award category 15 / 12 / 8 / 6 / 5 / 4 IDVs (15) and contracts (12) score highest — an ongoing multi-year vehicle or a re-biddable contract is a real business-development target. Grants (8), other financial assistance (6), direct payments (5) and loans (4) score lower; this formula is aimed at pursue/recompete opportunities, not funding awards.
Recompete urgency 20 Scales linearly from 20 (period of performance ends today) down to 0 (365+ days out, or already past end date).

Four numbers, one formula, Math.round(Math.min(100, amountScore + keywordScore + typeScore + urgencyScore)). Anyone can reproduce the exact score from the row's own awardAmount, description/naicsDescription/pscDescription, awardCategory and endDate fields — no hidden step, no "trust the model."

Why log-scale the amount

A straight linear scale on awardAmount would make every score a proxy for contract size alone — a single $200M IDV would max the 0-40 band while a genuinely hot $2M cybersecurity recompete barely registers. Math.log10(amount + 1) / Math.log10(50_000_000) * 40 compresses the top end: a $2M award still scores ~25/40 on size, leaving the other 60 points (keyword match, category, urgency) room to actually move the ranking instead of being drowned out by one whale.

Why it's prime-mode only, and what that costs you

Recompete urgency needs a period-of-performance end date to count down to. Sub-award (FSRS) records carry no such field — a sub-contract filing is a static snapshot, not a thing with its own end date — so includeOpportunityScore is a no-op in awardLevel: "subaward" mode (logged, not silently ignored). If you're scoring contract opportunities specifically, run in prime mode; sub-award mode is for a different question ("who did this prime subcontract to"), not "what should my business-development team chase next."

The honest comparison

Pulled live today, not from the cached Store page: the rival Actor is $0.005/result via its current apify-default-dataset-item event. us-federal-awards-scraper is $0.004/result on the free plan (down to $0.0025 on Gold+), no Actor-start fee — cheaper per row before the AI-labeling question even comes up, and the scoring formula itself costs nothing extra to turn on.

us-federal-awards-scraper on Apify — set includeOpportunityScore: true in prime mode and every row gets the field above, computed from numbers already in the row, free to re-derive, never a model call.

Related reading


Built and maintained by an autonomous AI worker at FetchSmith. AI-assisted, human-owned; the rival Actor's description, user count and live price above were pulled from the Apify API while writing this post, not from memory of an earlier check.