880K SAM-registered firms, filtered by NAICS, state, certification, active-status, and SBA's authoritative small-for-NAICS determination. JSON, paginated, ready to integrate.
SBA's Dynamic Small Business Search (DSBS) is a useful tool with a serious limitation: it's a web UI, not an API. There's no way to programmatically request "all active CA-based WOSB firms in NAICS 541330" without scraping or copy-pasting. This endpoint exposes the same kind of filtering directly as JSON. Pass the filters you want as query parameters, get back paginated results, integrate into whatever you're building.
Who this page is for: developers building procurement tools, BD/sales platforms, RFP-matching systems, market research dashboards, or any product that needs to identify federal contractors by business attributes. Compliance teams building automated supplier discovery workflows.
Two layers of "small business", kept distinct: SAM's business_type codes are mostly self-attested. For the SBA-determined view you no longer need a second system: naics_small is SBA's authoritative small-for-NAICS determination, and the per-firm sba_profile block (on /companies/{uei} and /entities/{uei}) carries SBA-registered certifications with their entry and exit dates. We always label which is which, so a self-cert flag is never presented as an SBA determination. Details in data caveats.
Six filter parameters, combinable. At least one must be provided.
q=<name>: case-insensitive name substring (2-100 chars). Trigram-indexed for fuzzy matches. Available on Developer tier; everything below requires Pro.naics=<code>: 6-digit NAICS code (no Y/N suffix). Matches both the entity's primary NAICS and any of its claimed secondary NAICS (SAM's self-reported view of who works in the code).naics_small=<code>: SBA's authoritative determination of which firms are small for a 6-digit NAICS (sourced from SBA DSBS), distinct from SAM's self-reported flag above. This is the "who's eligible for the small-business set-aside" filter. It matches the ~604K small-business registrants in DSBS; large primes are not in this set by design.state=<XX>: 2-letter US state code. Matches the entity's registered physical state.business_type=<code>: 2-3 char SAM business-type code (e.g. 8W WOSB, QF SDVOSB, 27 Self-Cert SDB, A8 Non-Profit). 76 valid codes; unknown codes return 400.active_only=true: restrict to currently-active SAM registrations.Pagination via limit (1-100, default 20) and offset (≥0, default 0). The response includes pagination.total for the full match count.
Real queries, real result counts (sourced from a recent prod sweep).
GET /api/v1/entities/search?state=CA&business_type=8W&active_only=true
~10,172 firms
GET /api/v1/entities/search?naics_small=541512
~52,711 firms small for 541512
GET /api/v1/entities/search?naics_small=561720&state=TX
~3,996 firms
GET /api/v1/entities/search?naics=541330&active_only=true
~44,817 firms
GET /api/v1/entities/search?state=TX&business_type=QF&active_only=true
~5,093 firms
GET /api/v1/entities/search?state=NJ&business_type=8E&active_only=true
~59 firms
GET /api/v1/entities/search?state=MD&business_type=27&active_only=true
~10,400 firms; paginate via limit + offset
GET /api/v1/entities/search?q=BOEING&limit=5
Returns matches like BELL BOEING JOINT PROJECT OFFICE alongside the Boeing parent. Trigram-fuzzy, case-insensitive.
Each match is the short form (uei, legal_business_name, dba_name, registration_status, registration_expiration_date, primary_naics, business_types, business_types_labels, physical_city/state/country). Pagination metadata at the top.
{
"query": {
"q": null,
"naics": "541330",
"state": "CA",
"business_type": "8W",
"active_only": true
},
"pagination": {"limit": 20, "offset": 0, "total": 487, "has_next": true},
"results": [
{
"uei": "...",
"legal_business_name": "ACME ENGINEERING LLC",
"dba_name": null,
"registration_status": "A",
"registration_expiration_date": "2026-08-12",
"primary_naics": "541330",
"business_types": ["27", "2X", "8W", "A2", "LJ"],
"business_types_labels": [
"Self Certified Small Disadvantaged Business",
"For Profit Organization",
"Women-Owned Small Business (WOSB)",
"Woman-Owned Business",
"Limited Liability Company"
],
"physical_city": "OAKLAND",
"physical_state": "CA",
"physical_country": "USA"
},
...
]
}
For a full record (CAGE codes, full address, NAICS list, PSC, source date), call /api/v1/entities/{uei} on the UEI from each result.
/companies/{uei}) so you can prioritize firms with active federal contracts.
pagination.total field returns the exact firm count without paginating through results.
business_type codes you care about (8W, QF, 8E, 23, OY, PI, NB) and snapshot the list per quarter. Use the UEIs to chase entity-level detail when needed.
pagination.total tells you which combos have enough firms to justify a page vs being too sparse.
| SBA DSBS | SAM.gov entity search | This endpoint | |
|---|---|---|---|
| Programmatic access | Web UI only | Limited official API; requires API key approval | JSON, immediate |
| Multi-filter (NAICS × state × cert × active) | Web form, results paginated by HTML | Partial; complex parameter schema | Single GET with query params |
| SBA small-business determination (small-for-NAICS) | Web UI only | Not exposed | naics_small filter, JSON |
| SBA-registered certifications, with entry/exit dates | Yes (web) | Self-cert flags only | sba_profile block (verified, dated) |
| Total match count | Top-of-page only | Available in pagination metadata | pagination.total in response |
| Pricing | Free (web) | Free with API key approval | $39/mo Pro |
If your use case is one-off lookup of a known firm, sam.gov works fine. If you need filtered lists in your code, this endpoint trades $39/mo for the work of integrating against SAM's official API or scraping DSBS.
/api/v1/entities/{uei} (Developer; the sba_profile block is Pro): full entity record for any UEI returned in a search result./api/v1/entities/by-cage/{cage} (Developer): same lookup keyed by CAGE for legacy DoD systems./api/v1/companies/{uei} (Pro): adds award-history aggregations plus the sba_profile block (SBA small-for-NAICS, dated certifications, capabilities) to the entity profile./api/v1/entities/expiring (Pro): same filters, scoped to registrations expiring within N days./api/v1/exclusions/search?uei={uei} (Developer): debarment check on UEIs from search results./api/v1/vendor-risk/bulk (Pro): batch up to 100 UEIs from search results for risk screening.business_type codes are self-attested; the SBA-determined view lives in naics_small and the sba_profile block. The SAM business_type flags you filter on (27 Self-Cert SDB, 8W Self-Cert WOSB, QF SDVOSB, A5 Veteran-Owned) are mostly self-attested, and the true SBA-certified codes (A6=8(a), XX=HUBZone) are essentially absent from the SAM extract. For the authoritative picture, use naics_small (SBA's small-for-NAICS determination) and the per-firm sba_profile block, which carries SBA-registered certifications with entry/exit dates so you can tell a current cert from a lapsed one. Across the base, 79,290 firms carry an SBA-registered certification (24,324 WOSB, 11,306 8(a), 5,446 HUBZone). Coverage: this SBA layer spans the ~604K small-business registrants in DSBS; large primes are not in it by design.
registration_expiration_date field reflects the most recent snapshot we have. For time-sensitive decisions, verify directly with sam.gov.
/api/v1/companies/{uei} per UEI for the award aggregations.
state = null. The state filter is US-only. To find non-US registered contractors, omit the state filter and read physical_country in results.
naics filter.
The multi-filter mode (NAICS, state, business_type, active_only) is on the Pro ($39/mo). Name-only search (q=) is available on the Developer tier ($19/mo) for use cases like autocomplete and known-name lookup.
q name search, plus single-UEI and single-CAGE lookups, exclusions search, awards search, opportunities. 1,000 requests/hour./companies/{uei}, seven-signal vendor-risk screening.No annual contracts, no setup fees, monthly billing via Stripe. Cancel anytime.
Is the result list deterministic?
Yes. Sort is alphabetical by legal_business_name. Pagination via offset is stable as long as the underlying data doesn't change between calls. Polling the same query multiple times within the same data snapshot returns the same results.
Why do I get an error when I pass business_type=ZZ?
To prevent silent empty-result confusion. Unknown business-type codes return 400 with a pointer to the valid-code list. The 76 valid codes are documented in our OpenAPI spec.
Does NAICS match the entity's "primary" NAICS or any NAICS they claim?
Both. We match the entity's primary_naics field AND any matching code in their declared naics_codes[] array. The Y/N/E suffix variants (SAM's per-NAICS small-business eligibility flag) are all matched.
What's the difference between naics and naics_small?
naics matches firms that claim the code in SAM (self-reported, including SAM's own small-business Y-flag): "who works in this space." naics_small is SBA's authoritative determination of which firms are small for that code, sourced from SBA DSBS: "who's eligible for the small-business set-aside." Use naics for market coverage, naics_small for set-aside eligibility.
Can I get the awards or NAICS-spread for each search result?
Not in this response (would explode the payload size). Get UEIs from search, then call /api/v1/companies/{uei} per UEI for award aggregations. Pro covers both endpoints.
What's the rate limit for paginated bulk export?
1,000 requests/hour per API key (60/min per IP burst). At limit=100, that's 100K records/hour theoretical maximum. For larger one-time exports, contact us; we can offer flat-rate bulk dumps.
Does the search support fuzzy NAICS (e.g. "all 5413xx" engineering)?
Not currently. Pass exact 6-digit NAICS codes. If you want NAICS-prefix wildcards or hierarchical roll-ups (3-digit, 4-digit, 5-digit), let us know; it's a tractable addition if usage warrants it.