If you've spent any time searching for federal contract opportunities, you've probably used SAM.gov's search interface. And if you've used that interface, you've probably been frustrated by it.
But here's something most contractors don't know: the search page on SAM.gov isn't the only way to access contract opportunity data. Behind the scenes, SAM.gov publishes the same data through three separate channels — a daily CSV bulk export, a weekly archive export, and a public REST API. Each one serves a different purpose, each has different strengths, and each has real limitations.
Understanding these data channels won't just satisfy your curiosity. It'll help you understand why SAM.gov search behaves the way it does, why certain opportunities seem to appear and disappear, and how tools like GovTrove are able to offer a fundamentally different search experience using the exact same underlying data.
The Three SAM.gov Data Channels
SAM.gov's Data Services section — buried several clicks deep from the main page — is where the General Services Administration publishes bulk data extracts. For contract opportunities specifically, there are three ways to get the data out.
1. The Active Opportunities CSV (Updated Daily)
Every day, SAM.gov publishes a single CSV file containing every currently active contract opportunity. We're talking about a file with roughly 80,000–100,000 rows, covering every open presolicitation, solicitation, combined synopsis, sources sought notice, special notice, and award notice that hasn't been archived yet.
This file is freely available. No API key required. No special account needed. You can download it right now from SAM.gov's Data Services page.
The CSV includes the core metadata that contractors care about when screening opportunities:
- Title and solicitation number
- Notice type (presolicitation, solicitation, award, etc.)
- Posting date and response deadline
- NAICS code and set-aside designation
- Contracting office and place of performance
- Point of contact information and award details
- The full opportunity description text
That description field is a big deal. It's the narrative that contracting officers write about what they're actually looking for, and it's essential for keyword search. But there's a catch: the CSV description is plain text only. No formatting, no headings, no bullet points. If the contracting officer wrote a nicely structured description with sections and tables on SAM.gov, all of that structure gets flattened into a single unformatted text block in the CSV.
For anyone building a search tool, though, this CSV is the workhorse. Plain text descriptions are actually better for full-text search indexing — there's no HTML to strip, no formatting tags to work around. The CSV is comprehensive, updated daily, and downloading it doesn't count against any API rate limits.
2. The Archived Opportunities CSV (Updated Weekly)
Opportunities don't stay active forever. Once a response deadline passes, or a contracting officer manually archives a notice, it moves from the active set into the archive. SAM.gov publishes these archived records as a separate CSV, updated weekly.
This matters more than you might think. If you're doing market research — trying to understand what agencies have bought in the past, who won previous contracts for similar work, or how a particular program's procurement patterns have evolved — the archive is where that historical data lives.
The archive uses the same column structure as the active CSV, which makes combining the two datasets straightforward. Between the active and archived files, you can reconstruct a fairly complete picture of federal contracting activity.
3. The Contract Opportunities Public API
The SAM.gov Opportunities API is the most flexible channel, but also the most constrained. It's a REST API that lets you query opportunities with filters for date ranges, notice types, keywords, agencies, NAICS codes, and more. It returns JSON, supports pagination, and — critically — can return the full description text with original formatting.
The tradeoff is rate limits:
- Basic SAM.gov account: 10 API requests per day
- Registered entity account: 1,000 requests per day (requires a valid UEI number)
- Federal system accounts: up to 10,000 requests per day
- Hard hourly cap: 1,000 requests on a rolling basis
At 1,000 records per page, you can theoretically pull the entire active dataset in around 100 API calls. But here's where it gets interesting: the search API doesn't return descriptions inline. Instead, it returns a description_url for each opportunity. To get the actual description content, you need to make a separate API call to the /v1/noticedesc endpoint — one request per opportunity. And those descriptions come back as rich HTML, with all the formatting, headings, and structure that the contracting officer originally wrote.
So if you want nicely formatted descriptions for 100,000 active opportunities, you'd need 100,000 individual API requests — well beyond what even a federal system account's daily limits allow.
The API also only returns the latest version of each opportunity. If a solicitation was amended, the amendment usually gets its own notice ID. But occasionally an amendment overwrites the original without a new ID, and when that happens, the previous version is simply gone from both data sources.
What SAM.gov's Search Page Does with This Data
SAM.gov's own search interface sits on top of these same data sources — but it doesn't always use them well. The keyword search is basic text matching, which means it misses relevant results when contracting officers use different terminology than what contractors search for. The agency hierarchy filter has been broken for years; GSA's own documentation has acknowledged this, and agencies have published workarounds telling contractors to skip the filter entirely and search by keyword instead.
Filtering by NAICS code is flat — you can't search at a parent level and automatically include all child codes. And the overall search experience lacks features that contractors expect from a modern search tool: no boolean operators, no phrase matching, no faceted counts showing how many results match each filter value.
These aren't unsolvable problems. They're search engineering problems that a dedicated team could fix. But SAM.gov is maintained under a complex, multi-vendor government IT contract, and its priorities are spread across entity registration, exclusions management, contract awards reporting, and half a dozen other domains. Contract opportunity search is just one piece of a much larger system.
How GovTrove Combines All Three Channels
We built GovTrove on a simple premise: the data SAM.gov publishes is good — it's the search and filtering on top of it that needs work. So rather than trying to replace SAM.gov's data, we built a pipeline that ingests it through official channels and layers a better search experience on top.
Daily CSV Ingestion as the Foundation
Every day, our system downloads the full active opportunities CSV from SAM.gov's Data Services. This is the primary data source — the most complete, most reliable, and most efficient way to keep our database current.
We don't scrape SAM.gov. We don't reverse-engineer any private endpoints. We download the same CSV file that SAM.gov makes available to anyone. The download doesn't require an API key and doesn't count against any rate limits, because it's a published data extract — this is exactly how GSA intends the data to be consumed at scale.
Our ingestion pipeline parses the CSV (handling encoding quirks like Windows-1252 characters), maps the columns to our database schema, and performs a batch upsert — inserting new opportunities and updating existing ones if anything has changed. The whole process handles roughly 80,000–100,000 records in a matter of minutes.
We also use conditional HTTP requests (If-Modified-Since and ETag headers) so that if the CSV hasn't been updated since our last download, we skip the download entirely. No wasted bandwidth, no unnecessary database writes.
API for Enrichment and Gap-Filling
The CSV gives us descriptions for every opportunity, but they're plain text — stripped of all the formatting that contracting officers put into them. The API's description endpoint returns rich HTML, which is what you see when you view an opportunity on SAM.gov directly: structured sections, bullet points, tables, and links.
We use our API allocation strategically, fetching rich HTML descriptions for opportunities that are most likely to benefit from the formatting — like active solicitations with detailed requirements — rather than trying to pull formatted descriptions for every single record.
Our pipeline also cross-references the CSV and API data to identify any opportunities that appear in one source but not the other. In practice, the CSV and API are highly consistent, but the cross-reference gives us confidence that we're not missing anything and lets us track data quality over time.
Better Search Built on the Same Data
Once the data is in our database, the search experience is where GovTrove really diverges from SAM.gov.
We use PostgreSQL's full-text search with weighted vectors — so a match in the title ranks higher than a match in the description, which ranks higher than a match in the agency name. Because the CSV gives us description text for every opportunity, our search index covers the full content of each notice, not just titles and metadata.
We support boolean operators (AND, OR, NOT) and phrase matching, meaning you can search for "cybersecurity" OR "information security" and get both sets of results in a single query. SAM.gov's search doesn't support this.
Our filters are built from the actual data. When you filter by set-aside type, you see only the set-aside codes that exist in the current dataset, with counts showing how many opportunities match each one. Same for notice types, states, and NAICS codes. This eliminates the "zero results" problem where you select a filter combination and get nothing back with no indication of why.
Every opportunity in GovTrove links directly back to its SAM.gov page. We're not trying to replace SAM.gov — it's the authoritative source, and when you're ready to download attachments, read the full solicitation package, or submit a response, that's where you need to go. We're trying to make the finding part faster and less painful.
Why This Matters for Small Businesses
If you're a small business pursuing federal contracts, your time is your scarcest resource. You probably don't have a dedicated BD team refreshing SAM.gov searches all day. You need to quickly identify relevant opportunities, assess whether they're worth pursuing, and move on.
SAM.gov's data is comprehensive and authoritative — it has to be, because federal agencies are legally required to post opportunities there. The problem has never been the data itself. It's the interface sitting on top of it.
That's the gap GovTrove fills. Same official data, updated daily from SAM.gov's own published data services, presented through search and filtering that's designed specifically for how contractors actually screen opportunities.
If you've been fighting with SAM.gov's search, give GovTrove a try. The core search is free, and everything is built on the same public data that SAM.gov publishes for exactly this purpose.
GovTrove is powered by official SAM.gov public data, updated daily. We are not affiliated with or endorsed by SAM.gov or the General Services Administration.
← Back to BlogSearch federal contracts the way you actually work
Boolean search, smart filters, and deadline tracking — built on official SAM.gov data.
Start Searching