GAO Protests
Published Government Accountability Office bid-protest decisions.
Source, grain and coverage
Separate public docket and decision observations. Filing and decision dates describe different events.
Dockets and published decisions have separate datasets and event dates. Collection covers selected public records and accumulates history. Decision NAICS and grounds can be unavailable. An absent published decision does not establish that no protest occurred.
Collection schedule: Monthly.
Records describe public source observations. Missing values remain unknown; historical observations do not establish current status.
Definitions audited . Use source status and the returned watermarks to inspect current collection health.
REST and MCP access
Use a credential with intelligence scope and enable that data domain in your workspace.
curl 'https://www.govbiz.ai/api/v2/catalogue/sources/gao-protests-refresh/records?limit=2' \ -H "Authorization: Bearer $GOVBIZ_API_KEY"
The primary dataset is protest_dockets. Select another dataset from this source with dataset_id. Supported field names can be used as exact filters; the versioned query endpoint also supports declared ranges and list operators.
Through canonical /mcp, use govbiz_discover_datasets, govbiz_describe_dataset, govbiz_search_records, and govbiz_get_evidence. Cross-source relationships use govbiz_get_related_records and require access to every involved domain.
API contracts · MCP setup · Workspace data domains
Query this source →Protest Dockets
protest_dockets · Schema 1
One retained public protest docket per case_number; filing, disposition and published-decision events are distinct.
Search modes: structured, lexical. History: Current retained projection; exact historical reconstruction is unsupported.
Measures: record_count. Monetary values use decimal strings with declared units. Unknown amounts do not become zero.
Field definitions and supported filters · 12 fields
| Field | Type / unit | Meaning | Availability and filters |
|---|---|---|---|
case_number | string | GAO docket file/case reference; not a contract/solicitation ID.Storage and value limits: Maximum 50 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
file_date | date | GAO protest filing calendar date.Storage and value limits: Calendar date without time of day or timezone; source precision can be month/quarter instead. | Values can be missingeq, in, is_null, gte, lte |
decision_date | date | GAO docket/decision disposition calendar date.Storage and value limits: Calendar date without time of day or timezone; source precision can be month/quarter instead. | Values can be missingeq, in, is_null, gte, lte |
protester | string | GAO docket protesting-party label.Storage and value limits: Maximum 500 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
agency | string | Source agency label used by legacy SBIR/GAO records.Storage and value limits: Maximum 200 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
contracting_office | string | Public GAO docket contracting-office label when supplied.Storage and value limits: Maximum 300 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
outcome | string | Stored docket/decision disposition label; preserve source normalization and case scope.Storage and value limits: Maximum 30 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
decision_url | string | Public GAO docket/decision evidence URL.Storage and value limits: No declared field-length cap here; API/output budgets must apply; empty and null differ. | Values can be missingeq, in, is_null, contains |
decision_title | string | GAO public decision title in the docket table.Storage and value limits: No declared field-length cap here; API/output budgets must apply; empty and null differ. | Values can be missingeq, in, is_null, contains |
attorney | string | Published GAO attorney label; public docket metadata, not an agency procurement contact.Storage and value limits: Maximum 300 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
abstract_text | string | GAO docket/decision abstract or summary text.Storage and value limits: No declared field-length cap here; API/output budgets must apply; empty and null differ. | Values can be missingeq, in, is_null, contains |
ingested_at | datetime | Producer ingestion timestamp; some relations store ISO text and others timestamp without time zone.Storage and value limits: Instant with timezone only if declared; otherwise local/producer time must be explicitly interpreted. Do not invent clock precision. | Values can be missingeq, in, is_null, gte, lte |
Protest Decisions
protest_decisions · Schema 1
One retained published protest-decision observation per id, with its docket reference and decision date.
Search modes: structured, lexical. History: Current retained projection; exact historical reconstruction is unsupported.
Measures: record_count. Monetary values use decimal strings with declared units. Unknown amounts do not become zero.
Field definitions and supported filters · 16 fields
| Field | Type / unit | Meaning | Availability and filters |
|---|---|---|---|
id | integer | GovBiz surrogate row identifier; interpret together with its relation, not as a source-native key.Storage and value limits: Signed 32-bit integer; logical domain constraints can be narrower. | Values can be missingeq, in, is_null, gte, lte |
docket_number | string | GAO decision docket/file reference in the decisions table.Storage and value limits: Maximum 50 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
case_title | string | GAO case/decision title.Storage and value limits: No declared field-length cap here; API/output budgets must apply; empty and null differ. | Values can be missingeq, in, is_null, contains |
protester_name | string | GAO decision protesting-party label; not a resolved UEI.Storage and value limits: Maximum 300 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
agency_name | string | Source agency name; a label whose scope can be department, bureau or office.Storage and value limits: Maximum 200 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
agency_code | string | Stored source agency identifier; namespace can be CGAC, FPDS, top-tier or publisher-specific and must be declared.Storage and value limits: Maximum 20 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
decision_date | date | GAO docket/decision disposition calendar date.Storage and value limits: Calendar date without time of day or timezone; source precision can be month/quarter instead. | Values can be missingeq, in, is_null, gte, lte |
outcome | string | Stored docket/decision disposition label; preserve source normalization and case scope.Storage and value limits: Maximum 50 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
decision_url | string | Public GAO docket/decision evidence URL.Storage and value limits: No declared field-length cap here; API/output budgets must apply; empty and null differ. | Values can be missingeq, in, is_null, contains |
summary | string | Collected decision summary; do not assume it contains every ground or holding.Storage and value limits: No declared field-length cap here; API/output budgets must apply; empty and null differ. | Values can be missingeq, in, is_null, contains |
grounds | array | Reported protest ground label list when separately extracted; currently absent.Storage and value limits: Array/list; no declared cardinality cap here; distinguish missing list, empty list and per-element nulls. | Not collected; returned as unknownoverlaps, is_null |
corrective_action | string | Published corrective-action context when collected; not implied by a disposition label.Storage and value limits: No declared field-length cap here; API/output budgets must apply; empty and null differ. | Values can be missingeq, in, is_null, contains |
solicitation_number | string | Source solicitation reference; qualify by issuer and dates before relating records.Storage and value limits: Maximum 100 characters; identifier rules can be narrower. | Values can be missingeq, in, is_null, contains |
naics_code | string | Source industry classification code; link with the NAICS edition and declared precision.Storage and value limits: Maximum 10 characters; identifier rules can be narrower.Require a classification edition; do not join broad prefixes as exact identities. | Not collected; returned as unknowneq, in, is_null, contains |
keywords | array | Collector decision keyword list; search hints rather than definitive legal categorization.Storage and value limits: Array/list; no declared cardinality cap here; distinguish missing list, empty list and per-element nulls. | Values can be missingoverlaps, is_null |
ingested_at | datetime | Producer ingestion timestamp; some relations store ISO text and others timestamp without time zone.Storage and value limits: Instant with timezone only if declared; otherwise local/producer time must be explicitly interpreted. Do not invent clock precision. | Values can be missingeq, in, is_null, gte, lte |