SAM Registration Expiration Checker API
Updated
Federal contractors expiring within N days. Sorted most-urgent first. JSON, paginated, filterable by state or NAICS.
SAM.gov registrations expire annually. Lapsed registrations make a vendor invisible to federal contracting officers, ineligible for award, and unreachable for renewals from existing primes. The official mechanism for monitoring expirations is logging into sam.gov and checking each entity by hand. This endpoint exposes the same data programmatically: pass within_days=N, get back every active registration expiring in that window, sorted by urgency.
Who this page is for: developers building compliance dashboards, renewal-reminder SaaS, prime-contractor supplier-monitoring tools, BD pipelines that need to flag at-risk leads, or B2B services targeting renewal as a buying trigger.
What this page is NOT: a renewal-submission tool. SAM renewals must be filed through sam.gov by the entity itself. This endpoint surfaces the urgency; the entity does the renewing.
What one call returns
Pass within_days (1-365). Optionally narrow by state or naics. The endpoint returns active SAM registrations whose registration_expiration_date falls between today and today + N days, sorted by urgency. Each result includes a days_until_expiration field for direct rendering.
The size of the renewal universe gives you a sense of why this is useful at scale:
- ~12,000+ firms have SAM registrations expiring in the next 7 days at any given time.
- ~47,000+ firms are in a 30-day expiration window.
- ~740,000+ firms over the full 365-day horizon (most active SAM registrants renew annually, so the bulk of the population is in this window).
Numbers fluctuate with the renewal cycle. Past-due (already-expired) registrations are excluded; their status is "E" and they fall out of this endpoint's scope.
Use cases this enables
Daily compliance dashboard.
Your prime-contractor risk team needs to flag any current subcontractor whose SAM lapses in the next 30 days. Cron-poll this endpoint daily, intersect with your subcontractor list (by UEI), surface the at-risk set in your dashboard. Lapsed sub means the prime can't pay against an active obligation in some FAR contexts.
Renewal-reminder B2B SaaS.
You sell a "we'll remind you when your SAM is about to expire" service for $10/yr per UEI. This endpoint is your daily feed: pull tomorrow's 7-day expirations, match against your customers, send the email. Filtering by state or NAICS lets you segment campaigns.
BD-pipeline early-warning.
A vendor whose SAM is about to expire is one of: (a) renewing routinely, no signal; (b) winding down, an opportunity for their replacement; (c) facing a compliance issue, an opportunity for a competitor. Combined with our /companies/{uei} endpoint, you can score expiring entities by award activity to prioritize follow-ups.
Renewal-services lead generation.
Consultants who help small businesses navigate SAM renewals can build a targeted outreach list: ?within_days=45&state=TX&naics=541330 gives Texas engineering firms with 45-day renewal windows. Cold-email or LinkedIn outreach with timely relevance.
Internal supplier-onboarding workflow.
Your procurement org runs a quarterly check on all approved suppliers. Cross-reference your supplier list against this endpoint's 90-day window. Anyone expiring soon gets a process initiation: re-confirm details, plan replacement, or fast-track a re-onboarding.
SEO-grade NAICS-cohort renewal pages.
Build directory-style content like "Engineering services contractors with SAM renewals due this month, by state". Each page is an aggregated count + spotlight of a few expiring firms.
How to call the API
The expiring registrations endpoint carries the full parameter list and response shape.
# Everyone expiring in next 30 days
curl -H "Authorization: Bearer $API_KEY" \
"https://govconapi.com/api/v1/entities/expiring?within_days=30&limit=50"
# DC-based firms expiring in next 14 days
curl -H "Authorization: Bearer $API_KEY" \
"https://govconapi.com/api/v1/entities/expiring?within_days=14&state=DC"
# NAICS 541330 (engineering) expiring in next year, paginated
curl -H "Authorization: Bearer $API_KEY" \
"https://govconapi.com/api/v1/entities/expiring?within_days=365&naics=541330&limit=100&offset=0"
Parameters:
within_days: 1-365. Required. Days from today to look ahead.state: 2-letter US state code. Optional.naics: 6-digit NAICS code (no Y/N suffix). Optional. Matches both primary NAICS and the entity's claimed NAICS list.limit: default 100, up to 1,000.offset: ≥0, default 0.
Error shapes:
401: missing or invalidAuthorizationheader402: API key isn't on Pro (Developer tier doesn't include this endpoint)422:within_daysoutside 1-365
Response shape
{
"query": {"within_days": 30, "state": "DC", "naics": null},
"pagination": {"limit": 50, "offset": 0, "total": 391, "has_next": true},
"results": [
{
"uei": "...",
"legal_business_name": "ACME CONSULTING LLC",
"dba_name": null,
"registration_status": "A",
"registration_expiration_date": "2026-05-12",
"days_until_expiration": 12,
"primary_naics": "541611",
"business_types": ["27", "2X", "8W"],
"business_types_labels": [
"Self Certified Small Disadvantaged Business",
"For Profit Organization",
"Women-Owned Small Business (WOSB)"
],
"physical_city": "WASHINGTON",
"physical_state": "DC",
"physical_country": "USA"
},
...
]
}
Sort is by days_until_expiration ascending (most urgent first). The days_until_expiration field is computed at request time, so if you cache results you'll need to recompute.
Combining with other endpoints
/api/v1/entities/{uei}(Developer): full entity record for any UEI returned in the expiring list./api/v1/entities/by-cage/{cage}(Developer): same lookup keyed by CAGE if your records are CAGE-keyed./api/v1/companies/{uei}(Pro): scores expiring entities by award activity, useful for prioritizing follow-up./api/v1/entities/search(every plan): for a current snapshot of who's currently active in a NAICS or state, regardless of expiration window./api/v1/exclusions/search?uei={uei}(Developer): confirm the firm isn't already on the exclusion list (excluded entities don't always show as expired in SAM)./api/v1/vendor-risk/{uei}(Pro): seven-signal risk screening for entities in your renewal pipeline.
What this doesn't do (data caveats)
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 a registration changing on sam.gov and the change appearing here. An entity may have already renewed (and shouldn't be in your list) but our snapshot still shows the older expiration date. For high-stakes outreach, validate by hitting the same UEI on /api/v1/entities/{uei} right before sending.
Already-expired registrations are excluded.
We only return entities with registration_status = 'A'. Once an entity expires, it transitions to status 'E' and falls out of this endpoint. To find expired entities, use /api/v1/entities/search without active_only.
NAICS filter coverage gap.
~245K of 887K registered entities have no NAICS data on file. Filtering by NAICS will exclude them. If your use case is "every expiring firm in a state regardless of NAICS," omit the naics filter.
This endpoint surfaces urgency, not intent.
A firm whose SAM is expiring may be (a) routinely renewing, (b) winding down, (c) hit by compliance issues, or (d) simply forgetful. The endpoint can't tell you which. Combine with award-history (/companies/{uei}) and exclusion-status checks for a complete picture.
Pricing
This endpoint is on the Pro ($39/mo).
- Pro ($39/mo): this endpoint plus
/companies/{uei}(entity + awards merge), the SBA profile block, seven-signal vendor-risk screening, unlimited GovCon Contacts. 1,000 requests/hour.
Row by row, the current list is the comparison table on Pricing. - Developer ($19/mo): single UEI lookup, single CAGE lookup, name search, exclusions search, awards search, opportunities. The expiration radar is not included.
No annual contracts, no setup fees, monthly billing via Stripe. Cancel anytime.
FAQ
How does days_until_expiration get computed?
Server-side: registration_expiration_date - CURRENT_DATE. The result is the integer number of days. 0 means "expires today"; 30 means "expires 30 days from now". The value is recomputed on each request, so cached responses can drift.
Can I get a "weekly digest" of expiring firms?
Not as a single API call. Build the digest yourself: poll daily with within_days=7, dedupe across days, format as digest. We're considering a webhook variant for this; reach out if your workflow needs it.
What's the maximum within_days?
365. SAM registrations are renewed annually, so the full population that could possibly need to renew within a year fits in this window. Values >365 are rejected with 422.
What about firms whose registration date passed but they re-registered as a fresh entity?
Out of scope. SAM treats a re-registration as a new entity record. The previous record stays in the dataset with status 'E'; the new one starts fresh with a new expiration. If you're tracking continuity across re-registrations, you'd need to chase by legal name + EIN + address; that's not what this endpoint does.
Why doesn't the response include POC contact info?
Phone and email contacts for SAM registrants aren't in the public dataset. Names and addresses are. If your use case needs to actually reach the entity for a renewal reminder, you'll source contacts elsewhere (LinkedIn, company website, ZoomInfo).
Can I sort by award value, NAICS, or state instead of urgency?
Not currently. Sort is fixed at days_until_expiration ascending. For multi-attribute sorting, paginate the full list and re-sort client-side.