Award announcements¶
Award announcements are short paragraphs saying that an award was made, served from two sources at /api/news/award_announcements/. For field definitions, see the Award announcements Data Dictionary.
Every row names its source, so you can always tell government text from text MakeGov wrote. The dataset is updated daily.
Authentication: this endpoint requires authentication (API key or OAuth2). Unauthenticated requests receive HTTP 401.
Plans: every filter and every field is available on every plan, including Free.
Endpoints¶
GET /api/news/award_announcements/— list, with filtering, search, ordering and paginationGET /api/news/award_announcements/{uuid}/— one announcement
The detail path segment must be a valid UUID; anything else is a 404.
Two sources¶
source | What it covers | Who wrote the text |
|---|---|---|
official_release | Awards of $7.5 million or more in the Department of War's daily contracts release, from March 2026. | The Department of War. text is served as published. |
makegov_generated | New civilian IDVs of $25 million or more, and every new OTA and OT IDV, from June 2026. | MakeGov, from FPDS award data. A language model summarizes the purpose and writes the title. It is not government text. |
Each generated paragraph is written in the style of the official release, so read source rather than the wording. The figures, dates and names in a generated paragraph come from FPDS through a fixed template, and FPDS can be wrong or incomplete. Treat a generated announcement as a lead, and check the award itself before you rely on it: piids on the row works as the piid filter on IDVs, OTAs and OTIDVs.
One generated row can announce several awards when IDVs join a vehicle together, so the row carries lists of piids, award_uuids and awardees. For those rows, the $25 million test applies to the vehicle's ceiling rather than to each IDV. Orders and other child awards are not announced.
Source fields¶
source, source_name and source_url are in the default shape of every row, on both the list and the detail endpoint.
| Field | official_release | makegov_generated |
|---|---|---|
source | official_release | makegov_generated |
source_name | Department of War daily contracts release | MakeGov, generated from FPDS award data |
source_url | The release on war.gov | Always null: no page exists to link to |
A generated announcement is dropped when an official release covers the award¶
When an official release covers the same award as a generated announcement, by award link or by contract number, the generated row is removed and only the official one remains. This can happen after the generated row was published, so a stored makegov_generated uuid can later return 404. A withdrawn release covers nothing, so a generated announcement of the same award stays.
Withdrawn announcements¶
The Department of War sometimes publishes a correction saying that an award was not released, not awarded or rescinded. That announcement is marked is_withdrawn: true.
- Lists and alerts hide it by default. Add
include_withdrawn=trueto include it. - It stays retrievable by uuid at
/api/news/award_announcements/{uuid}/, with or without that parameter.
Exclude withdrawn rows from anything you count or sum, which the default does for you.
Corrections¶
A correction is not its own row. The corrected values are applied to the announcement it corrects: amount, piids and is_withdrawn show the corrected values, text stays as published, and corrections records what changed. A correction that can't be matched to one original announcement is not served.
published_date versus award_date¶
The two dates answer different questions, and each source fills them differently.
| Field | official_release | makegov_generated |
|---|---|---|
published_date | The date of the release. | The date MakeGov first announced the award. It does not move when the row is later updated. Rows from the initial backfill carry their award date. |
award_date | null. The release states dates only in its text. | The award's date; the earliest of them when a row covers several awards. |
FPDS reports awards after they are made, so a generated row's published_date is usually later than its award_date. published_date_* filters work across both sources; award_date_* filters return only generated rows.
Fields that differ by source¶
These fields come from the official release and are always null on a generated row:
componentcontracting_activitycorrectionsis_modificationsmall_businesson each awardee
is_withdrawn is also null on a generated row. obligated_at_award is not official-only: a generated row carries the FPDS figure when every award in the row has had a single action, and null otherwise.
In the other direction, announcement_type is set only on generated rows, and civilian is false on every official row. A generated row can be civilian: false too, because every new DoD OTA and OT IDV is announced.
Because they are null, a filter on these fields narrows the result to one source: component, small_business and is_modification return only official rows, and announcement_type returns only generated rows. For new awards across both sources, use action_type=new_award.
Filtering¶
Multi-value filters accept | (or the word OR) for OR. Date filters require YYYY-MM-DD; invalid dates or inverted ranges return 400 (see Date filters).
| Param | What it does |
|---|---|
search | Full-text search over the title and text. A match in the title ranks above a match in the text. Wrap a value in double quotes for a phrase. Min 2 characters. |
source | official_release or makegov_generated. Any other value returns 400. |
agency | The awarding organization, by name, abbreviation, code or organization key, e.g. Navy. A department includes its sub-agencies. Multi-value: use \| for OR. See Agency search. |
component | The DoD component heading the official release, e.g. NAVY. Case-insensitive exact match. Multi-value: use \| for OR, up to 500 values. Official rows only. |
published_date_after, published_date_before | Published-date range (YYYY-MM-DD). |
award_date_after, award_date_before | Award-date range (YYYY-MM-DD). Generated rows only. |
amount_min, amount_max | Range on amount, in US dollars. Read value_kind alongside it: see Amounts. |
piid | A contract number named in the announcement, e.g. N00019-25-C-0070 or N0001925C0070. Dashes and case are ignored. Multi-value: use \| for OR. A value with no letter or digit returns 400. |
awardee | Case-insensitive substring match on awardee names, not locations. At least 3 characters; shorter returns 400. |
uei | An exact awardee UEI. Official releases print no UEI, so this matches an official row only where one was resolved. |
action_type | new_award, modification, option_exercise, order or unknown. Exact match. Multi-value: use \| for OR, up to 500 values. |
announcement_type | new_vehicle, on_ramp, single_award, vehicle_pending, ota or ot_idv. Exact match. Multi-value: use \| for OR, up to 500 values. Generated rows only. |
civilian | Boolean. Announces a civilian award. |
small_business | Boolean. true keeps announcements with at least one small-business awardee. false keeps those whose awardees are stated not to be small. Generated rows state neither, so they match neither value. |
is_modification | Boolean. Announces a modification to an existing contract. Official rows only. |
is_multiple_award | Boolean. On an official row, the announcement names more than one awardee. On a generated row, true means a multiple-award vehicle, which can name a single awardee. |
include_withdrawn | Boolean. true includes withdrawn announcements. See Withdrawn announcements. |
An unrecognized query parameter on the list endpoint returns 400 rather than being silently ignored, so a mistyped filter never returns a full, unfiltered page.
Amounts¶
amount is the announcement's headline dollar figure, and value_kind says what it measures. It is null when the announcement states none.
Amounts are not comparable across kinds: a ceiling is an upper bound, a combined_ceiling is shared by every awardee in a pool, and a modification_value is a change rather than a total. Sum or rank amount only within one value_kind. The kinds are listed in the data dictionary.
Ordering¶
ordering= allowlist:
published_date— the default is-published_date(newest first)amountrank— relevance; requires a non-emptysearch, and is the implicit default under one
-amount and -published_date put rows without a value last. Results are tie-broken deterministically, so paging through a large result set never repeats or skips an announcement.
Pagination¶
Standard page-number pagination:
page(default 1)limit(default 10, max 100)
Responses carry count / next / previous / results.
Shaping¶
See Response shaping for the syntax.
- List default:
uuid,source,source_name,source_url,published_date,award_date,title,amount,value_kind,action_type,announcement_type,awardee_count,piids,is_modification,is_multiple_award,is_withdrawn,awardees(*) - Detail default: the list fields plus
source_record_id,text,obligated_at_award,award_kind,award_uuids,civilian,component,contracting_activity,corrections,organization(*)
Lists leave out text because a single paragraph can run past 16,000 characters. Name it in ?shape= to get it; every field is available on both the list and the detail endpoint.
Expansions¶
awardees(...)—name,uei,location,small_businessorganization(...)—organization_id,office_code,office_name,agency_code,agency_name,department_code,department_name
Alerts¶
award_announcement is an alertable query type, delivered as alerts.award_announcement.match and using the same filters documented above. See the webhooks guide.
An alert fires when a matching announcement first appears and when one changes, so expect a second alert when a correction is applied or when an official announcement's award links fill in. Withdrawn announcements do not match unless the alert sets include_withdrawn to true. A generated row being dropped in favor of an official release does not fire on the generated row, though the official row can match on its own.
To receive only government text, include "source": "official_release" in the alert's filters.
Examples¶
# Official announcements of $100 million or more
GET /api/news/award_announcements/?source=official_release&amount_min=100000000
# Everything the Navy has announced since September
GET /api/news/award_announcements/?agency=Navy&published_date_after=2026-09-01
# New OTAs and OT IDVs written by MakeGov
GET /api/news/award_announcements/?source=makegov_generated&announcement_type=ota|ot_idv
# New awards from both sources
GET /api/news/award_announcements/?action_type=new_award
# Announcements naming one contract number
GET /api/news/award_announcements/?piid=N00019-25-C-0070
# Announcements naming an awardee
GET /api/news/award_announcements/?awardee=example%20systems
# A phrase, ranked by relevance
GET /api/news/award_announcements/?search=%22hypersonic%22
# Include withdrawn announcements
GET /api/news/award_announcements/?source=official_release&include_withdrawn=true
# A lean list payload with the text and awardee names
GET /api/news/award_announcements/?shape=uuid,source,published_date,title,text,awardees(name)
# Detail, with every default field
GET /api/news/award_announcements/{uuid}/
Notes:
*is only valid inside expansions, such asawardees(*).- Invalid
shapefields return HTTP 400 with structured validation errors.