US Federal Contracts & Grants — SAM.gov + USAspending avatar

US Federal Contracts & Grants — SAM.gov + USAspending

Pricing

from $0.95 / 1,000 record scrapeds

Go to Apify Store
US Federal Contracts & Grants — SAM.gov + USAspending

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

Karl Sundström

Maintained by Community

Actor 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.gov APIs 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_at and actor_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

FieldTypeNotes
sourcesarraysam.gov, usaspending.gov, grants.gov (default ["usaspending.gov", "grants.gov"] — see Prefilled default below)
samApiKeysecretOptional. Your personal SAM.gov public API key. Omit to use the free bulk CSV (no key).
useBulkCsvbooleanStream the free official daily Contract Opportunities CSV (~230 MB, no key) when no API key is set. Off by default.
keywordsarrayNarrow free-text terms (title/description/solicitation match)
naicsCodesarrayNAICS codes (also passed to the USAspending award search)
agenciesarrayDepartment/subtier names (one per request)
setAsidesarrayOfficial 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.
procurementTypesarrayo 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.)
placeOfPerformanceStatestringTwo-letter state code(s) (e.g. VA or VA,MD)
postedFrom / postedTostringYYYY-MM-DD; auto-chunked to SAM.gov's 1-year window; also bounds the USAspending period
responseDeadlineFrom / responseDeadlineTostringYYYY-MM-DD
maxRecordsintegerHard cap across all sources, split evenly between them (default 200)
maxApiRequestsintegerSafety budget (default 9 — fits a 10/day personal SAM.gov key)
includeFullTextbooleanFetch 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.gov and set useBulkCsv: 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 maxApiRequests within your budget; the actor will not exceed it.
  • SAM.gov includeFullText and 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/activate
pip install -r requirements.txt # apify~=4.0, httpx~=0.28, pytest
pytest -q # 22 tests, no network, no API key
python -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.