The federal contracting data layer

Federal Contractor Search API

880K SAM-registered firms, filtered by NAICS, state, certification, active-status, and SBA's authoritative small-for-NAICS determination. JSON, paginated, ready to integrate.

Just want to search? Use the free web lookup: same filters, no signup, no verification loop. This page covers the API endpoint for building it into your own tools.

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.

On this page:

What you can filter on

Six filter parameters, combinable. At least one must be provided.

Pagination via limit (1-100, default 20) and offset (≥0, default 0). The response includes pagination.total for the full match count.

Worked examples

Real queries, real result counts (sourced from a recent prod sweep).

All active California-registered WOSB firms.
GET /api/v1/entities/search?state=CA&business_type=8W&active_only=true
~10,172 firms
Firms SBA-small for IT services (NAICS 541512): the authoritative set-aside-eligible population.
GET /api/v1/entities/search?naics_small=541512
~52,711 firms small for 541512
Small-for-NAICS narrowed by state: janitorial (561720) firms in Texas.
GET /api/v1/entities/search?naics_small=561720&state=TX
~3,996 firms
Active firms in NAICS 541330 (Engineering Services), nationwide.
GET /api/v1/entities/search?naics=541330&active_only=true
~44,817 firms
Active SDVOSB firms in Texas.
GET /api/v1/entities/search?state=TX&business_type=QF&active_only=true
~5,093 firms
Rare combo: Active EDWOSB firms in New Jersey.
GET /api/v1/entities/search?state=NJ&business_type=8E&active_only=true
~59 firms
Self-cert Small Disadvantaged Business firms in Maryland (no NAICS filter).
GET /api/v1/entities/search?state=MD&business_type=27&active_only=true
~10,400 firms; paginate via limit + offset
Name-only search (Developer tier, no filters needed).
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.

Response shape

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.

Use cases this enables

Set-aside competition mapping. Before responding to an 8(a) or WOSB set-aside RFP, you want to know how many qualified firms exist. NAICS + state + cert filter gives you the population. From there you can estimate competitive density (top 20% vs long tail) and decide whether bidding is worth the proposal effort.
Prime contractor sourcing for subcontract work. You're a small firm hunting for primes to team with. Filter by NAICS + state + active. Each match links via UEI to award history (/companies/{uei}) so you can prioritize firms with active federal contracts.
Procurement market sizing. Building a B2B SaaS targeting federal contractors? Filter by NAICS to get your TAM. The pagination.total field returns the exact firm count without paginating through results.
Diversity-spend reporting feed. Your prime-contractor compliance team needs to verify subcontractor demographic certifications quarterly. Pre-filter by 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.
RFP-bid-list construction. A federal program office needs to build a Sources Sought distribution list. NAICS + state + cert + active filter produces a clean list of qualifying registered firms. Export, format, send.
Auto-generated long-tail content. Build directory pages on your own site (e.g. /naics/{code}/contractors-by-state). Each combination is a unique landing page; pagination.total tells you which combos have enough firms to justify a page vs being too sparse.

vs DSBS, vs SAM.gov search

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.

Combining with other endpoints

What this doesn't do (data caveats)

SAM's 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.
Near-real-time, not real-time. We track SAM and refresh as upstream data publishes. In rare cases there can be up to ~30 days of latency between an entity updating their record on sam.gov and the change appearing here. The registration_expiration_date field reflects the most recent snapshot we have. For time-sensitive decisions, verify directly with sam.gov.
Sort is alphabetical by legal_business_name. No "rank by award value" or "rank by recency". For award-ranked sorts, search first to get UEIs, then call /api/v1/companies/{uei} per UEI for the award aggregations.
Foreign entities have state = null. The state filter is US-only. To find non-US registered contractors, omit the state filter and read physical_country in results.
~245K of 887K entities have no NAICS data at all. Filtering by NAICS will exclude them entirely. If your use case is "every active firm in CA regardless of NAICS," omit the naics filter.

Pricing

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.

No annual contracts, no setup fees, monthly billing via Stripe. Cancel anytime.

FAQ

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.