ActorStack.dev

Every field in a SAM.gov notice, with fill rates from 13,434 notices

62 fields, snake_case, null where a value is genuinely absent and never a missing key — with coverage measured across five days spread over ten months.

By Oswaldo Carabano8 min read

Short answer

A SAM.gov notice row carries 62 fields: identity, lifecycle, deadline with its precision, NAICS and PSC classification, agency hierarchy, contacts, place of performance, award details, the full solicitation text and the attachment list. Measured on 13,434 notices, contact name is at 99.6%, solicitation number 99.5%, PSC 97.8%, NAICS 96.1%, description 84.3%, deadline 75.2%, set-aside 46.1% and contact phone 32.7%.

Key points

  • Every key is always present with `null` where a value is genuinely absent, so `row.award_amount` is safe on every row.
  • PSC is better filled than NAICS — 97.8% against 96.1% — which makes it the marginally better classification filter.
  • Contact email is at 99.2% and contact phone at 32.7%, so email is the contact channel that actually exists.
  • Award fields sit at ~23% of all notices because most notices are not awards; within award notices they are effectively always present.
  • The deadline has three fields rather than one, because 38.8% of deadlines carry no time.
On this page8 sections

Sixty-two fields per notice, snake_case, measured on 13,434 notices across five days spread over ten months. The design rule underneath all of it: every key is always present, with null where a value is genuinely absent — so row.award_amount is safe on every row and no consumer has to guard against a missing key.

How to read this reference

A percentage is the share of the 13,434-notice sample that carried a value. Nothing is listed as a field unless it was measured, and where a percentage looks low the next paragraph usually explains that the denominator is the wrong population rather than the data being poor.

Identity and lifecycle

FieldFilledNotes
notice_id100%The dedupe key. Rows are deduplicated before delivery, so a duplicate is never charged.
solicitation_number99.5%With solicitation_number_clean alongside.
title100%As published.
notice_type, notice_type_code100%o solicitation, k combined, r sources sought, a award.
published_at, modified_at, archive_at100%The lifecycle timestamps.
is_active, is_canceled100%Booleans, never null.
modification_count, parent_notice_idAn amendment is a new notice that links back to the previous one.

parent_notice_id is the field that makes the immutability model usable: a notice never changes, an amendment creates a new one, and the chain is followable. That is also why caching is safe here in a way it is not on a marketplace listing.

Deadline

Four fields: response_due_local (75.2%), response_due_utc (61.0%), response_due_precision and response_timezone.

The UTC field is lower than the local field on purpose — it is null on the 38.8% of deadlines that state no time. Why there are three of them.

Classification

psc_code at 97.8% with psc_title and psc_all; naics_code at 96.1% with naics_title and naics_all; set_aside_code at 46.1% with set_aside.

PSC being better filled than NAICS is the practical reason to prefer it as a filter — though they answer different questions. And an absent set-aside means open competition, not missing data: the codes and what they reserve.

Agency and contacts

FieldFilledNotes
agency_name99.4%With agency_id, agency_code and the full agency_hierarchy.
contact_name99.6%The contracting officer.
contact_email99.2%The contact channel that actually exists.
contact_phone32.7%The weakest contact field by a wide margin.
contacts_allEvery contact on the notice, not just the primary.
pop_state, pop_city, pop_zip~33%Place of performance. Only about a third of notices state one.

agency_hierarchy is worth using rather than parsing agency_name: the federal org tree is deep and inconsistent in its naming, and the hierarchy field is the structured version of what the name only implies.

Award fields, and the denominator problem

award_number, award_date, award_amount, awardee_name, awardee_uei, awardee_cage_code and the awardee's address all sit at about 23%.

That number describes the denominator, not the quality. Most notices are not awards — award notices are about a quarter of the index — and within award notices these fields are effectively always present. Filter on notice_type_code = "a" and the 23% becomes near 100%.

The solicitation text

description_html at 84.3%, with description_text alongside and description_modified_at recording when it last changed.

This is the field that makes keyword search useful: the notice title is often generic — “IT Support Services” — while the description contains the actual requirement. It is also the largest field in the row by a wide margin, so exclude it from exports that do not need it.

Attachments

attachments as an array, with file_count, link_count and attachments_scraped beside it. Each entry carries kind (file or link), name, size_bytes, mime_type and a stable unsigned url.

attachments_scraped is the field that keeps the other two honest: a file_count of 0 means something different when attachments were never fetched, and without the flag those two cases are indistinguishable. The measured attachment rates.

Frequently asked questions

Should I filter by NAICS or PSC?
PSC, if you have to choose: it is present on 97.8% of notices against 96.1% for NAICS. Both are well filled enough to use, and using both narrows more precisely than either alone.
Why are award fields only 23% filled?
Because most notices are not awards. Award notices are about a quarter of the index, and within them `award_amount` and `awardee_name` are effectively always present. The 23% is a property of the denominator, not of the data quality.
Is the contact phone number usable?
Rarely — it is present on 32.7% of notices. Contact email is at 99.2%, which is the channel the data actually supports.

Sources

Every URL below was requested and returned a page on the date shown.

  1. Operator claimchecked 19 Aug 2026
    SAM.gov Federal Contract Opportunities & Attachments — Actor README and input schemaActorStack / Apify Store
  2. Platform docschecked 18 Aug 2026
    Dataset storageApify
  3. Operator claimchecked 19 Aug 2026
    Contract OpportunitiesSAM.gov (U.S. General Services Administration)
A shelf of office binders with dated labels along their spines.
SAM.govExplainer

NAICS vs PSC

Two classification systems on the same notice, describing different things. One is better filled, and the difference decides which one your pipeline should key on.

6 min
The dome of the United States Capitol against a clear sky.
SAM.govGuide

Opportunity monitoring

A working monitoring pipeline: what to filter, how often to run, which deadline field to schedule against, and where the attachment rate changes your plan.

8 min
The dome of the United States Capitol against a clear sky.
SAM.govReference

Set-aside codes

SBA, 8(a), WOSB, SDVOSB, HUBZone — the codes that reserve a contract for a category of small business, present on 46.1% of notices.

7 min