Government Spending Data Scraper, Contract Award Data API avatar

Government Spending Data Scraper, Contract Award Data API

Pricing

from $2.50 / 1,000 result items

Go to Apify Store
Government Spending Data Scraper, Contract Award Data API

Government Spending Data Scraper, Contract Award Data API

Every US federal procurement data: contract, IDV, grant, loan and direct payment from USAspending.gov's awards API — plus sub-contracts and sub-grants, joined to the prime award. 54 typed fields incl. recipient UEI/address, NAICS/PSC, CFDA. Filter by agency, keyword, state, date. Spending data API.

Pricing

from $2.50 / 1,000 result items

Rating

0.0

(0)

Developer

Fetch Smith

Fetch Smith

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

USAspending — US Federal Contracts, Grants & Subawards Scraper

Search every US federal award — contracts, IDVs, grants, direct payments, other financial assistance and loans — straight from the official USAspending.gov awards API, and get flat JSON rows you can drop into a CRM, a spreadsheet or a model.

No API key, no login, no proxy: this Actor uses the US government's public open-data API (api.usaspending.gov), so the data is authoritative and there is nothing to violate. Awards data covers recipients (companies, universities, state agencies), not individuals. In short, a contract data API for USAspending.gov you can call from Apify without hosting anything yourself.

What you can do with it

  • Federal-contractor lead lists — every company that won work from a given agency, with UEI, address and NAICS/PSC codes.
  • Competitor tracking — pull one recipient's full award history by exact name (recipients) and watch amounts, agencies and end dates (recompete timing).
  • Grant prospecting — filter to grants and cooperative agreements by CFDA/Assistance Listing program and state.
  • Market sizing — how much a given agency obligated on solar, cyber, AI or any keyword over any window since 2007.
  • Recompete alerts — expiringWithinDays finds contracts and grants whose period of performance ends soon (a real re-bid/renewal radar), and expiringAfterDays skips anything ending too soon to realistically bid on.
  • Single-award lookup — already have a PIID/FAIN/URI from a solicitation or a news story? awardIds fetches that exact award, ignoring every other filter.
  • Pass-through grant tracing — fundingAgencies finds awards where the money's actual source agency differs from the agency that administers the award (common on formula/block grants routed through a state).
  • Sub-award / subcontractor mining — set awardLevel to subaward and get the FSRS sub-contracts and sub-grants filed under prime awards: who the prime contractor actually paid, how much, and for what. Every sub-award row carries the prime award's ID and URL, so you can join it straight back to a prime-level run. This is the tier-2 supplier list that never appears in prime-award data.
  • New-award alerts — set watchLabel on a saved search (any filter combination, prime or sub-award mode) to get only the awards/sub-awards that are new since your last run, instead of re-pulling the same agency/NAICS/recipient search on a schedule.
  • Award-change alerts — add watchChanges (prime mode) to also get re-alerted when an already-delivered award's last-modified date, amount, outlays or end date moves — contract modifications, option exercises, period-of-performance extensions — instead of only ever hearing about brand-new awards.
  • Opportunity triage — set includeOpportunityScore to add a 0-100 score to every row so you can sort a big pull by "worth pursuing" instead of just amount — see Opportunity score.

Input

FieldTypeDefaultNotes
startUrlstring–Paste a usaspending.gov Advanced Search "share" link (usaspending.gov/search?hash=... or usaspending.gov/search/...) instead of picking keywords/awardCategories by hand — this resolves the site's own saved-search hash via its public /api/v2/references/hash/ endpoint and applies its keyword and award-type filters, overriding those two inputs. Agency/location/NAICS/PSC/award-amount/date-range filters set in that search are not carried over yet (no live example was available to confirm their nested shapes against) — a warning in the run log names any of those it finds so you can set the matching input yourself.
awardLevelstringprimeprime = the federal award itself. subaward = the sub-contracts/sub-grants reported under prime awards. Every filter below works in both modes — see Sub-award mode.
awardCategoriesarray["contracts"]contracts, idvs, grants, direct_payments, other_financial_assistance, loans. Pick several — each is fetched separately and merged.
startDate / endDatestringlast 365 daysYYYY-MM-DD, passed to USAspending's award-level time_period filter. It is a coarse recency bound, not a strict window — no date on the returned row is guaranteed to fall inside it (measured; see the FAQ). Nothing exists before 2007-10-01; earlier dates are clamped.
keywordsarray–Free text over description, recipient and agency. Multiple keywords are ORed.
recipientsarray–Free-text recipient name search, e.g. Lockheed Martin. Multiple values are ORed.
agenciesarray–Top-tier awarding agency names, e.g. Department of Energy. Case-insensitive — department of energy is matched against USAspending's 111 top-tier agency names and corrected automatically (logged when it happens). Abbreviations like DOE and a name not on that list still match nothing. Multiple values are ORed.
fundingAgenciesarray–Top-tier funding agency names — the agency whose budget pays, which can differ from agencies on pass-through grants. Same case-insensitive correction and exact-name rule, and multiple values are ORed the same way. Setting agencies and fundingAgencies together does not OR across the two — it requires the award to match both at once, see the FAQ.
awardIdsarray–Exact PIID/FAIN/URI values, e.g. N0001917C0001. Exclusive mode: set this and every other filter (including the date window) is ignored so the exact award can never be hidden by an unrelated filter.
placeOfPerformanceStatesarray–Two-letter USPS codes for where the work happens (CA, TX).
recipientStatesarray–Two-letter USPS codes for the recipient's own address.
recipientTypesarray–USAspending business-type categories, e.g. small_business, woman_owned_business, veteran_owned_business, minority_owned_business, nonprofit, higher_education, sole_proprietorship, manufacturer_of_goods (live-verified 2026-09-18; USAspending has more categories beyond these). Multiple values are ORed. A misspelled category returns zero rows silently — check spelling against USAspending's advanced search if a run comes back empty.
naicsCodesarray–NAICS industry codes, 2-6 digit prefixes (5415 matches every 6-digit code under it). Multiple values are ORed. No effect on grants/direct payments/other financial assistance/loans — they carry no NAICS.
pscCodesarray–Product or Service Codes (PSC), 1-4 character prefixes (R425 one leaf code, R4 every professional-services code, R the whole services letter, 10 every weapons product). Multiple values are ORed. Only contracts and IDVs carry a PSC, so grants/loans/direct payments return nothing.
defCodesarray–Restrict to one or more Disaster Emergency Fund Codes: the 7 COVID-19 codes L/M/N/O/P/U/V or the 2 infrastructure (IIJA) codes 1/Z — a structural flag on the award's own funding line (USAspending's def_codes), not a keyword match against the description. Multiple values are ORed, including across the two programs. Works across every category, including sub-awards, since it filters on funding, not award type. See the FAQ for what each code means.
minAwardAmount / maxAwardAmountinteger–Obligated amount bounds in USD.
expiringWithinDaysinteger–Recompete finder: only awards whose period of performance ends within this many days from today. Prime mode only, and only for categories that report a period-of-performance end date: contracts, grants, direct payments, other financial assistance. Not IDVs, not loans, not sub-awards — USAspending reports no end date for any of those, so their rows are always dropped (with a log warning, never a silent zero). Applied after fetching, since USAspending's own filters can only search by award action date, not end date.
expiringAfterDaysinteger–Skip awards expiring sooner than this many days out — bid lead time. Requires expiringWithinDays, and must be smaller than it.
sortBystringawardAmountawardAmount, lastModifiedDate, startDate, recipientName.
orderstringdescdesc or asc.
maxResultsinteger100Total across all selected categories.
maxPagesPerCategoryinteger50Depth cap, 100 awards per page.
watchLabelstring–Set a name for this saved search to turn on watch mode — see Watch mode below.
watchChangesbooleanfalsePrime mode only. Also re-alert (and charge) on an already-delivered award whose last-modified date, amount, outlays or end date changed — see Watch mode.
includeOpportunityScorebooleanfalsePrime mode only. Adds a 0-100 opportunityScore field to every row — see Opportunity score.
webhookUrlstring–Optional. POST a small JSON completion summary (awards/sub-awards pushed, rows scanned, dataset ID, watch new/changed counts) here when the run finishes — see FAQ.

All filters are ANDed. Awards filtered out are never pushed and never charged.

Output

One flat row per award:

FieldExample
awardId89243425FEE000489
awardUrlhttps://www.usaspending.gov/award/CONT_AWD_89243425FEE000489_8900_…
awardLevelprime — lets you tell a prime row apart from a subaward row (below) after merging runs from both modes into one table.
awardCategory / awardTypecontracts / BPA CALL
recipientName, recipientUei, recipientIdENERGY TECHNOLOGY ALLIANCE LLC, WDTLX4NKRKC8
recipientAddress, recipientCity, recipientState, recipientCountry920 NW BOND ST STE 204, BEND, OR, UNITED STATES
awardingAgency, awardingSubAgency, fundingAgency, fundingSubAgencyDepartment of Energy
descriptionSCIENTIFIC, ENGINEERING AND TECHNICAL SUPPORT (SETS) FOR DOE EERE'S SOLAR ENERGY TECHNOLOGIES OFFICE…
awardAmount, totalOutlays7909335.88, 7909335.88
loanValue, subsidyCostloans only — face value and subsidy cost
startDate, endDate, baseObligationDate, lastModifiedDate2025-04-30, 2026-04-30
placeOfPerformanceCity/State/Zip/CountryGOLDEN, CO, 80401, USA
naicsCode, naicsDescription, pscCode, pscDescription562910, REMEDIATION SERVICES, R425, SUPPORT- PROFESSIONAL: ENGINEERING/TECHNICAL
cfdaNumbers, cfdaProgramTitlesgrants/loans — e.g. ["93.778"], ["GRANTS TO STATES FOR MEDICAID"]
disasterEmergencyFundCodes["Q"]

Sub-award mode

With awardLevel: "subaward" the same six categories, the same date window and the same filters are applied to USAspending's sub-award (FSRS) data instead, and each row is one sub-contract or sub-grant:

FieldExample
awardLevel, kindsubaward, subaward
subAwardId, subAwardType200155, sub-contract
subAwardDate, subAwardAmount2025-05-30, 1154736350
subAwardDescriptionCONSTRUCTION SUBCONTRACT (CS)-111G BUILDING OUTFITTING
subRecipientName, subRecipientUeiKIEWIT POWER CONSTRUCTORS CO, CFCCZHPBR445
primeAwardId, primeRecipientName, primeRecipientUei, primeRecipientId89233018CNR000004, FLUOR MARINE PROPULSION, LLC, CWHMVCX7K1N6
primeAwardGeneratedInternalId, primeAwardUrlCONT_AWD_89233018CNR000004_8900_-NONE-_-NONE-, https://www.usaspending.gov/award/CONT_AWD_89233018CNR000004_8900_…
awardingAgency, awardingSubAgency, awardCategoryDepartment of Energy, Department of Energy, contracts

primeAwardGeneratedInternalId is the same value as a prime row's generatedInternalId, so the two modes join cleanly on it (or on primeAwardUrl = awardUrl).

Four things to know:

  • Filters retarget to the sub-recipient. recipients, recipientStates and recipientTypes match the sub-awardee, not the prime contractor; agencies/fundingAgencies, keywords, placeOfPerformanceStates, naicsCodes, pscCodes, defCodes and the amount bounds work as usual (matching the prime award's NAICS/PSC/DEFC, since sub-awards carry none of their own). awardIds matches the prime award ID and returns every sub-award filed under it — the fastest way to see who a given prime contractor subcontracted to. None of NAICS/PSC/DEFC appear as their own output field on a sub-award row either (see the field table above) — they only narrow which sub-awards come back, matched against the prime.
  • sortBy: lastModifiedDate falls back to the sub-award date, because sub-award records carry no last-modified timestamp.
  • Coverage is narrower than prime awards. Only prime recipients required to file FSRS reports have sub-awards, so small awards, most loans and most direct payments return nothing here. An empty sub-award result does not mean the prime award doesn't exist — re-run with awardLevel: "prime" to confirm.
  • subAwardId is reused across genuinely different filings — it is not a unique key on its own. USAspending's FSRS numbering re-files a later contract modification under the same Sub-Award ID (live-verified: DOE prime 89233018CNR000004 has one id covering both a $96.9M base filing and a $1.15B modification nine days apart), and — rarer, confirmed on two unrelated primes across DOE and HHS — occasionally reuses an id/date/amount under a different sub-awardee name. This Actor treats subAwardId + subAwardDate + subAwardAmount (rounded to the dollar, to absorb FSRS's own sub-cent resubmission noise) + subRecipientName as the real row identity, so amendments and mismatched-name filings are each delivered as their own row instead of one silently dropping the other. In the mismatched-name case both rows are kept deliberately — that's an upstream FSRS data quality issue, not something this Actor corrects by picking a side.

Sample row

{
"awardId": "89243425FEE000489",
"awardUrl": "https://www.usaspending.gov/award/CONT_AWD_89243425FEE000489_8900_89243423AEE000008_8900",
"awardCategory": "contracts",
"awardType": "BPA CALL",
"recipientName": "ENERGY TECHNOLOGY ALLIANCE LLC",
"recipientUei": "WDTLX4NKRKC8",
"recipientCity": "BEND",
"recipientState": "OR",
"awardingAgency": "Department of Energy",
"awardingSubAgency": "Department of Energy",
"description": "SCIENTIFIC, ENGINEERING AND TECHNICAL SUPPORT (SETS) FOR DOE EERE'S SOLAR ENERGY TECHNOLOGIES OFFICE (SETO) - FOLLOW-ON TO ORDER 89243424FEE000371",
"awardAmount": 7909335.88,
"totalOutlays": 7909335.88,
"startDate": "2025-04-30",
"endDate": "2026-04-30",
"placeOfPerformanceCity": "GOLDEN",
"placeOfPerformanceState": "CO",
"naicsCode": "562910",
"pscCode": "R425",
"disasterEmergencyFundCodes": ["Q"]
}

Watch mode

Set watchLabel to a name for a saved search, e.g. "doe-solar-contracts". The first run for a given label + filter combination is a free baseline: it records every award (or sub-award, in sub-award mode) currently matching your filters and returns zero rows, charged nothing. Run the same label and filters again later — on a schedule, typically — and you get back only what's new since the last run; anything already delivered is skipped and not charged. Works in both prime and subaward mode: a prime-mode watch alerts on new awards matching your filter, a sub-award-mode watch alerts on new sub-contracts/sub-grants filed under it (including under an exact awardIds lookup, e.g. "tell me when this prime contractor subcontracts something new").

Changing any filter (categories, keywords, agencies, recipients, states, NAICS/PSC/DEFC codes, amount bounds, or award IDs) starts a fresh baseline under that label. Leaving startDate/endDate on their rolling defaults (last 365 days / today) does not — those inputs move on their own every day, so pinning the baseline to their resolved value would force a fresh baseline daily; only an explicitly set start or end date counts toward the fingerprint. maxPagesPerCategory is your own scan-depth cost cap, so it's left alone on incremental runs, but a baseline run scans deeper than it (up to 1,000 pages per category) so a small cap set for normal runs can't make the baseline miss awards that exist right now.

Baseline size cap. A baseline holds up to 20,000 ids in one saved record. If a label's baseline grows past that, the oldest-first-seen ids are dropped — and a dropped id is no longer recognised, so it comes back as "new" on a later run and is charged again. The run that drops them says so explicitly: a warning in the log, a note on the run's status message, and baselineTruncated / baselineTruncatedTotal (this run / the whole life of the label) on the webhookUrl payload and the saved record. If you see it, narrow the watch query (agencies, keywords, state, minAmount, the date window, awardTypes) or split it across several labels so each baseline stays under the cap. A baseline run also stops recording at 20,000, and already warns separately when it hits that.

watchChanges (prime mode only) turns on a second kind of alert: an award that was already delivered under this label is re-delivered (charged again) if it changed since you last saw it — USAspending's own lastModifiedDate moved, or awardAmount/totalOutlays (contracts and assistance), loanValue/subsidyCost (loans), or endDate differ from the stored snapshot. The re-delivered row is tagged with _watchChangeType (which field(s) moved) and _watchPrevious (their old value(s)), so you don't have to diff it against your own last-seen copy. Not offered in sub-award mode — a sub-award is a static FSRS filing with no reliable "this changed" signal to track, so setting the flag there is a no-op (logged, not silently ignored). Every award's snapshot is refreshed on every run regardless of the flag, so turning watchChanges on later only detects drift from that point forward, never a backlog against changes it never captured.

Don't filter on a field you're watching for changes. A filter decides which awards come back at all, so a filter on a watched field hides exactly the change you asked to be told about — the award stops matching and the run reports nothing rather than reporting the change. Two inputs do this here, and watchChanges warns, names the blind field(s), and says so in both the run's status message and the webhookUrl payload (watchChangeBlindFilters) rather than letting a blind run look like a quiet one (measured live, with a real award and a real contract approaching its end date):

  • minAwardAmount/maxAwardAmount are sent to USAspending as its own server-side amount filter on the same awardAmount field being compared. Measured live: award 70T05026F5900N033 (Award Amount $958,748.70) comes back under maxAwardAmount: 1000000 and is gone under maxAwardAmount: 900000 — so if its amount had grown from $880k to $958k, the $900k watch would show no change at all. An upper bound hides increases (change orders, exercised options), a lower bound hides de-obligations and descopes.
  • expiringWithinDays/expiringAfterDays filter on period-of-performance end date, which is the watched endDate. An extension past the window drops the award instead of reporting it as extended — the "my recompete just slipped" alert is the one a windowed watch cannot deliver.

Either way the fix is the same: keep two labels — a narrow one for new awards, and a wider one with watchChanges and no filter on the field you care about — and filter the delivered rows on your own side.

Opportunity score

Set includeOpportunityScore (prime mode only) to add a 0-100 opportunityScore field — a fixed, published formula, never an AI/LLM call, so it's fully reproducible from the row's own fields:

FactorMax pointsHow it's scored
Award size40Log-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 match2525 if description/naicsDescription/pscDescription contains one of your own keywords (if you set any — it already searched on them), otherwise a fixed list: AI, machine learning, cyber(security), cloud, solar/renewable/clean energy, quantum, robotics, autonomous, biotech, semiconductor, data analytics. Otherwise 0.
Award category15 / 12 / 8 / 6 / 5 / 4IDVs (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 since this formula is aimed at pursue/recompete opportunities, not funding awards.
Recompete urgency20Scales from 20 (ending today) down to 0 (365+ days out, or already past its end date), same endDate math as expiringWithinDays above.

Off by default, so it never changes the default row shape. Prime mode only — sub-award records report no period-of-performance end date to score urgency from, so setting the flag in awardLevel: "subaward" mode is a no-op (logged, not silently ignored), same pattern as expiringWithinDays.

A rival USAspending Actor markets this same idea as "AI opportunity analysis" — it isn't, it's a weighted formula same as this one, just not published. See A federal-contracts scraper's "AI opportunity score" is a spreadsheet formula, confirmed live for the live comparison and the exact weights above spelled out.

Pricing

Pay per result: $0.004 per award on the free plan, dropping to $0.0025 on Gold and above (Bronze $0.0035, Silver $0.003), no Actor-start fee. You only pay for awards actually written to the dataset.

FAQ

Why can't I mix contracts and grants in one search on USAspending's own site? You can here. The underlying API rejects a request whose award_type_codes span two groups (must only contain types from one group), so this Actor runs one query per category you select and merges the results into a single dataset, deduplicated by the award's stable internal id.

Why did my search return zero awards? The filters are ANDed. A keyword plus a state plus a minimum amount over a short window is often genuinely empty — drop one filter first. The other common cause is an agency name that isn't the exact top-tier spelling (Department of Energy, not DOE).

How do I filter by PSC, and where do I find the code? pscCodes: ["R425"]. PSC is a 4-level hierarchy and you can stop at any level: R (all services), R4 (professional services), R425 (engineering/technical support). Product codes are numeric (10 weapons, 1005 guns through 30mm); R&D codes start with A (AA agriculture R&D, AA1, AA11). Codes are case-insensitive here — r425 is uppercased for you. Browse the live tree at api.usaspending.gov/api/v2/references/filter_tree/psc/.

My pscCodes run came back empty — why no error? A PSC that is well-formed but doesn't exist returns zero rows rather than failing, so a typo looks like "no matching awards". The run log prints pscCodes=[...] exactly as sent; check it against the tree above. Also remember PSC only exists on contracts and IDVs — combining pscCodes with awardCategories: ["grants"] is always empty by definition.

What is defCodes / DEFC, and which codes mean COVID-19 vs infrastructure? Disaster Emergency Fund Codes are a flag USAspending stamps on the award's own funding line to say which special appropriation paid for it — a structural fact, not a text match. Re-verified live against api.usaspending.gov/api/v2/references/def_codes/ (2026-10-10): the API accepts 52 codes, and exactly 9 of them carry a disaster flag. Seven are covid_19: L (Coronavirus Preparedness and Response Supplemental Appropriations Act 2020), M (Families First Coronavirus Response Act), N (CARES Act), O (a shared non-emergency code spanning the CARES Act, PPP and Health Care Enhancement Act, Consolidated Appropriations Act 2021, and the American Rescue Plan Act), P (Paycheck Protection Program and Health Care Enhancement Act), U (Consolidated Appropriations Act 2021), V (American Rescue Plan Act of 2021). Two are infrastructure, both the Infrastructure Investment and Jobs Act: 1 (non-emergency P.L. 117-58) and Z (emergency P.L. 117-58).

IIJA is now the bigger of the two programs by award count — live-counted 2026-10-10 over 2021-11-15..today, 1+Z together match ~296k awards (157k grants, 120k direct payments, 18k contracts) against ~92k for the CARES Act code N. If you are tracking federal infrastructure money — roads, bridges, broadband, water, grid — defCodes: ["1","Z"] is the structural way to isolate it, instead of guessing at keywords like "bridge" or hoping an agency filter approximates it.

The output already carries these as disasterEmergencyFundCodes on every prime-mode row; defCodes lets you filter to them up front instead of fetching everything and checking after. An out-of-list value is rejected by USAspending itself with a 400 naming the valid codes, and the Apify UI only offers the nine flagged ones, so this filter can never silently no-op. The other 43 accepted codes are unflagged appropriation codes with no published program meaning, so the Actor deliberately does not offer them.

Does defCodes work in sub-award mode? Can I see which code matched? The filter, yes — live-verified 2026-09-28: defCodes: ["N"] against 2020 contract sub-awards cut 236,602 candidates to 50,362 real CARES-Act-funded ones (e.g. Moderna's ASPR clinical-trial subcontracts), matching the underlying prime award's funding line same as PSC/NAICS above. The per-row code, no — sub-award rows have no disasterEmergencyFundCodes field at all (not even null; the key is absent). This isn't an Actor gap: USAspending's own sub-award endpoint returns def_codes: null even when it's explicitly requested as an output field, so there is nothing real to surface. If you need the matched code visible on the row, use awardLevel: "prime" — or pull the sub-awards, then look up each primeAwardId in a prime-mode run.

How far back does the data go? 2007-10-01. The API refuses earlier start dates, so this Actor clamps them instead of failing.

Are loan amounts in awardAmount? No. Loans report loanValue (face value) and subsidyCost instead of an obligated amount — that is how the API models them, and both fields are passed through unchanged.

Why does startDate on a row show a date decades before my search window? Because startDate/endDate are not a strict window on anything the row shows. They are passed straight through to USAspending's award-level time_period filter, and that filter is looser than it looks. Measured live on 2026-09-21 (contracts, CA recipients, NAICS 541512, minAwardAmount 1,000,000): a two-day window (2024-03-01..2024-03-02) returned the same top awards as the whole of 2024 — including one whose period of performance ran 2018-05-15..2023-09-30 and whose 47 transactions contain no 2024 action date at all. Moving the window's end does change the result set (a 2026-09 window returns different awards); narrowing its start barely does.

So treat the window as a coarse recency bound, not a filter:

  • Do not assume any date on the row falls inside it. In that same 10-row sample only 1 of 10 lastModifiedDate values did; the other 9 were later than the window.
  • Filter precisely yourself on the date field you actually care about. expiringWithinDays/expiringAfterDays already do that for period-of-performance ends (before charging), and sortBy: "lastModifiedDate" orders by most recently modified.
  • This is upstream behaviour, not something this Actor adds: the identical filters posted directly to POST /api/v2/search/spending_by_award/ reproduce it exactly.

How do I find contracts coming up for recompete? Set expiringWithinDays (e.g. 180) to only get awards whose period of performance ends within that window — USAspending has no filter for this itself (its date filters only search by action date, not end date), so this Actor fetches normally and filters client-side on the endDate field it already returns for every contract/grant row, before charging. Add expiringAfterDays (e.g. 90) to also skip anything ending too soon to realistically prepare a bid for. Neither applies to the idvs or loans categories (USAspending reports no period-of-performance end date for either, so those rows are always dropped) or to awardLevel: "subaward" (sub-award records report no end date either) — all three warn in the log rather than silently returning nothing. Measured cycle 884: every IDV sampled came back with endDate: null, so awardCategories: ["idvs"] plus expiringWithinDays can only ever return zero rows.

Is opportunityScore an AI/LLM score? No. It's a fixed formula over fields this Actor already returns — award size (log-scaled), a tech/priority-sector keyword match, award category, and recompete urgency from endDate — spelled out in full in Opportunity score above so you can reproduce or re-weight it yourself. No external call is made to compute it.

Is this the same as SAM.gov? No. SAM.gov lists pre-award opportunities you can bid on; USAspending lists awards already made. This Actor covers awards — who won, how much, which agency, and when the work ends.

Does it need a proxy? No. Plain HTTPS to a public government API, so runs are fast and cheap.

Can I get alerted when an award I already know about changes, not just when a new one appears? Yes — set watchChanges alongside watchLabel (prime mode only). An award whose last-modified date, amount, outlays or end date has moved since you last saw it is re-delivered and charged again, tagged _watchChangeType/_watchPrevious with exactly what changed. Off by default, so a plain watchLabel only ever alerts on brand-new awards. One caveat worth knowing: don't also filter on a field you're watching — minAwardAmount/maxAwardAmount and expiringWithinDays drop an award the moment the watched field moves out of range, so that change can never be reported. The run warns and names the blind field(s); see Watch mode for the measured example and the two-label fix.

Can I get alerted only when a new award appears, instead of re-pulling the same search? Yes — set watchLabel, see Watch mode. The first run records a baseline for free; every run after that on the same label and filters returns only what's new, and skips (without charging) anything already delivered.

How does this compare to other USAspending scrapers? Checked against every competitor's real live pricingInfos, re-verified 2026-10-03 — a fresh 5-term Store sweep (usaspending / federal awards / federal spending / government spending / federal contracts grants, ~90 distinct listings seen, almost all 1-5-user templated clones) found three genuine rivals never named before, disclosed below; the six previously-named rivals all re-verified live with zero price or user-count drift except copious_atoll (10 → 11 users, a one-user flap the "under 10 users" wording already covers). The two highest-traction priced players are both pricier than us at every buyer plan tier: parseforge/usaspending-scraper (the most users of any competitor, 32) charges $0.012/result plus a $0.16 run-start fee on the free plan ($0.008 + $0.05 on Gold and above), and benthepythondev/usaspending-contracts-intelligence (17 users) charges $0.005/result on the free plan, tapering to $0.004 on Gold and $0.0035 on Diamond, plus a small start fee on every run. Ours is $0.004/result on the free plan, $0.0025 on Gold and above, and no start fee at all. Five listings price under us per row, all with real traction: ryanclinton/usaspending-search at a flat $0.002/result plus a $0.00005 start fee; copious_atoll/usaspending-contracts (11 users) at $0.001/result; themineworks/usaspending-federal-awards (3 users) at $0.001 tapering to $0.0006 — but themineworks/usaspending-federal-awards's previously-scheduled $0.005 run-start fee is now active (took effect 2026-09-22, confirmed live), and its own listing advertises "18 Fields"; this Actor returns 37 typed fields across 6 award categories (contracts, IDVs, grants, direct payments, other financial assistance, loans), each category with its own correct field mapping (loans carry loanValue/subsidyCost, not awardAmount) rather than one generic shape stretched across every award kind; and two never-named entrants surfaced by this cycle's wider sweep, both genuine undercutters: fortuitous_pirate/usaspending-scraper (2 users, 1 new/30d, titled "No Login, $0.93/1k" — the headline figure matches its live price) at a flat $0.00093/result plus a one-time $0.001 start fee, cheaper than every other rival on this page including copious_atoll and themineworks's free-plan rate; and pink_comic/usaspending-federal-spending-search (7 users, re-verified 2026-10-18) at a flat $0.002/result plus a $0.0001 start fee, which beats our $0.004 free-plan rate and our $0.0025 Gold+ rate alike since it is flat, not tiered. One exact tie, also never named: haketa/usaspending-scraper (4 users) charges $0.004 on the free plan tapering to $0.0025 on Gold and above — the identical ladder we charge, tier for tier — plus a negligible $0.00005 start fee, so it ties us on price while offering fewer fields (recipient, agency, amount, award type, dates, place of performance, NAICS — no sub-award mode, no watch mode, no opportunity score). There is also a free option: constant_quadruped/research-grant-aggregator (13 users) bundles NIH, NSF, Grants.gov and USAspending lookups into one query at no per-record charge — but it's a shallow cross-source join (PI names, award amounts, organizations, keywords), not 37 typed, correctly-mapped fields per award category, and it has no recompete-urgency filter, sub-award-to-prime joining, or watch mode. benthepythondev/usaspending-contracts-intelligence's own listing advertises "AI opportunity analysis" — ours computes the same kind of 0-100 pursue-worthiness score (includeOpportunityScore) from a plain documented formula (award size, tech-keyword match, category, recompete urgency), not an opaque model call, so it's reproducible and free of LLM cost/latency. None of the nine competitors' public listings mention a recompete-urgency filter (expiringWithinDays/expiringAfterDays) or sub-award-to-prime joining as of this check. (Superseded in part — see the 2026-10-05 update below: the recompete-filter half still holds against all 120 niche listings, but two listings do now advertise sub-award-to-prime joining.)

Update, re-verified live 2026-10-03 (cycle 1193): The prior sweep's 5 search terms only returned ~90 distinct listings; widening the match (any of usaspending/federal award/federal spending/government spending/federal contract/federal grant as a substring, not an exact phrase) against the same 5 queries found 198 distinct listings, 131 matching — this niche was under-matched, not under-sized. All nine previously-named rivals re-verified live with zero price or user-count drift. Five more genuine undercutters, never named before: sleek_waveform/federal-contract-scraper-usaspendinggov (5 users) at a flat $0.001/result + $0.00005 start (contracts only); whetstonetools/federal-awards-lookup (3 users) at a flat $0.002/result + $0.0001 start, covering contracts/grants/loans/direct payments/IDVs by recipient name (no sub-award mode); publicmoney/usaspending-awards-scraper (3 users) tiered $0.002 (Free) → $0.0007 (Diamond); datamule/usaspending-gov-awards-scraper (1 users) tiered $0.0005 (Free) → $0.00025 (Diamond) — the cheapest listing in the niche by a wide margin, on every tier; and martc03/gov-contracts-mcp (12 users), an MCP server with no pricingInfos at all (genuinely free, same shallow-join caveat as constant_quadruped below it — SAM.gov + USAspending + entity lookups via an AI assistant, not 37 typed fields per category). The single biggest listing in the whole niche was also never named: jungle_synthesizer/samgov-scraper (172 users — more than 5x parseforge's 32) charges a tiered $0.001 (Free/Bronze) → $0.0008 (Gold+) per record (plus a pricier data-record-premium tier at $0.002→$0.0016 for enriched rows), cheaper than us at every plan tier — but its award data comes from SAM.gov's own contract-award notices, bundled alongside solicitations, sources-sought, exclusion records and wage determinations, not USAspending's full six-category award lifecycle, so it is not a drop-in replacement for grants/loans/direct-payments/IDV/sub-award coverage. Several more real rivals were seen and are left out of this paragraph because none beats our $0.0025 Gold+ rate once their start fees and tiers are worked through: parseforge/government-contract-awards-scraper and parseforge/usaspending-loans-scraper (parseforge's own SAM.gov-sourced and loans-only siblings, both pricier per row than its already-named main listing), inexhaustible_glass/federal-contractor-intelligence, lulzasaur/usaspending-scraper, logiover/usaspending-gov-scraper, blaidlink/usaspending-competitor-award-intelligence, devilscrapes/usaspending-federal-awards-scraper, thoob/federal-spending-feed, and scrapepilot/gov-tenders-scraper-usaspending-ted-uk-contracts (a multi-country bundler).

Update, re-verified live 2026-10-04 (cycle 1218): All 15 previously-named rivals re-checked live via fleet-wide check-competitor-claims/check-price-superiority — zero price or user-count drift. A niche-size sweep's top-10-by-users surfaced 4 listings never individually checked; two are real but out of scope, not substitutes, so they stay unnamed: pink_comic/sam-gov-contract-opportunities (30 users) is this same owner's other product — SAM.gov pre-award opportunities/solicitations for vendor leads, not USAspending award data, despite SEO-stuffing "usaspending" into its own description — and fiery_dream/scholarship-intel (39 users) is a scholarship/university-data platform whose "Federal Grants" feature is live Grants.gov opportunity listings, not post-award USAspending records. The other two are genuine rivals, both dearer, newly disclosed: omarchydev/government-contract-monitor (33 users) bundles SAM.gov solicitations with USAspending award lookups but its real per-record charge — a contract event, not the misleadingly-cheap $0.00001 default-dataset-item one — is $0.02, 5-8x our top rate, plus separately-billed AI add-ons (pwin_scored $0.20, recompete_detected $0.25, etc.); and nexgendata/us-government-records-api (9 users), a multi-source bundler (court dockets, FDA recalls, OFAC, IRS 990s, USAspending and more) whose cheapest tier is $0.005/record, 2x our free-plan rate and dearer at every tier, on top of a flat $0.005 start fee.

Update, re-verified live 2026-10-05 (cycle 1248) — first full-list sweep of this niche, and the first undercutters found in our own sub-award lane: Every prior sweep on this page (1167/1193/1218) ended by diffing a top-10-by-users table against the handles named here. Apify pins a brand-new listing at 2 users, so in a niche this templated a top-10 cut is really a cut at "4+ users" — it selects for listing age, not for who priced underneath us. Run in full for the first time, the niche is 120 matching listings, 97 of them never named here, and only 3 of those 97 have more than 2 users. 32 of the unnamed listings were live-priced this cycle; the tail is majority-undercutting — roughly two in three price below our free-plan $0.004/result — which is the honest shape of this market and the reason this page argues field coverage and correctness rather than price. Our own rate re-verified live, unchanged: $0.004 free plan → $0.0025 Gold and above, no start fee.

Of the three unnamed listings above 2 users, one is a genuine substitute and is now disclosed: dalbian/usaspending-federal-awards (3 users) searches the same prime contract/grant/loan/direct-payment set on the same filters (keyword, agency, recipient, date, amount, NAICS, PSC, place of performance) and charges $0.002 per award plus a $0.03 per-search run fee. The run fee is what decides it: we are cheaper for small searches (a 10-award lookup costs $0.04 there and $0.04 here on the free plan, and only $0.025 here on Gold), but above ~15 awards per run it beats our free-plan rate, and above ~60 awards per run it beats our $0.0025 Gold+ rate too — so on any real bulk pull it is cheaper per row than we are. It has no sub-award mode. The other two are ruled out: parseforge/fpds-federal-contracts-scraper (3 users) reads FPDS rather than USAspending and charges $0.021/result, 5-8x our rate at every tier; and upward_enterprises/sam-gov-contract-radar (3 users) is a SAM.gov pre-award opportunities radar whose cheap award event ($0.001 → $0.0006) only returns "the largest USAspending awards signed recently for the same codes" as enrichment alongside solicitations — not a general award search, the same scope line this FAQ draws between SAM.gov and USAspending above.

The sub-award claim on this page needed correcting (verified live 2026-10-05). The 1167 sweep's closing line — that no competitor's listing mentions sub-award-to-prime joining — was scoped to the nine rivals named at that time, but it has read since then as a niche-wide differentiator, and the full-list sweep found two listings that do advertise exactly that: scrapers_lat/usaspending-subawards-scraper (1 user) at a tiered $0.012 free → $0.009231 Gold+ per result, 3.7x our free-plan rate and dearer at every tier; and jungle_synthesizer/usaspending-subaward-prime-mapping-scraper (1 user, 0 new in 30 days) at $0.001/record plus a $0.10 run-start fee, which that start fee keeps dearer than us up to ~33 records on the free plan and ~67 on Gold+, and cheaper per row beyond it. Neither is dormant-by-price alone, so treat them as real: we are no longer the only sub-award-to-prime option in this niche, only the cheapest one at small-to-medium run sizes and the only one that also does prime-mode search, watch mode and recompete filtering in the same Actor. No listing found in this sweep offers a recompete-urgency filter (expiringWithinDays/expiringAfterDays); that part of the 1167 line still holds against all 120 matches, not just nine.

Correction to the 1248 paragraph above (verified live 2026-10-05, same day as it was written): cblu/usaspending-federal-awards-scraper and bercikgroup/usaspending-federal-awards-scraper were listed there as "dearer than us at every tier" — wrong. cblu charges a flat $0.003/award: cheaper than our Free ($0.004) and Bronze ($0.0035) tiers, tying Silver ($0.003) exactly, dearer only from Gold up. bercikgroup charges a flat $0.0035 (plus a $0.02 start fee): cheaper only than our Free tier, tying Bronze exactly. Both are real partial undercutters, not clean losses — corrected here rather than in place so the original sweep stays traceable.

Update, re-verified live 2026-10-05 (cycle 1289) — finishing the 1248 sweep: 1248 live-priced 32 of that day's 97 unnamed listings and ran out of room; this cycle priced the rest. A fresh niche-unnamed run now shows 122 matched / 77 unnamed (normal churn for a templated niche). All but one of the 77 are genuine USAspending-sourced award scrapers; the one exception is excluded below, not priced as a win. 20 undercut us at every paid tier, none named before: scrapecrafter/usaspending-0-50-federal-awards-contracts (flat $0.0005), datalayer/federal-contract-awards (tiered $0.001→$0.0007), adobeflex/usaspending-awards-lite, hridayrungta/usaspending-scraper, jungle_synthesizer/usaspending-crawler and opendata-labs/usaspending-scraper (all flat $0.001 — jungle_synthesizer and opendata-labs each also carry a real start fee, $0.1 and $0.005 respectively, that erodes the gap on small runs), hipersoft/usaspending-scraper (tiered $0.002→$0.001), maydit/us-federal-contract-awards-scraper (tiered $0.002→$0.0012), andrew_avina/federal-contracts-mcp (flat $0.0015, MCP-native, sourced from SAM.gov + USAspending together), s-r/usaspending-scraper (flat $0.0015/award plus a separate $0.001 run-start fee — the API marks the start fee isPrimaryEvent, but the per-award charge is the real headline rate, same trap cycle 1283 found on clinicaltrials-scraper), muhammadafzal/usaspending-awards-scraper (tiered $0.002→$0.0016), chrisp1211/usaspending-scraper-max, datapilot/public-procurement-intelligence-hub, pink_comic/federal-grant-awards and usta/usaspending-new-contract-awards (all flat $0.002), artificially/us-contracts-scraper and captainhandsome/usaspending-federal-awards (both tiered $0.003→$0.0021), and skootle/usaspending-contract-intelligence (tiered $0.003→$0.0024, plus a $0.01 start fee). There's also a free option, with a caveat: artificially/business-data-mcp charges nothing on Apify, but USAspending/SAM.gov contracts is 1 of 13 tools in a general business-data MCP server (also jobs, LinkedIn, EU tenders, startups) — not a dedicated award feed.

Eight more cross under at our cheaper tiers but not Gold and above: bgfc97/government-tenders, foxlabs/usaspending-contract-award-data, frenchdatalab/usaspending-federal-awards, joi-ai-agent/us-federal-contracts-finder, knotty_mistveil/usaspending-federal-awards, nefes-tools/us-federal-awards and alaudinburki/federal-award-intel (all flat $0.003 — cheaper than our Free and Bronze, tying Silver, dearer only from Gold up) plus signalcrawl/federal-recompete-award-finder (flat $0.0025, which ties our Gold+ rate exactly rather than beating it). One of these is a different shape, not a drop-in: splendorous_astrolabe_xs9/govcon-monitor (also flat $0.003) is a SAM.gov-opportunities/recompete monitor that joins in USAspending award history, not a bulk award export.

One listing is excluded as out of scope, not priced as a win: pink_comic/federal-audit-clearinghouse-single-audit-data reads Federal Audit Clearinghouse single-audit filings (expenditures, audit findings, compliance flags) — a different federal dataset from USAspending's contract/grant/loan award records, despite the shared "federal" keyword. For completeness, since it is cheaper than us on paper (re-verified live 2026-10-06): it charges $0.002 per dataset item plus a $0.0001 start fee, which undercuts our Free ($0.004) and Bronze ($0.0035) tiers and ties Silver ($0.003) — but it is not a substitute at any price, because it cannot return a single USAspending award record. We exclude it on scope, not because it loses on price.

Correction to the 1193 paragraph above (verified live 2026-10-05): datamule/usaspending-gov-awards-scraper was described there as the niche's cheapest listing "by a wide margin, on every tier". On paid tiers that is still true (its $0.00025 Diamond rate is untouched by anything in this sweep), but it is no longer true at the free tier — dami_studio/usaspending-awards-scraper (2 users) matches it exactly at $0.0005/result free plan (tapering only to $0.000485, plus a $0.0005 start fee), so the two tie there. The other cheapest never-named entrants, all at 1-2 users: thirdwatch/usaspending-federal-awards-scraper ($0.001 → $0.0005), koalastuff/usaspending-award-search ($0.001 → $0.0007), bakos_bence/usaspending-awards-monitor ($0.00149 → $0.000745, but with a $0.01 start fee on every run), vhsgreed/us-federal-contracts ($0.00125 → $0.00095 + $0.002 start), autofacts/usaspending-scraper and agentictools/federal-spending-search (both flat $0.001), pappy-dev/usaspending-awards (flat $0.001), publicrecords/usaspending-awards-scraper ($0.0015 → $0.00105), gubidonius/usaspending ($0.0015 + $0.002 start), studious_allergy_mig/fed-contracts-scraper (flat $0.002), tagadanar/usaspending-federal-awards ($0.002 → $0.0014 + $0.001 start) and scrapesage/usaspending-scraper ($0.002 → $0.0005 at Diamond). One watch-mode rival prices close to us: lowlanddata/usa-federal-award-monitor (1 user) at $0.003 → $0.0024 per baseline result plus a $0.005 start fee and a separate $0.02-$0.016 charge per new-award alert, so its alerting costs 8x its baseline rows. Several were checked and are dearer than us at every tier, so they stay unnamed (see the 1289 correction below for two that were wrongly sorted into this bucket): open-data-tools and straightforward_hydra and invaluable_rondeau ($0.005), dataio ($0.006 → $0.004), great_pistachio ($0.01), scrapers_lat/usaspending-awards-scraper ($0.012), zinin ($0.015), parselab ($0.02), sonnitech ($0.02), nexgendata/usaspending-federal-awards-scraper ($0.05/item), datasignalslab ($0.02/company) and nexgenwatch/usaspending-federal-award-watch ($0.025/delta + $0.02 start).

Update, re-verified live 2026-10-06 (cycle 1333): Fresh niche-unnamed resweep: 144 seen, 124 matched, 48 unnamed (down from 77 at 1289 — most of that gap already named by the 1289/1193-correction paragraphs above, normal churn otherwise). Spot-checked a sample of previously-named handles from this sweep's output (dataio, open-data-tools, straightforward_hydra, invaluable_rondeau, zinin) — all matched their published prices exactly, zero drift. Live-priced the entire 48-listing unnamed tail; two genuine never-named undercutters, both flat (no tiers) and both cheaper than our $0.0025 Gold+ rate at every plan: northpine-studio/usaspending-awards (2 users) at a flat $0.002/result, covering contracts/grants/loans by keyword, agency, recipient, amount and date — the same prime-award scope this Actor covers; and nightwave-owner/usaspending-federal-contracts (2 users) at a flat $0.002/contract, filtered by date, keyword, recipient, agency, NAICS/PSC code, state and amount (contracts only, no grants/loans/IDVs/sub-award mode). Neither publishes a start fee. The rest of the 48 are not real undercutters: about a dozen tie our Free tier exactly at a flat $0.004 (nasasurfer, carranza-tech, groundtruth, hichemdev, oneshotventure, antishock, foxlabs/usaspending-contractor-data, conserving_celerytop) but are flat or taper only to $0.0028, so all are dearer than us from Gold up; the remainder price at $0.005-$0.6/result or are a different shape — SAM.gov pre-award opportunity/bid feeds (civic-data-tools/public-bid-search, seibs.co/us-gov-contracts-intel, george.the.developer/federal-contract-opportunity-monitor), company/contractor profile lookups rather than award search (foxlabs/usaspending-contractor-data, mikee368/us-contractor-profile), a multi-source due-diligence tool (tagadanar/us-supplier-due-diligence, a different listing from the already-named tagadanar/usaspending-federal-awards), MCP tool-call pricing (rl1987/usaspending-mcp, nexgenwatch/federal-award-counterparty-mcp, a different listing from the already-named nexgenwatch/usaspending-federal-award-watch), or an unrelated keyword-collision match (moving_beacon-owner1/foreclosure-auction-scraper, a real-estate foreclosure tool, not a federal-awards product at all).

Update, re-verified live 2026-10-09 (cycle 1441): The six prior sweeps above (1167 through 1333) each widened the match by hand because the standing niche-size tool's own auto-generated search never found more than 126 of this niche — promoted it into the tool's hand-curated term table this cycle (16 short, single-concept terms instead of the old 3-word compound phrase, the same fix cycle 1400 applied to court-records-scraper), now reading 133 matched / 45 unnamed with no further widening needed. Live-priced the 4 unnamed listings at or above the 3-user floor: nasasurfer/federal-award-intelligence and carranza-tech/federal-contract-awards-feed re-verify exactly as the 1333 paragraph already has them (flat $0.004, tying our Free tier only, dearer from Gold up — zero drift); crawlerbros/usaspending-scraper — found at 3 users, tiered $0.005 (Free) → $0.003 (Gold+) plus a $0.005 start fee, dearer than us at every tier — is gone from the Store as of 2026-10-09 (confirmed 404, a removal not a rename), so it needs no disclosure either way. datapilot/grants-funding-opportunities-harvester (5 users) is cheaper on paper — a flat $0.002/result — but is out of scope, not priced as a win: its own description and field list (grant titles, deadlines, eligibility, application links) is a pre-award opportunity harvester bundling the EU Funding Portal and private foundations alongside USASpending.gov, the same pre-award/post-award line the FAQ already draws for SAM.gov and the same reasoning cycle 1218 used to rule out fiery_dream/scholarship-intel's "Federal Grants" feature.

How is webhookUrl different from Apify's own platform webhooks? Apify's platform webhooks are configured separately per Task/Actor via the Console or the Webhooks API — useful if you already live in the Apify Console, but extra setup if you're calling this Actor's API directly and just want a completion ping. webhookUrl is a plain input field: set it on the run itself and it POSTs a JSON body (actorRunId, defaultDatasetId, finishedAt, pushed, scanned, and — if watchLabel is set — watchSeeding/watchNewCount/watchChangedCount/baselineTruncated/baselineTruncatedTotal) once the run finishes and every row is already pushed and charged. It's best-effort — a slow or failing webhook only logs a warning, it never fails the run, changes the result set, or affects billing.

If I set both agencies and fundingAgencies, do I get awards from either agency, or just the overlap? Just the overlap — an award must match both at once, not either. Within a single field multiple values OR together as documented (agencies: ["Department of Defense", "NASA"] finds awards from either), but agencies and fundingAgencies set together AND: USAspending requires the award to be awarded by every name in agencies and funded by every name in fundingAgencies simultaneously. Live-verified (2026-09-29, calendar-year-2024 grants): agencies:["Department of Defense"] alone → 18,754; fundingAgencies:["National Science Foundation"] alone → 16,940; both set together → 0 (confirmed both against USAspending's raw award-count endpoint and through this Actor's own output). This is exactly what makes the pass-through grant tracing use case work — you want the specific agency-awarded-it/agency-actually-paid-for-it combination, not a broader either/or search — but it means setting both when you actually want "either agency" will silently narrow your search, sometimes to zero, instead of widening it.

Could a dropped filter name silently widen my search to the whole dataset — and bill me for it? Not without stopping the run first. USAspending fails closed on most bad filter values but fails open on a filter name it doesn't recognise: the parameter is silently ignored and the same HTTP 200 comes back with the unfiltered result set. Measured live: naics_codes correctly narrows results, but the one-character typo naics_code is dropped with no error and the full result set comes back instead. So before fetching a single billable page, every run sends one canary probe per filter name it's about to use — a value guaranteed to match nothing — and aborts naming the parameter if the probe doesn't come back empty, instead of silently delivering and charging for an unfiltered result set. This covers every optional filter (naicsCodes, pscCodes, awardIds, recipientName/state, etc.), not just NAICS.

Source code: https://github.com/Fetchsmith/fetchsmith/tree/main/actors/us-federal-awards-scraper

Engineering write-ups behind this Actor:

More tools: fetchsmith.com/tools — HTTP-only Actors for public data sources, no browser required.