GovCon API

SAM Registration Expiration Checker API

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.

On this page:

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:

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

# 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:

Error shapes:

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

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. ~243K of 873K 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 Bundle ($39/mo).

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.

Back to GovCon API · OpenAPI spec · Interactive docs