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.
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:
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.
/companies/{uei} endpoint, you can score expiring entities by award activity to prioritize follow-ups.
?within_days=45&state=TX&naics=541330 gives Texas engineering firms with 45-day renewal windows. Cold-email or LinkedIn outreach with timely relevance.
# 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: 1-500, default 50.offset: ≥0, default 0.Error shapes:
401: missing or invalid Authorization header402: API key isn't on Pro Bundle (Developer tier doesn't include this endpoint)422: within_days outside 1-365{
"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.
/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 Bundle): scores expiring entities by award activity, useful for prioritizing follow-up./api/v1/entities/search (Pro Bundle): 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 Bundle): seven-signal risk screening for entities in your renewal pipeline./api/v1/entities/{uei} right before sending.
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.
/companies/{uei}) and exclusion-status checks for a complete picture.
This endpoint is on the Pro Bundle ($39/mo).
/companies/{uei} (entity + awards merge), multi-filter entity search, seven-signal vendor-risk screening, unlimited GovCon Contacts. 1,000 requests/hour.No annual contracts, no setup fees, monthly billing via Stripe. Cancel anytime.
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.