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
| Field | Filled | Notes |
|---|---|---|
notice_id | 100% | The dedupe key. Rows are deduplicated before delivery, so a duplicate is never charged. |
solicitation_number | 99.5% | With solicitation_number_clean alongside. |
title | 100% | As published. |
notice_type, notice_type_code | 100% | o solicitation, k combined, r sources sought, a award. |
published_at, modified_at, archive_at | 100% | The lifecycle timestamps. |
is_active, is_canceled | 100% | Booleans, never null. |
modification_count, parent_notice_id | — | An 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
| Field | Filled | Notes |
|---|---|---|
agency_name | 99.4% | With agency_id, agency_code and the full agency_hierarchy. |
contact_name | 99.6% | The contracting officer. |
contact_email | 99.2% | The contact channel that actually exists. |
contact_phone | 32.7% | The weakest contact field by a wide margin. |
contacts_all | — | Every 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.

