Pentagon / DoD Contract Awards API: winners, amounts, tickers
Coming soon to the StoreGet every US Department of Defense contract award of $7.5M or more, the same evening it is announced, plus the full history since FY2008: who won, how much, which service (Army, Navy, Air Force, DLA, Missile Defense Agency, ...), and the winner's US stock ticker with its SEC-reported shares outstanding. History rows add the parent company and NAICS/PSC codes. Switch the history to any other federal agency, or all of them, with one input. For defense-sector investors, government sales teams and AI agents.
Pricing (pay per event): $0.005 per award row ($5 per 1,000 awards). No start fee. You only pay for rows delivered, a row is never charged twice in one run, scheduled runs can skip awards you already received, and the Actor stops at your max charge limit.
Questions agents ask
- “Which Kratos contracts did the Pentagon award in 2019, and how large were they?”
- “Who won the largest Navy shipbuilding contracts (NAICS 336611) in 2025?”
- “Show Department of Homeland Security contracts over $10 million signed in the first half of 2026.”
Example
Input
{
"dateFrom": "2019-01-01",
"dateTo": "2019-12-31",
"tickers": ["KTOS"],
"maxResults": 1000
}Output
{
"award_id": "N0018923F3020",
"parent_award_id": "N0017819D7295",
"action_date": "2026-06-24",
"amount_usd": 37046089.24,
"action_count": 1,
"new_award": false,
"award_type": "DELIVERY ORDER",
"awarding_agency": "Department of Defense",
"awarding_sub_agency": "Department of the Navy",
"recipient_name": "CACI, INC. - FEDERAL",
"recipient_uei": "N3PBJAVNKF61",
"parent_name": "CACI INTERNATIONAL INC",
"recipient_city": "CHANTILLY",
"recipient_state": "VA",
"naics_code": "541330",
"naics_description": "ENGINEERING SERVICES",
"psc_code": "R706",
"psc_description": "SUPPORT- MANAGEMENT: LOGISTICS SUPPORT",
"description": "NAVAL FORCES LOGISTICS SUPPORT SERVICES-NFL",
"ticker": "CACI",
"matched_on": "parent",
"sec_cik": 16058,
"exchange": "NYSE",
"shares_outstanding": 22091305,
"shares_as_of": "2026-04-17",
"usaspending_url": "https://www.usaspending.gov/award/CONT_AWD_N0018923F3020_9700_N0017819D7295_9700",
"source": "usaspending",
"is_ceiling": false,
"data_lag_note": "DoD contract actions reach FPDS/USAspending up to 90 days after signing ...",
"retrieved_at": "2026-11-05T16:00:00+00:00"
}What you get
| Field | Type | Meaning |
|---|---|---|
schema_version | string | Output schema version. |
source | string | Where the row comes from: "usaspending" (obligation records, ~3 months late for DoD) or "dod_daily_list" (the Pentagon's same-evening contract list, parsed by AI with checks). The two are separate records of an award and are never summed or deduped. |
award_id | string | null | Contract PIID (USAspending 'Award ID'); for daily-list rows the contract number in the text, null when none is stated. |
parent_award_id | string | null | PIID of the parent IDV (IDIQ, BPA, GSA schedule) for task and delivery orders; null for standalone contracts. |
award_key | string | USAspending generated_internal_id: unique award key (PIID + agency + parent IDV). |
action_date | string | Signing (action) date, YYYY-MM-DD; for daily-list rows the announcement date. |
amount_usd | number | USAspending rows: obligated amount in USD, that day's actions on this award summed (modifications can be negative). Daily-list rows: the face value as stated (often with options, or a ceiling: see is_ceiling). |
is_ceiling | boolean | True when amount_usd is a ceiling, not money committed: a multiple-award contract (shared by several awardees) or an IDIQ maximum. Only daily-list rows can be true. |
action_count | integer | Number of contract actions summed into this row. |
modification_numbers | array | Modification numbers of those actions ('0' = the base award). |
new_award | boolean | True when the day includes the base award (modification 0), false for modifications only. |
award_type | string | null | DEFINITIVE CONTRACT, DELIVERY ORDER, PURCHASE ORDER or BPA CALL. |
awarding_agency | string | null | Top-tier awarding agency, e.g. Department of Defense. |
awarding_sub_agency | string | null | Awarding sub-agency, e.g. Department of the Navy, Department of the Army, Department of the Air Force, Defense Logistics Agency, Missile Defense Agency. |
recipient_name | string | null | Contractor (recipient) name as reported. |
recipient_uei | string | null | Recipient Unique Entity ID (SAM.gov). |
parent_name | string | null | Parent company name from the USAspending award record. |
parent_uei | string | null | Parent company UEI. |
recipient_city | string | null | Recipient city. |
recipient_state | string | null | Recipient state code (daily-list rows: the state as written, e.g. Virginia). |
recipient_country | string | null | Recipient country. |
performance_state | string | null | Place of performance state code. |
performance_country | string | null | Place of performance country. |
naics_code | string | null | NAICS industry code. |
naics_description | string | null | NAICS description. |
psc_code | string | null | Product and Service Code. |
psc_description | string | null | PSC description. |
description | string | null | Description of the day's largest action (max 300 characters). |
ticker | string | null | US-listed ticker (NYSE, Nasdaq, CBOE) of the recipient or its parent, by exact cleaned-name match; null when not matched. |
matched_on | string | null | Which name matched the ticker: the recipient itself or its parent company. |
sec_cik | integer | null | SEC Central Index Key of the matched company. |
sec_company_name | string | null | Company name in SEC's ticker list. |
exchange | string | null | Exchange of the ticker in SEC's list. |
shares_outstanding | integer | null | Shares outstanding from the SEC cover page (dei:EntityCommonStockSharesOutstanding), the count of the action date (latest on or before it, else the earliest). Multiply by your own price for a market cap. |
shares_as_of | string | null | Date of that share count, YYYY-MM-DD. |
usaspending_url | string | Award page on USAspending.gov. |
source_url | string | null | USAspending API record of the award; for daily-list rows the war.gov article, null when the e-mail did not link it. |
data_lag_note | string | Reporting lag of the source: DoD actions appear up to 90 days after signing. |
retrieved_at | string | UTC time the row was built. |
Coverage
Same evening: the Pentagon's daily contract list (weekdays, rows in by about 7 p.m. New York). History: the USAspending.gov API from 2007-10-01, for the Department of Defense or any other federal agency. DoD contract actions reach USAspending up to 90 days after signing, so the default window is the last 135 days.
Use with AI agents (MCP)
Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>. It works once the Actor is live on the Apify Store.
https://mcp.apify.com?tools=bosco_labs/dod-contract-awards
For “Which Kratos contracts did the Pentagon award in 2019, and how large were they?” the agent passes:
{"tickers": ["KTOS"], "dateFrom": "2019-01-01", "dateTo": "2019-12-31"}
stable, typed JSON, one row per award per signing day, newest first. Every row has schema_version, source (dod_daily_list: the same-evening announcement; usaspending: the history, up to 90 days late for DoD) and a source_url (the war.gov article or the USAspending API record), so the agent can cite its source. Rows with is_ceiling: true are contract ceilings, not money committed.
Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~dod-contract-awards/run-sync-get-dataset-items with the input as JSON body. Cost: $0.005 per award row.
Input fields
| Field | Type | Meaning |
|---|---|---|
source | string | "both" (default) = the Pentagon's same-evening contract list (published around 5 p.m. New York on the signing day, face values, DoD only) plus the USAspending history (obligations, ~3 months behind for DoD). "dailyList" = only the same-evening list rows. "history" = only USAspending. The list has no NAICS/PSC codes, so it is skipped when naicsCodes or pscCodes are set, and when agencies excludes the Department of Defense. |
dateFrom | string | Earliest action (signing) date, or announcement date for same-evening list rows, YYYY-MM-DD, e.g. "2019-01-01". History from 2007-10-01 (FY2008). Empty = 135 days before dateTo, because DoD data is published up to 90 days late (about 105 days observed). |
dateTo | string | Latest action (signing) date, YYYY-MM-DD, e.g. "2019-12-31". Empty = today. The last ~3 months of DoD data are incomplete. |
agencies | array | Top-tier awarding agency names as USAspending spells them, e.g. ["Department of Defense"], ["Department of Homeland Security"], ["National Aeronautics and Space Administration"]. Default ["Department of Defense"]. Pass [] for ALL federal agencies. |
minAmountUsd | integer | Minimum summed obligations per award and day, in USD, e.g. 1000000. Default 7500000, the DoD's public announcement threshold (the daily 5 p.m. contracts list). 0 = every award-day except net de-obligations (negative sums). |
recipients | array | Winning company search terms, matched by USAspending against recipient and parent names, e.g. ["kratos", "huntington ingalls"]. Empty = all recipients. |
tickers | array | Only awards matched to these US-listed tickers (NYSE, Nasdaq, CBOE), e.g. ["LMT", "KTOS", "AVAV"]. Turns ticker matching on. Empty = no ticker filter. |
naicsCodes | array | NAICS industry codes, 2 to 6 digits, e.g. ["336414"] (guided missiles and space vehicles) or ["3364"]. Empty = all. |
pscCodes | array | Product and Service Codes, e.g. ["1410"] (guided missiles), ["R425"] (engineering support). Empty = all. |
matchTickers | boolean | true (default) = match the recipient or its parent company to a US-listed ticker by exact cleaned name (SEC company list) and add the SEC-reported shares outstanding. Unmatched awards are still returned, with ticker = null. |
maxResults | integer | Maximum award rows, newest signing dates first, then largest amounts, e.g. 20. Default 100. Each row is one charged event. |
onlyNewSinceLastRun | boolean | true = skip (and don't charge for) award-days (including old-dated actions the DoD publishes late) an earlier run with the same filters already delivered. For scheduled runs. Default false. Remembered in a named key-value store in your account. |
Sources, licence and limits
How fresh is the data? Same-evening rows are in by about 7 p.m. New York on the day the Pentagon announces them (weekdays). The USAspending history is months behind for DoD: contract actions are published in FPDS, and so on USAspending, with a delay of up to 90 days (a DoD rule for operational security). On 2026-11-05 the DoD data was complete up to 2026-07-23, a lag of about 105 days; later dates only held a few hundred actions (mainly Army Corps of Engineers civil works). That is why the default window is the last 135 days, and why every row carries a data_lag_note. Civilian agencies report within days. Old dates keep filling in, so use onlyNewSinceLastRun on a schedule instead of re-reading the same window.
How does the same-evening list get in? The Pentagon e-mails its daily contract list around 5 p.m. New York. Each weekday evening we read that e-mail, turn every awardee in it into a row and store it; your run reads the stored rows (no e-mail or AI call happens in your run). Rows are matched to tickers the same strict way as the history.
The list is parsed by AI. Can I trust it? The prose is turned into rows by Claude (Haiku), with checks around it: the model has no tools and is told the text is data, not instructions; its answer must be exactly a JSON list in a fixed schema with valid types, or that part of the day is rejected and read again; and every row's company name and dollar amount must literally appear in the announcement text, or the row is dropped. That stops made-up rows, but the model can still occasionally pick the wrong one of two amounts in a paragraph, or the wrong city. For anything you act on, open source_url (the war.gov article) and check.
What does is_ceiling mean? The list states face values. For a multiple-award contract the amount is a shared ceiling: eleven firms "are awarded a $975,000,000 contract" means they compete for orders up to $975M together, and each of them gets a row with the full $975M. IDIQ contracts also state a maximum, not money committed. Those rows have is_ceiling: true; don't add them up as revenue. USAspending rows are obligations, so always false.
Is this the same as the DoD's daily 5 p.m. contract announcements? Same contract actions, two records. dod_daily_list rows come from the announcement itself, the same evening, with face values. usaspending rows arrive months later with the obligated amount of that day (often lower than the face value), UEI, parent company, NAICS and PSC. The Actor does not merge them: the same award can appear once from each source.
Why do amounts differ from the press release? For USAspending rows: obligations vs. face value (see above). Also, one row sums all actions on that contract that day, and modifications can be negative.
Why is my company's ticker missing? The recipient name and its parent must match the SEC name exactly after cleaning (the daily list names no parent, so only the awardee's own name counts there). Joint ventures, foreign parents and renamed subsidiaries are missed on purpose. Search by recipients (name contains) to see them anyway.
Why is shares_outstanding empty for a matched ticker? Companies with several share classes (e.g. Palantir) or that don't report the cover-page count as a single number, and counts older than 400 days from the signing date, are left empty rather than guessed.
Is the ticker the company that was listed at the time? Matching uses today's SEC list and today's parent company from USAspending. A subsidiary sold since then may show its current owner's ticker; companies that are no longer listed are not matched.
Is this investment advice? No. It is a data product: public contract records joined to public SEC identifiers. No prices, no market caps, no signals.
Legal basis? US federal government data is public domain. See LEGAL.md in the source.