SBA small-business profile (DSBS)
The SBA Dynamic Small Business Search (DSBS) profile for one firm, keyed by its SAM UEI. DSBS is the small-business layer that sits next to the SAM registry, and it answers two questions SAM alone cannot. Which NAICS codes is this firm officially small for under SBA's size standards, and which set-aside programs (8(a), WOSB, EDWOSB, HUBZone, SDVOSB, VOSB) does it hold as a verified SBA registration with entrance and exit dates. The profile also carries the firm's own capability narrative, keywords and firmographic detail.
The endpoint is Pro (see Plans and limits). A Pro caller already fetching the SAM entity or
the company profile for a UEI gets this same object inline as an sba_profile block, so a second call is
often unnecessary.
One call, with the response trimmed here to the certification block:
curl -H "Authorization: Bearer YOUR_PRO_KEY" \
"https://govconapi.com/api/v1/dsbs/ZKFXGZTCEHJ4"
{
"uei": "ZKFXGZTCEHJ4",
"certifications": [
{"name": "8(a)", "active": true, "entrance_date": "2024-08-16", "exit_date": "2033-08-16", "status": "Active"}
]
}
This firm holds one SBA-registered certification, 8(a), reading status Active with an exit_date of
2033-08-16, which is the pair of fields an eligibility screen has to read together.
Endpoints
GET /api/v1/dsbs/{uei}, the SBA DSBS small-business profile for one UEI (Pro)
A 404 here is an answer, not a lookup failure
DSBS is small-business opt-in. A firm chooses to build a profile, and large primes never do. About half
of the SAM-registered directory has one and the other half does not, which is structural rather than a gap
in coverage. Check /api/v1/status for the current profile count and freshness.
So a 404 here means the firm never opted in, or is not a small business. The same UEI resolves normally on
the SAM entity and award endpoints. Do not retry it, do not treat it as a broken integration, and do not
report it to a user as "firm not found": report it as "no SBA small-business profile on file".
No firm name and no firm size in the response
The response identifies the firm by UEI and nothing else. There is no legal-business-name field on this
object, on any record. When you need something to display, join /api/v1/entities/{uei}
for entity.legal_business_name, or /api/v1/companies/{uei} for its top-level
name, which also returns this profile inline. firmographics.dba_name is the only name-shaped field here:
it is a trade name rather than the legal name, and most profiles leave it null.
No firm size either, and that is a boundary, not an omission. DSBS publishes neither employee count nor annual revenue, so this endpoint carries neither, on any record. It tells you what a firm is registered and eligible for, not how big it is. If you need scale, read the award history on the contracts and companies endpoints instead.
Read status and exit_date, never active alone
certifications and self_certifications are two separate keys and they never merge. certifications are
SBA-registered programs, verified by SBA and dated. self_certifications are labels the firm asserts about
itself (Minority-Owned Business, Self-Certified Small Disadvantaged Business, Limited Liability Company and
similar), which SBA does not verify. Treating a self-certification as a registered set-aside is the
expensive mistake here: it is the firm's own claim, not an SBA determination.
Within certifications, status is the field to gate on, and active is not a synonym for it. status
runs Active, Pending, Expired and Suspended. SBA sets active to true on both Active and
Pending rows, so a certification the firm has applied for but not yet been granted arrives with
"active": true, "status": "Pending" and a null exit_date. That is SBA's own flag, passed through as
published. A screen keyed on active will treat a pending application as a live set-aside.
Expired and Suspended rows both carry "active": false, so the reverse direction is safe, but a firm
can hold one Active certification and one Expired certification at the same time. Read the array, match
on name, then check status and exit_date against the date your eligibility question is about.
status alone is not the whole gate. SBA publishes the label and the dates as independent fields and we
pass both through exactly as published, so on a small number of rows they disagree: a few Active rows
carry an exit_date that has already passed, and a few Expired rows carry one still in the future. Read
the two together rather than trusting either on its own.
The NAICS arrays answer four different questions
The small_business block holds four fields that look interchangeable and are not.
naics_small_codes is SBA's determination: the NAICS the firm is small for, measured against SBA's
published size standard for each code. This is the authoritative answer to "is this firm small for NAICS X",
which is the question a set-aside actually turns on, and it is the field behind ?naics_small=. The two
search endpoints use that parameter differently. On entity search it filters the whole
directory and stands on its own. On company search it narrows an already name-matched
set, so pair it with q=; sent alone there it returns a 400 asking for q.
The SAM registry carries a different thing, a per-NAICS suffix on its own naics_codes array, maintained in
the firm's SAM registration, which takes Y, N, E or blank (["541330E", "541715E"]). The two sources
nearly always agree; the disagreements are the interesting records, where a firm has grown past a size
standard in one code while staying small in others.
naics_all_codes is every NAICS the firm lists, small or not, so it is a superset. For most firms the two
arrays are identical, and the difference, where there is one, is exactly the set of codes the firm works in
but is not small for.
naics_primary is the firm's primary NAICS and it is not guaranteed to appear in naics_small_codes. A
small fraction of firms name a primary code they are not small for. Do not infer eligibility from it.
naics_exception_codes is a passthrough artefact and needs handling. SBA publishes size-standard exceptions
with its own encoding, a 6-digit NAICS followed by a flag string of zero to four Y/N/E characters, so
the values arrive as 541330YYYY, 541519YY, 237990EE and sometimes as a bare 237990 with no suffix at
all. We pass SBA's values through exactly as published. An equality join against a 6-digit NAICS will miss
every suffixed value: take the leading six characters if you need to match, and do not feed these values to
?naics_small=.
Parameters
| Parameter | Type | Description |
|---|---|---|
uei |
string | Path segment, required. The 12-character alphanumeric SAM UEI. Case-insensitive, lower-case is upper-cased for you. Anything else returns 400. |
This endpoint accepts no query parameters at all, including fields=. Any query string returns a 400
naming the parameter you sent.
Ordering
This endpoint does not accept sort_by or sort_order. It returns a single record, and the arrays inside
it (naics_small_codes, naics_all_codes, certifications, self_certifications, keywords,
qas_standards) are returned in the order SBA publishes them. Sort them yourself if you need a stable
display order.
Pagination
There is none. This is a lookup by primary key returning one flat object with no envelope and no
pagination block. To work through many firms, iterate UEIs from
entity search or company search and call this route per UEI, within
the burst caps noted under Errors.
Those caps are the throughput boundary of this endpoint, and they are deliberate. At 20 requests a minute
from one IP, walking every UEI that has a profile takes weeks of continuous calling, so this route is built
for interactive and per-firm lookups rather than for mirroring the enriched layer. To work at directory
scale, do the selecting on entity search with ?naics_small=, which filters the whole
directory in one query, and fetch profiles only for the firms that survive it.
Response
A real response, complete and untrimmed:
{
"in_dsbs": true,
"uei": "ZKFXGZTCEHJ4",
"last_update_date": "2026-08-28",
"public_display": true,
"small_business": {
"naics_small_codes": ["541330", "541511", "541512", "541519", "541715", "541990", "611420", "611430", "611710"],
"naics_all_codes": ["541330", "541511", "541512", "541519", "541715", "541990", "611420", "611430", "611710"],
"naics_primary": "541519",
"naics_exception_codes": ["541330YYYY", "541519YY", "541715YYYY"]
},
"certifications": [
{"name": "8(a)", "active": true, "entrance_date": "2024-08-16", "exit_date": "2033-08-16", "status": "Active"}
],
"self_certifications": [
"For Profit Organization",
"Alaskan Native Corporation Firm",
"Limited Liability Company",
"Native American Owned",
"Minority-Owned Business",
"Self-Certified Small Disadvantaged Business"
],
"capabilities": {
"narrative": null,
"keywords": []
},
"firmographics": {
"cage_code": "9HU44",
"year_established": "2022",
"legal_structure": "2L",
"congressional_district": "05",
"dba_name": null,
"current_principals": null,
"contact_person": "BRETT BARKMAN",
"email": "[email protected]",
"website": "www.tyonek.com",
"additional_website": null,
"non_fed_govt_certifications": null,
"qas_standards": [],
"special_equip_material": null,
"city": "MADISON",
"state": "Alabama"
},
"source": "SBA Dynamic Small Business Search (DSBS)",
"note": "certifications are SBA-registered (verified, with entrance/exit dates); self_certifications are self-asserted by the firm and not verified by SBA. DSBS is small-business opt-in data (no large primes) and does not carry firm size."
}
That record leaves the whole capabilities half empty, which is the common case: most profiles carry no
narrative, no keywords and no quality standards, and dba_name, current_principals,
additional_website, non_fed_govt_certifications and special_equip_material are null on most of them
too. Here is a second real profile, with self_certifications, capabilities and firmographics untrimmed,
so you can see the populated shape before you build against it:
curl -H "Authorization: Bearer YOUR_PRO_KEY" \
"https://govconapi.com/api/v1/dsbs/FLELBCAXKRB3"
{
"uei": "FLELBCAXKRB3",
"self_certifications": ["For Profit Organization", "Manufacturer of Goods", "Subchapter S Corporation"],
"capabilities": {
"narrative": "CONTRACT MANUFACTURING, QUALITY SYSTEM ISO9002,AS9000, SPECIALIZE IN WIRING HARNESSES, CABLE ASSEMBLY,ELECTROMECHANICAL TEST EQUIPMENT,J-STD-001 SOLDERING,PANEL ASSEMBLY, MACHINING, SHEET METAL FABRICATION.",
"keywords": ["AIRCRAFT TESTERS", "CONTROL PANEL", "WIRE HARNESS"]
},
"firmographics": {
"cage_code": "25039",
"year_established": "1956",
"legal_structure": "2L",
"congressional_district": "07",
"dba_name": "NOEL SMYSER ENGINEERING CORP",
"current_principals": "JOHN NOEL - OWNER; JEFF NOEL - PRESIDENT",
"contact_person": "JOHN NOEL",
"email": "[email protected]",
"website": "www.noel-smyser.com",
"additional_website": "http://www.noel-smyser.com",
"non_fed_govt_certifications": "AS9100; ISO9002; MIL-I-45208",
"qas_standards": ["ANSI/ASQC Z1.4", "ISO-9000 Series", "MIL-STD-45662A"],
"special_equip_material": "CNC MILL, CNC LATHE, CNC SHEETMETAL PUNCHING. PNEUMATIC CRIMP EQUIPMENT,WIRE PROCESSING EQUIPMENT, POTTING FACILITIES, HEAT SHRINK EQUIPMENT.",
"city": "INDIANAPOLIS",
"state": "Indiana"
}
}
Every capabilities and firmographics field here carries a value, and every one of them is the firm's own
typing, passed through as published: narrative and special_equip_material are upper-cased free text with
the source's own spacing (ISO9002,AS9000), qas_standards is a list of standard names while
non_fed_govt_certifications beside it is free text carrying an overlapping claim in a different spelling
(ISO9002 against ISO-9000 Series). Normalise on your side, and do not assume either field's formatting.
| Field | Type | Meaning | Source |
|---|---|---|---|
in_dsbs |
boolean | true on every record this route returns. It exists because the entity and company detail routes embed this same object as an sba_profile block, where {"in_dsbs": false} reports a firm with no profile. |
Derived |
uei |
string | The 12-character SAM UEI, upper-cased. Joins uei_sam on the entity endpoints. |
SBA DSBS |
last_update_date |
date or null | The day the firm last updated its DSBS profile, derived from the epoch timestamp SBA publishes. | Derived |
public_display |
boolean | The firm's DSBS public-display preference. SBA publishes only profiles the firm has made public, so every record carries true. |
SBA DSBS |
small_business |
object | The eligibility block. Its four fields follow. | SBA DSBS |
small_business.naics_small_codes |
array | 6-digit NAICS the firm is SBA-small for, against SBA's published size standard per code. Backs ?naics_small=, which filters the whole directory on entity search and narrows a q=-matched set on company search. Empty array when SBA has no determination on file. |
SBA DSBS |
small_business.naics_all_codes |
array | Every 6-digit NAICS the firm lists in DSBS, small or not. A superset of naics_small_codes. |
SBA DSBS |
small_business.naics_primary |
string or null | The firm's primary NAICS. Not guaranteed to be one it is small for. | SBA DSBS |
small_business.naics_exception_codes |
array | SBA size-standard exceptions in SBA's own encoding, a 6-digit NAICS plus a flag string of zero to four Y/N/E characters (541330YYYY, and sometimes a bare 237990). Passed through as published. Empty array when the firm has none. |
SBA DSBS |
certifications |
array of objects | SBA-registered, verified set-aside programs. Empty array for most firms, because most DSBS registrants hold no SBA certification. Member fields follow. | SBA DSBS |
certifications[].name |
string | The program: 8(a), 8(a) JV, HUBZone, SDVOSB, VOSB, WOSB or EDWOSB. |
SBA DSBS |
certifications[].active |
boolean | SBA's own flag. true on both Active and Pending rows, so it is not an eligibility test on its own. |
SBA DSBS |
certifications[].entrance_date |
date or null | The day the certification began, or the day the application was filed on a Pending row. |
SBA DSBS |
certifications[].exit_date |
date or null | The day the certification ends or ended. null while the row is Pending. |
SBA DSBS |
certifications[].status |
string | Active, Pending, Expired or Suspended. Gate on it together with exit_date, never on either alone: the label and the dates are published independently and disagree on a small number of rows, as the trap section above describes. |
SBA DSBS |
self_certifications |
array | Labels the firm asserts about itself, mixing ownership claims (Minority-Owned Business, Native American Owned) with legal form (Limited Liability Company). Not SBA-verified, and never merged into certifications. Empty array when the firm listed none. |
SBA DSBS |
capabilities |
object | The firm's own description of what it does. Its two fields follow. | SBA DSBS |
capabilities.narrative |
string or null | Free-text capability statement, sometimes several paragraphs. null on most profiles, because most firms leave it blank. |
SBA DSBS |
capabilities.keywords |
array | Capability keywords the firm supplied. Empty array on most profiles. | SBA DSBS |
firmographics |
object | Descriptive detail. Any field inside may be null or an empty array. Its fields follow. |
SBA DSBS |
firmographics.cage_code |
string or null | The firm's CAGE code. | SBA DSBS |
firmographics.year_established |
string or null | Year the firm was established, as a string. | SBA DSBS |
firmographics.legal_structure |
string or null | The raw DSBS entity-structure code (2L, 2J, 2K, ZZ and similar), passed through with no decode table. SBA publishes no key for it, and self_certifications does not supply one: both samples above read 2L, and one self-certifies as a Limited Liability Company while the other self-certifies as a Subchapter S Corporation. Treat it as an opaque source identifier. |
SBA DSBS |
firmographics.congressional_district |
string or null | The firm's congressional district, zero-padded (05). |
SBA DSBS |
firmographics.dba_name |
string or null | Doing-business-as name, and the only name-shaped field on the object. It is a trade name, not the legal business name, and it is null on most profiles. For a legal name, join the entity or company endpoints as the boundary section above describes. |
SBA DSBS |
firmographics.current_principals |
string or null | Named principals and titles, free text. | SBA DSBS |
firmographics.contact_person |
string or null | The DSBS-listed contact name. | SBA DSBS |
firmographics.email |
string or null | The DSBS-listed contact email. | SBA DSBS |
firmographics.website |
string or null | The firm's URL as it typed it, so scheme-less values (www.example.com) occur. |
SBA DSBS |
firmographics.additional_website |
string or null | A second URL the firm listed. | SBA DSBS |
firmographics.non_fed_govt_certifications |
string or null | Non-federal certifications the firm lists (state SDB, ISO and similar), free text in the firm's own formatting. | SBA DSBS |
firmographics.qas_standards |
array | Quality-assurance standards the firm claims (ISO-9000 Series, MIL-Q-9858). Empty array on most profiles. |
SBA DSBS |
firmographics.special_equip_material |
string or null | Free-text description of special equipment or materials. | SBA DSBS |
firmographics.city |
string or null | The firm's DSBS-listed city, upper-cased at source. | SBA DSBS |
firmographics.state |
string or null | The firm's DSBS-listed state, spelled out (Alabama), not the two-letter code. |
SBA DSBS |
source |
string | Constant attribution, SBA Dynamic Small Business Search (DSBS). |
Derived |
note |
string | The verified-versus-self-asserted and no-firm-size boundaries, restated inline so a consumer reading a single record sees them without leaving the response. | Derived |
The response is a flat object with no envelope, because this is a single-record lookup by primary key. Its
attribution is the source field above. When you reach the same record through the sba_profile block on
an entity or company lookup, that response's _sources array carries sba_dsbs; the array itself is
documented under Response sources.
Errors
| Code | Trigger |
|---|---|
400 |
The UEI is not 12 alphanumeric characters. Body: {"detail": "uei must be a 12-character alphanumeric SAM UEI."} |
400 |
The path carries a NUL byte or another character the CDN will not forward. The CDN answers before the request reaches the API, so this one returns an HTML error page rather than a JSON detail. Check the content type before parsing a 400. |
400 |
Any query parameter was sent, including fields. The body names the parameters it rejected. |
402 |
The key is not Pro. DSBS enrichment is a Pro capability, and the response is an upgrade link rather than a partial or empty block. |
404 |
A well-formed UEI with no DSBS profile. Expected on about half of SAM UEIs, and on every large prime. See the coverage section above before treating it as a failure. |
429 |
This endpoint adds its own per-minute burst caps on top of your plan's hourly limit, 20 requests a minute from one IP and 30 a minute on one key, which keeps bulk enumeration of the enriched layer impractical while leaving interactive lookups comfortable. |
Shared codes and the rate-limit response headers are documented once, under Error codes and Performance.
Examples
A lapsed set-aside. The fields the interpreting sentence reads:
curl -H "Authorization: Bearer YOUR_PRO_KEY" \
"https://govconapi.com/api/v1/dsbs/L8GHFAS7N2M1"
{
"uei": "L8GHFAS7N2M1",
"certifications": [
{"name": "WOSB", "active": false, "entrance_date": "2022-02-07", "exit_date": "2025-09-15", "status": "Expired"},
{"name": "EDWOSB", "active": false, "entrance_date": "2022-02-07", "exit_date": "2025-09-15", "status": "Expired"}
]
}
This firm held WOSB and EDWOSB from 2022-02-07 and both lapsed on 2025-09-15. It still appears in DSBS and
still shows the certification history, so a screen that only asked "does this firm have a WOSB record" would
pass it. status is Expired and exit_date is in the past: it is not eligible for a WOSB set-aside today.
The response carries no name, so resolve one from the entity or company endpoint if you need to show it.
A pending application, which active reports as true. The certifications block only:
curl -H "Authorization: Bearer YOUR_PRO_KEY" \
"https://govconapi.com/api/v1/dsbs/GK95S9J1RC19"
{
"uei": "GK95S9J1RC19",
"certifications": [
{"name": "WOSB", "active": true, "entrance_date": "2026-03-26", "exit_date": null, "status": "Pending"},
{"name": "EDWOSB", "active": true, "entrance_date": "2026-03-26", "exit_date": null, "status": "Pending"}
]
}
This firm filed on 2026-03-26 and SBA has not granted the certification: status is
Pending and exit_date is null because there is no window yet. Both rows carry "active": true, which
is SBA's flag as published. This is the record shape that makes active unsafe as an eligibility test, and
the pair to watch for in any set-aside screen.
Small for one NAICS out of three. The eligibility block only:
curl -H "Authorization: Bearer YOUR_PRO_KEY" \
"https://govconapi.com/api/v1/dsbs/LG19MLLKDLY8"
{
"uei": "LG19MLLKDLY8",
"small_business": {
"naics_small_codes": ["333415"],
"naics_all_codes": ["238210", "238220", "333415"],
"naics_primary": "238220",
"naics_exception_codes": []
},
"certifications": []
}
This firm lists three NAICS and is SBA-small in exactly one of them, 333415. Its primary code,
238220, is one of the two it is not small for, so a filter built on naics_primary would have counted it
as small for 238220. naics_small_codes is the field that answers the set-aside question, and here it
answers it differently from every other field in the block.
A UEI with no profile.
curl -H "Authorization: Bearer YOUR_PRO_KEY" \
"https://govconapi.com/api/v1/dsbs/H11HD5VHGHN3"
{
"detail": "No SBA DSBS profile for UEI H11HD5VHGHN3. DSBS is small-business opt-in data, so ~half of SAM-registered entities (and no large primes) have no profile."
}
A 404 with the UEI echoed back. The firm exists in SAM and returns normally from the entity and award
endpoints. It simply never built a DSBS profile, which is the expected outcome for a large prime and for
roughly half the directory. Branch on the 404 and carry on, rather than retrying it.
Related
- Company profile, the SAM registration plus award profile for a UEI. A Pro caller
gets this same DSBS object inline as an
sba_profileblock, so use it instead of two calls when you also want award history. - Single entity by UEI, the SAM registration record, which also carries the
sba_profileblock for a Pro caller. Go there when the DSBS404needs confirming against SAM. - Search entities, where
?naics_small=filters the whole SAM directory on thenaics_small_codesfield documented above. That is the directory-scale companion to this single-firm lookup: find the firms first, then read their profiles here. - Data freshness, for the current DSBS profile count, the monthly refresh cadence and the as-of date.