US Federal Contracts & Grants — SAM.gov + USAspending
Pricing
from $0.95 / 1,000 record scrapeds
US Federal Contracts & Grants — SAM.gov + USAspending
Official US federal procurement data in one run: SAM.gov contract opportunities (RFPs, solicitations, sources sought, award notices), USAspending.gov award history, and Grants.gov funding opportunities. Filter by keyword, NAICS, agency, set-aside, place of performance and response deadline.
Pricing
from $0.95 / 1,000 record scrapeds
Rating
0.0
(0)
Developer
Karl Sundström
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
US Federal Contracts & Grants
Official US federal procurement data — contract opportunities, awards, and grants — from SAM.gov, USAspending.gov and Grants.gov. No scraping.
This actor pulls the same authoritative feeds that the multi-thousand-dollar GovCon platforms resell, and hands you clean, provenance-tagged JSON: SAM.gov contract opportunities (RFPs, solicitations, combined synopses, sources sought, award notices), USAspending.gov award history, and Grants.gov funding opportunities — filterable by keyword, NAICS, agency, set-aside, place of performance and response deadline.
It is the US-market counterpart to eu-ted-tenders-api-fresh: same buyer, same workflow, new continent.
Why this one
- Official sources only. GSA's own
open.gsa.govAPIs and the free SAM.gov daily bulk extract, USAspending (Treasury), Grants.gov (HHS). There is no anti-bot wall to fight and no ToS grey area — this is published government data, designed to be consumed programmatically. - The no-key path is the rich path. SAM.gov's Data Services publishes a nightly full snapshot of active notices (~230 MB, no key, no registration) that carries the full description text and a public opportunity link — fields the rate-limited API returns only as a URL.
- Cleaner than the current market. Existing actors mostly dump the raw API payload. This one normalises to a stable, flat schema, stamps every record with
source,source_url,fetched_atandactor_version, and never fabricates a missing value. - Built for the real constraint. SAM.gov keys are personal and rate-limited, so the actor is designed for incremental, scoped pulls — not naive full-table dumps that hit the daily cap in one run.
Input
| Field | Type | Notes |
|---|---|---|
sources | array | sam.gov, usaspending.gov, grants.gov (default ["usaspending.gov", "grants.gov"] — see Prefilled default below) |
samApiKey | secret | Optional. Your personal SAM.gov public API key. Omit to use the free bulk CSV (no key). |
useBulkCsv | boolean | Stream the free official daily Contract Opportunities CSV (~230 MB, no key) when no API key is set. Off by default. |
keywords | array | Narrow free-text terms (title/description/solicitation match) |
naicsCodes | array | NAICS codes (also passed to the USAspending award search) |
agencies | array | Department/subtier names (one per request) |
setAsides | array | Official GSA set-aside codes: SBA, SBP, 8A, 8AN, HZC, HZS, SDVOSBC, SDVOSBS, WOSB, WOSBSS, EDWOSB, EDWOSBSS, LAS, IEE, ISBEE, BICiv, VSA, VSS. SAM.gov takes one per request, so each code is run as a separate scoped request. |
procurementTypes | array | o solicitation, k combined synopsis, p pre-solicitation, r sources sought, s special notice, a award, u justification (J&A), g sale of surplus property, i intent to bundle. (f and l are retired upstream.) |
placeOfPerformanceState | string | Two-letter state code(s) (e.g. VA or VA,MD) |
postedFrom / postedTo | string | YYYY-MM-DD; auto-chunked to SAM.gov's 1-year window; also bounds the USAspending period |
responseDeadlineFrom / responseDeadlineTo | string | YYYY-MM-DD |
maxRecords | integer | Hard cap across all sources, split evenly between them (default 200) |
maxApiRequests | integer | Safety budget (default 9 — fits a 10/day personal SAM.gov key) |
includeFullText | boolean | Fetch full notice descriptions on the API path (costs 1 request per notice); ignored on the bulk-CSV path, which already includes full text |
Prefilled default — designed to pass a 5-minute, secret-free QA run
The prefilled input deliberately uses the two keyless, small, fast sources —
sources: ["usaspending.gov", "grants.gov"] with maxRecords: 200 — so a run:
- needs no API key (both sources are unauthenticated), and
- does not touch the ~230 MB bulk CSV (that download only happens when you explicitly
pick
sam.govand setuseBulkCsv: true).
A measured prefilled run returns ~200 records (100 awards + 100 grants) in under 4 seconds
using the default 9-request budget. Selecting sam.gov without a key and without useBulkCsv
logs a clear message and is skipped rather than silently downloading 230 MB.
Example
{"sources": ["sam.gov", "usaspending.gov"],"useBulkCsv": true,"keywords": ["cybersecurity", "zero trust"],"naicsCodes": ["541512"],"setAsides": ["SBA", "SDVOSBC"],"procurementTypes": ["o", "k", "r"],"responseDeadlineFrom": "2026-09-01","maxRecords": 1500}
The above uses the no-key bulk CSV path for SAM.gov (set useBulkCsv: true, leave
samApiKey empty). To use the live API instead, provide samApiKey and set maxApiRequests
within your key's daily quota.
Output
One dataset record per opportunity / award / grant. Contract-opportunity record (abridged):
{"record_type": "contract_opportunity","notice_id": "abc123def456","solicitation_number": "W91QUZ-26-R-0001","title": "Zero Trust Architecture Support Services","opportunity_type": "Solicitation","posted_date": "2026-09-10 14:00:00","response_deadline": "2026-10-15 16:00:00","agency": "DEPT OF DEFENSE.ARMY","naics_code": "541512","classification_code": "R408","set_aside": "Total Small Business","set_aside_code": "SBA","place_of_performance_state": "VA","place_of_performance_zip": "22060","award_number": null,"award_amount": null,"awardee_name": null,"description_url": "https://api.sam.gov/prod/opportunities/v1/noticedesc?...","attachment_links": ["https://.../SOW.pdf"],"source": "sam.gov","source_url": "https://sam.gov/opp/abc123def456/view","fetched_at": "2026-09-27T10:00:00Z","actor_version": "0.1.0"}
Award records (record_type: "award") carry award_id, recipient_name, award_amount, awarding_agency, dates and NAICS. Grant records (record_type: "grant") carry opportunity_number, agency, funding ceilings/floors, response_deadline, contact details and CFDA numbers.
Pricing
Pay-per-event: run start $0.004 + $0.0009 per record (tiers down to $0.0004 at Diamond). (Final, 2026-09-27.)
A typical 1,500-record run costs $0.004 + 1,500 × $0.0009 ≈ $1.35. Market for the same dataset (Apify store API, 2026-09-27): the closest paid competitors charge $0.001 (jungle_synthesizer, 169 users — our named leader, which we sit 10% under), $0.0025 (scrapesage) and $0.003 (fortuitous_pirate) per record. The run-volume leader, automation-lab, charges a $0.000115 commodity floor with only 12 users; we deliberately do not chase that floor (see PLAN.md §5).
Responsible use
- This actor consumes official, public data via documented APIs and the free SAM.gov bulk extract. Still run it considerately.
- Honour your own SAM.gov key's daily quota. Keys are personal to your account (default 10 requests/day for a non-federal personal key; 1,000/day once role-backed). Set
maxApiRequestswithin your budget; the actor will not exceed it. - SAM.gov
includeFullTextand attachment downloads cost extra upstream requests — leave them off unless you need them. - Some fields (contracting-officer names, grant contact names/emails) can be personal data. Do not use them for unsolicited marketing, and check your own obligations under GDPR/CCPA before republishing.
- Respect the upstream services' own terms. We publish a tool; how you run it is your choice.
Development
python3 -m venv .venv && . .venv/bin/activatepip install -r requirements.txt # apify~=4.0, httpx~=0.28, pytestpytest -q # 22 tests, no network, no API keypython -m src.main # local run (reads local input.json)
pytest output for this draft: 22 passed (streaming CSV parser incl. quoted multi-line
descriptions, filters, normalisation, pagination, request-budget hard stop, 429 handling,
and a check that API keys never appear in error messages).
Note: requirements.txt pins apify~=4.0 (not the older ~=1.7) because pay-per-event
billing via Actor.charge does not exist in the 1.x SDK.