Changelog¶
This is the most up-to-date change log for Tango and the Tango API.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased¶
Added¶
Changed¶
Breaking¶
Fixed¶
Internal / Infra¶
[3.34.11] - 2026-03-16¶
Added¶
- Webhooks: Support multiple endpoints per customer — create different webhook endpoints with separate callback URLs, secrets, and circuit breaker health
- Webhooks: Filter-based subscriptions (alerts) — monitor resources by query filters (agency, NAICS, search terms) instead of specific entity/award IDs. New
/api/webhooks/alerts/convenience API with automatic evaluation pipeline. Available to all tiers (Free: 1, Pro: 5, Large: 25, Enterprise: up to 100). Supports realtime (every 5 min), daily, weekly, and custom cron scheduling (Pro+). (refs #1726)
Changed¶
- Webhooks: Endpoint
namefield is now user-chosen (previously auto-set to username) - Webhooks: Subscription creation accepts an
endpointUUID to target a specific endpoint; auto-resolves for single-endpoint users - Agencies: Organization deduplication now preserves historical records (demoted with
canonical_code = NULL) instead of deleting them. Only canonical organizations appear in search and list results; demoted records are retained for historical reference and fh_key resolution.
Breaking¶
- Webhooks API: Users with multiple endpoints must now include an
endpointfield when creating subscriptions
[3.34.10] - 2026-03-15¶
Added¶
- OAuth: Dynamic Client Registration (DCR) for seamless MCP client OAuth setup — ChatGPT and other MCP clients can now auto-register without manual configuration
Fixed¶
- Webhooks: Fix duplicate webhook deliveries for COFC protest updates (fixes #1764)
[3.34.9] - 2026-03-14¶
- No user-facing changes
[3.34.8] - 2026-03-14¶
- No user-facing changes
[3.34.7] - 2026-03-14¶
Added¶
- Webhooks: Support multiple endpoints per customer — create different webhook endpoints with separate callback URLs, secrets, and circuit breaker health
- API (Protests): COFC bid protest data from Court of Federal Claims now available alongside GAO protests, including decisions and document metadata
Changed¶
- Webhooks: Endpoint
namefield is now user-chosen (previously auto-set to username) - Webhooks: Subscription creation accepts an
endpointUUID to target a specific endpoint; auto-resolves for single-endpoint users
Breaking¶
- Webhooks API: Users with multiple endpoints must now include an
endpointfield when creating subscriptions
Fixed¶
- API (Protests): Fixed error when using
decisions(*)shape expansion on grouped protest results
[3.34.5] - 2026-03-12¶
- No user-facing changes
[3.34.4] - 2026-03-12¶
Changed¶
- API (Opportunities): Improved search performance — full-text and attachment search queries now use UNION for independent index usage
- API (Opportunities):
office(*)expand unchanged in output but now backed by unified Organization model for faster responses
[3.34.3] - 2026-03-11¶
Added¶
- API: Text search parameters (
search,recipient,agency,name, etc.) now require at least 2 characters — single-character queries return a400with a descriptive error message (refs #1725)
Changed¶
- API (Protests): Improved entity resolution confidence for near-exact name matches — names differing only by pluralization or punctuation now produce higher confidence scores (refs #1702)
Fixed¶
- API (Protests): Entity resolution no longer times out on candidate queries (fixes #1700, #1701)
[3.34.2] - 2026-03-11¶
Added¶
- API (CALC Rates): New
/api/idvs/{key}/lcats/endpoint for GSA CALC labor category pricing data scoped to a specific IDV (refs #1703) - API (CALC Rates): New
/api/entities/{uei}/lcats/endpoint for CALC rates scoped to an entity - API (CALC Rates): Filters: vendor_name, labor_category, price range, education_level, experience, worksite, business_size, sin, category, full-text search
- API (CALC Rates): Response shaping with
idv(key,piid,award_date),recipient(uei,display_name), andbusiness_size(code,description)expansions - API (CALC Rates): Default shape applied automatically;
?flat=trueworks without an explicit?shape=parameter - API: New
RequiresAccessLevelgeneric tier-based permission class for endpoint gating - API: New
PremiumQueryThrottlefor premium query rate limiting on expensive endpoints
Fixed¶
- API (Entities): Fixed an issue that could prevent the
past_performanceexpansion data from refreshing correctly (fixes #1710) - API (Protests):
?flat=truewithout an explicit?shape=now works on/api/protests/(fixes #1711)
[3.34.0] - 2026-03-10¶
Added¶
- API (Shaping): Bracket parameter syntax — expansions now accept
[key=value]parameters for server-side configuration (e.g.,past_performance[top=10](*)). Parameters are validated with type checking and range enforcement. - API (Entities): New
past_performanceexpansion on/api/entities/— aggregated contract history showing top agencies, NAICS/PSC codes, and obligation totals. Use?shape=uei,past_performance(*)for defaults orpast_performance[top=10](summary,top_agencies)to control how many agencies are returned (default 5, max 100). (refs #1587) - API (Organizations): The organization detail endpoint now accepts either an integer
fh_keyor a UUIDkeyas the URL parameter. Historicalfh_keyredirects (301) are preserved on the integer path. (refs #1548)
Breaking¶
- API: Date range filters now return HTTP 400 for invalid date formats (non-
YYYY-MM-DD) and inverted ranges (start > end). Previously, some endpoints returned HTTP 200 with an error message in the response body. Affected endpoints: contracts, IDVs, OTAs, OTIDVs, opportunities, notices, grants, forecasts, protests (fixes #1690)
Fixed¶
- API: Date filter validation is now consistent across all endpoints. Invalid dates and inverted ranges always return a clear 400 error identifying the problematic parameter and value (fixes #1690)
[3.33.0] - 2026-03-09¶
Added¶
- API (Protests): Entity and organization resolution — use
?shape=...,resolved_protester(*)to see which canonical entity a protester name maps to (by UEI), and?shape=...,resolved_agency(*)for the matched organization (by UUID key). Each includesmatch_confidence("confident"or"review") and a human-readablerationale. Low-confidence matches returnnull. - API: Paginated endpoints that use approximate counts (contracts, IDVs, opportunities, notices) now support
?exact=trueto request an exact count instead of an estimate. On endpoints that already use exact counts, the parameter is accepted but has no effect. See Result counts. - API: All paginated list responses now include an
X-Results-CountTypeheader (exactorapproximate) indicating whether the count is exact or estimated.
Breaking¶
- API: The
count_typefield has been removed from paginated response bodies. Count exactness is now reported exclusively via theX-Results-CountTyperesponse header.
Fixed¶
- API:
X-Results-CountTypeheader now correctly reportsexactwhen the count is known to be exact, instead of always reportingapproximate. - API: Fixed a rare bug where paginated list endpoints could return empty results (
count: 0) when database statistics were stale. - API: Fixed a performance issue where certain paginated list requests could trigger expensive full-table evaluations instead of optimized counting.
- API (Shaping):
?show_shapes=trueschema discovery now includes expand names in thefieldslist. Previously, expand-only names (e.g.,recipient,awarding_office) appeared underexpandsbut were missing fromfields, giving clients an incomplete view of valid shape keys. (fixes #1685)
[3.32.2] - 2026-03-08¶
Added¶
- Opportunities: New
/api/opportunities/attachment-search/endpoint — search across opportunity attachment text using semantic + keyword hybrid search. Requires a Medium plan or higher. (refs #1645) - Forecasts: Support 7 new forecast agencies — DOI, DOL, DOT, VA, NRC, DOE, Treasury. Forecast data from these agencies is now loaded and available via the API.
Changed¶
- API: Tier-related error responses and upgrade hints now display user-facing plan names (Free, Micro, Medium, Enterprise) instead of internal tier codes.
[3.32.1] - 2026-03-08¶
Added¶
- API (Opportunities): The opportunity detail endpoint (
/api/opportunities/{id}/) now resolves notice UUIDs to their parent opportunity. If you pass a notice UUID, you get a 302 redirect to the parent opportunity instead of a 404. (refs #1592)
Breaking¶
- API (Vehicles): Vehicle orders endpoint (
/api/vehicles/:uuid/orders/) now uses standard page-number pagination (?page=&limit=) instead of cursor-based pagination (?cursor=&limit=). This fixes broken backward pagination and simplifies the endpoint. (fixes #1653)
Fixed¶
- API (Opportunities/Notices): 32-byte hex UUID redirects now preserve query string parameters (
?shape=,?show_shapes=,?flat=, etc.). Previously, requesting an opportunity or notice by its undashed UUID with shaping parameters would silently drop those parameters during the redirect.
[3.32.0] - 2026-03-06¶
Added¶
- API (IDVs): IDV list and detail responses now use response shaping by default. All fields from the IDV serializers are available via
?shape=, including 42 premium detail fields (competition details, fee ranges, ordering procedures, etc.). Choice fields (idv_type,multiple_or_single_award_idv,type_of_idc) can be expanded to{code, description}objects.period_of_performance(*)now includeslast_date_to_order. New shapeable expands:naics(code,description),psc(code,description),set_aside(code,description),competition(*),officers(*),legislative_mandates(*). (refs #1601) - API (Vehicles): Vehicle list and detail responses now use response shaping by default, providing consistent structured output. (refs #1601)
- API (OTAs): Full response shaping support.
type_of_ot_agreement,extent_competed, andaward_typeare now expandable to{code, description}via?shape=.award_typeuses OTA-specific choices ("O" = Other Transaction Non-Research, "R" = Other Transaction for Research). New shapeable expands:psc(code,description). Added fields:consortia_uei,dod_acquisition_program,non_governmental_dollars,non_traditional_government_contractor_participation,parent_award_modification_number. Note: OTAs do not have anaics_codefield ornaicsexpand. (refs #1600) - API (OTIDVs): Full response shaping support.
type_of_ot_agreementandextent_competedare now expandable to{code, description}via?shape=. New shapeable expands:psc(code,description). Added fields:consortia_uei,dod_acquisition_program,non_governmental_dollars,non_traditional_government_contractor_participation. Note: OTIDVs do not have anaics_codefield ornaicsexpand. (refs #1600) - Docs: Documented
wildcard_fieldsproperty inavailable_fieldsschema — whentrue, the expansion accepts arbitrary field names (freeform JSON likeraw_data(*)); whenfalse, only the listed fields are valid. (refs #1600) - API (Subawards): Subaward list and detail endpoints (
/api/subawards/,/api/subawards/{id}/) now use a default response shape by default — no?shape=parameter needed. Responses include key award fields, recipient/awarding agency info, and officer lists with canonical agency names. Custom shapes via?shape=still work as before. (refs #1602)
Fixed¶
- API (Shaping):
wildcard_fieldsinavailable_fieldsschema was serialized as the string"False"instead of JSONfalsein 400 error responses (e.g., invalid shape requests). The?show_shapes=truepath was unaffected. All shaped endpoints are now consistent. (refs #1600) - API (IDVs): Pagination
counton/api/idvs/{key}/awards/now returns an exact value instead of an EXPLAIN-based estimate, which could be inaccurate for queries with subquery predicates. (refs #1601) - API (Vehicles): Pagination
counton/api/vehicles/{uuid}/awardees/now returns an exact value instead of an EXPLAIN-based estimate. (refs #1601) - API (Vehicles):
?exact=trueon/api/vehicles/{uuid}/orders/no longer creates a separate cache entry — counts on this endpoint are always exact, so the parameter is now a no-op for caching purposes. (refs #1601)
[3.31.5] - 2026-03-05¶
Added¶
- API: Tier-based access control — responses from gated endpoints now include
meta.upgrade_hintslisting fields or filters that require a higher plan tier. Free-tier users hitting a gated filter (e.g., full-text search on opportunities) receive a structured 403 with upgrade information instead of an opaque error. (refs #1598) - Opportunities:
extracted_textin attachment expansions is now gated to pro+ plans. Full-text search filters on opportunities and notices are gated to pro+ plans. (refs #1598)
[3.31.4] - 2026-03-05¶
Fixed¶
- API (Vehicles): Fixed 504 gateway timeouts on
/api/vehicles/{uuid}/orders/. Requests with?exact=truewere triggering a slowCOUNT(*)across a 3-table join; the endpoint now uses an indexed subquery and should be significantly faster. (fixes TANGO-R15) - API (Vehicles): Fixed a bug where passing
?page=1to/api/vehicles/{uuid}/orders/would bypass the fast path, causing ~15s response times and inaccurate counts. Thepageparameter is now ignored (this endpoint uses cursor pagination). (refs #1624)
[3.31.3] - 2026-03-04¶
Added¶
- API (Shaping):
?show_shapes=trueon any shaped endpoint appends a_shapingkey at the bottom of the response containingavailable_fields— the full schema of fields and expansions available for that endpoint. Truthy values:true,1,yes,on. (refs #1545) - API (Shaping): 400 error responses for invalid shapes now always include
available_fieldsat the top level, so clients can see what's valid without a successful request. (refs #1545) - Docs: Added "Discovering available fields" section to Response Shaping documenting
?show_shapesand the_shapingresponse block. (refs #1545)
Breaking¶
- Entities API:
relationshipsis no longer included in the default list response for/api/entities/. Clients that need relationships on list results can opt in via response shaping:?shape=...,relationships(*). The detail endpoint (/api/entities/{uei}/) still includesrelationshipsby default. (closes #1579)
Fixed¶
- API (Forecasts): The forecast detail endpoint (
/api/forecasts/{id}/) now correctly supports response shaping via?shape=. Previously, the?shape=parameter was silently ignored on the detail endpoint — it only worked on the list endpoint. The detail response now uses the shaping pipeline by default, including adisplayexpand with normalized display fields. - API: Error responses now return correct HTTP status codes (404 for invalid resources, 400 for bad query parameters) instead of always returning 200. Affects
NotFound, validation errors, field errors, and search errors. (fixes #1349) - API (Awards): Invalid date format parameters (
award_date,award_date_gte,award_date_lte) now return HTTP 400 with a descriptive error message instead of silently returning empty results. (fixes #1349) - API (Entities): Fixed intermittent 504 timeouts on entity detail requests (
/api/entities/{uei}/) caused by cold-cache stampedes on the underlying database view. Entity obligation data now caches for longer and is pre-populated when entities appear in list responses. (fixes #1344)
[3.31.2] - 2026-03-03¶
Fixed¶
- API: Fixed an edge case where certain error responses could fail to render when raised outside normal request processing (e.g. middleware exceptions). (fixes #1608)
[3.31.1] - 2026-03-03¶
Added¶
- API (Protests): New
/api/protests/endpoint for GAO bid protest data — list and detail views with filter, search, and response shaping. Detail endpoint keyed bycase_id. Use?shape=...,dockets(*)to expand docket-level data. Gated behindPROTESTS_APIfeature flag.
[3.31.0] - 2026-03-03¶
Breaking¶
- Awards: removed the deprecated IDV summary endpoints (
GET /api/idvs/{identifier}/summary/andGET /api/idvs/{identifier}/summary/awards/). Use the Vehicles API (GET /api/vehicles/andGET /api/vehicles/{uuid}/) instead. (closes #1365)
[3.30.4] - 2026-03-03¶
Added¶
- Docs: Added MCP (AI agents) documentation — covers connecting Claude Desktop, Cursor, and the OpenAI Responses API to the hosted Tango MCP server at
govcon.dev; includes tool reference, auth options (API key and OAuth), and troubleshooting. (refs #1571) - API (Opportunities):
/api/opportunities/now has a default shape — all responses go through the shaping pipeline. List responses return core fields withmeta(*),office(*),place_of_performance(*)expanded by default. Detail responses additionally includeattachments(*),description,notice_history(*),primary_contact(*). (refs #1530, part of #1524) - API (Opportunities):
set_asideis now expandable to{code, description}via?shape=set_aside(code,description)orset_aside(*)— consistent with the awards shaping pattern. (refs #1530, fixes makegov/tango-public#44) - API (Opportunities): New shaping expansions:
notice_history(...)(opportunity timeline),primary_contact(...),secondary_contact(...). Available via?shape=on both list and detail. - API (Opportunities): Additional shapeable fields and expansions:
latest_notice_id,archive_date,agency_id,department_id,office_id, plusagency(*),department(*), andlatest_notice(notice_id,link). - API (Notices):
/api/notices/now has a default shape — all responses go through the shaping pipeline. List responses expandaddress(*),meta(*),office(*),opportunity(*),place_of_performance(*)by default. Detail responses additionally includearchive(*),primary_contact(*),secondary_contact(*). (refs #1530, part of #1524) - API (Notices):
set_asideis now expandable to{code, description}via?shape=set_aside(*). New expansions:archive(date,type),opportunity(opportunity_id,link),secondary_contact(...),set_aside(code,description). (refs #1530) - API (Notices):
award_numberis now available as a shapeable field (previously only in serializer output). (refs #1530) - API (Notices):
opportunity_idis now available as a shapeable field. - Docs: Updated Opportunities API Reference and Notices API Reference with Response Shaping sections — available fields, expansions, default shapes (list vs. detail), and SDK examples.
- API (Organizations):
/api/organizations/now has a default shape — all responses go through the shaping pipeline, returningkey, fh_key, name, short_name, type, level, is_active, code, fpds_code, cgac, canonical_code, parent_fh_key, full_parent_path_nameby default. (refs #1543, part of #1524) - API (Organizations):
fh_keyis now returned as a zero-padded 9-character string (e.g.,"000000001") everywhere — root fields, expands, and alll{n}_fh_keyfields. Previously returned as a raw integer. (refs #1543) - API (Organizations): New root fields available via shaping:
canonical_code,fpds_org_id,aac_code,start_date,end_date,logo,summary,l1_fh_keythroughl8_fh_key,total_obligations,tree_obligations. (refs #1543) - API (Organizations): New
department(code, name, abbreviation)andagency(code, name, abbreviation)expands let you retrieve legacy-compatible department/agency data from any organization. Returnsnullwhen not applicable (e.g., a department doesn't have a department above it). Safe to use in list responses with mixed hierarchy levels. (refs #1543) - API (Organizations): Enriched
ancestorsexpand now includesleveland cachedshort_name.parentandchildrenexpands now includecodeandcgac. (refs #1543) - Docs: Updated Organizations API Reference and Organizations Data Dictionary with all new fields, expands, and default shape details.
- API (Reference Data): Five reference data endpoints now support the
?shape=query parameter for response shaping:/api/business_types/,/api/mas_sins/,/api/naics/,/api/psc/, and/api/assistance_listings/. Default responses are backward-compatible. (refs #1527, part of #1524) - API (NAICS):
size_standardsandfederal_obligationsare now available as shaping expansions on/api/naics/. Use?shape=code,description,size_standards(*),federal_obligations(*)instead of the legacy?show_limits=1parameter. Detail responses include both expansions by default. (refs #1527) - API (Agencies): Legacy agency endpoints (
/api/departments/,/api/agencies/,/api/offices/) now support the?shape=query parameter for response shaping, letting clients select specific fields per request. (refs #1526, part of #1524) - Docs: API reference pages for Departments, Agencies, and Offices now include Response Shaping sections with available fields, expansions, default shapes, and examples.
Changed¶
- API (Organizations):
fh_keytype changed from integer to zero-padded string in all API responses. If you parsefh_keyas a number, this is a format change. The integer value is preserved (e.g.,"000000001"→1). (refs #1543) - API (Organizations): Detail endpoint now returns inactive organizations directly — active-only filtering only applies to list requests. Previously,
GET /api/organizations/{fh_key}/returned 404 for inactive orgs unlessinclude_inactive=truewas passed. (refs #1543) - API (Agencies): The
organizationfield has been removed from/api/departments/and/api/agencies/responses. This was an internal FK that leaked an opaque identifier and was never part of the documented API contract. (refs #1526) - API (NAICS): The
?show_limits=1parameter is now deprecated in favor of?shape=code,description,size_standards(*),federal_obligations(*). The legacy parameter still works but has been removed from the OpenAPI/Swagger docs. (refs #1527) - API (Awards): Default
parent_awardin contract and IDV responses is now a minimal{key, piid}reference — no database query required. To get the full parent award object, use theshapeparameter withparent_award(key,piid)orparent_award(*). OTIDV endpoints are unchanged. (refs #1576)
Breaking¶
- API (Financial assistance): Removed the
financial_assistanceapp and the assistance transactions API surface. CFDA reference data viaAssistanceListingremains (e.g./api/assistance_listings/is unchanged). (refs #1567)
Fixed¶
- API (Shaping): Bare relation-backed expand names requested as leaf fields (e.g.
?shape=opportunity) are now treated asfield(*)to prevent 500s caused by non-JSON-serializable ORM objects. - API (Shaping): Leaf auto-promotion no longer interferes with
field_map-backed leaf fields (e.g. Grantsstatus). - API (Vehicles): Vehicle full-text search now includes solicitation title. Vehicles can be found by common name (e.g. "CIO-SP3") as well as solicitation identifier. (closes #1573)
[3.30.3] - 2026-03-02¶
Added¶
- Docs: Added MCP (AI agents) documentation — covers connecting Claude Desktop, Cursor, and the OpenAI Responses API to the hosted Tango MCP server at
govcon.dev; includes tool reference, auth options (API key and OAuth), and troubleshooting. (refs #1571) - API (Organizations): Fixed
childrenexpand performance — now uses prefetch instead of per-row queries. (refs #1543) - API (NAICS): Improved performance for
federal_obligationsexpansion on list endpoints — now uses a single batched query instead of per-item lookups. (refs #1527) - API (Agencies): Fixed
Organization is not JSON serializableerror when requesting/api/agencies/without a?shape=parameter. (refs #1526)
[3.30.2] - 2026-03-01¶
Fixed¶
- API (Entities): Fixed a crash (
AttributeError) whenfederal_obligationsdata isNonefor an entity. Shaping builders now safely handle missing obligation data. (fixes #1562)
[3.30.1] - 2026-03-01¶
Added¶
- API (Entities): Entities now default to the shaping pipeline — responses render through shaping even without
?shape=. List and detail endpoints return action-aware default shapes with all previously-available fields. (refs #1531, part of #1524) - API (Entities): New expandable fields via shaping:
business_types(code,description),sba_business_types(code,description,entry_date,exit_date),naics_codes(code,sba_small_business),federal_obligations(total,active),highest_owner(cage_code,legal_business_name,uei),immediate_owner(cage_code,legal_business_name,uei). (refs #1531) - API (Entities):
federal_obligationsis now an expand-only field supporting child selection — usefederal_obligations(*)for bothtotalandactive, orfederal_obligations(total)for just one section. (refs #1531) - API (Entities): Many additional detail fields now available via shaping:
uuid,dodaac,evs_source,last_update_date,uei_status,uei_expiration_date,uei_creation_date,public_display_flag,exclusion_status_flag,exclusion_url,entity_division_name,entity_division_number,entity_start_date,fiscal_year_end_close_date,submission_date, entity structure/type/profit/organization/incorporation codes and descriptions. (refs #1531) - API (Forecasts): Forecasts now default to the shaping pipeline with action-aware default shapes. (refs #1531, part of #1524)
- API (Grants): Grants now default to the shaping pipeline with action-aware default shapes. (refs #1531, part of #1524)
- Docs: Updated Entities Data Dictionary, Entities API Reference, and Response Shaping with full field list, expand definitions, normalization details, and examples.
- Docs: Updated Forecasts and Grants API reference and data dictionary docs with default shaping information.
Changed¶
- API (Entities): Entity address keys (
physical_address,mailing_address) are now normalized to snake_case when expanded via shaping. Entities loaded from DSBS previously had camelCase keys (addressLine1,zipCode,stateOrProvinceCode); these are now consistentlyaddress_line1,zip_code,state_or_province_code. SAM-loaded entities (the majority) already used snake_case and are unaffected. (refs #1531) - API (Entities):
business_typesexpanded viabusiness_types(*)now always returns[{code, description}]arrays. Previously, DSBS-sourced entities could return{"2X": true, "F": true}dict format. Descriptions are looked up from in-memory reference maps (entities.loaders.maps). (refs #1531) - API (Entities):
sba_business_typesexpanded viasba_business_types(*)now always returns[{code, description, entry_date, exit_date}]arrays, with the same dict-to-array normalization asbusiness_types. (refs #1531) - API (Entities):
naics_codesexpanded vianaics_codes(*)now always returns[{code, sba_small_business}]objects. Previously, some entities stored plain string arrays (["541512", ...]); these are automatically normalized. (refs #1531) - API (Entities): Code/description pairs (
entity_structure,entity_type,profit_structure,organization_structure,state_of_incorporation,country_of_incorporation,purpose_of_registration) are now structured{code, description}expands instead of separate_code/_descleaf fields. Description fallbacks by field:entity_structure→ENTITY_STRUCTURE_MAP;entity_type,profit_structure,organization_structure→BUSINESS_TYPE_MAP;country_of_incorporation→django-genc(GENC country names);purpose_of_registration→PURPOSE_OF_REGISTRATION_MAP;state_of_incorporation→ model value only. (refs #1531)
Fixed¶
- API (Grants):
statusas a root leaf field now correctly maps to the underlyingopportunity_statusmodel attribute. (refs #1531) - API (Grants):
attachmentsexpand fixed for correct query behavior (was using invalidselect_relatedon a reverse FK). (refs #1531) - API (Grants): Removed
attachment_idfrom grant attachments — field does not exist on the model. Useresource_idas the attachment identifier. (refs #1531) - API (Grants):
important_dates,funding_details,grantor_contact, andadditional_infoexpands now support sub-field selection (e.g.,important_dates(posted_date,response_date),funding_details(award_ceiling)) instead of being opaque. (refs #1531)
Internal / Infra¶
- Bulk builders for
relationships(entities) andcfda_numbers(grants) — list-endpoint batch fetching reduces query count significantly. - Business type description lookups now use in-memory maps instead of database queries for faster response times.
- Forecast
display_datamemoized to prevent redundant parsing on list pages. - Tests: removed 9 fragile list-endpoint assertions across reference data, agency, and organization tests that relied on
ApproximatePaginator(pg_class.reltuples), which returns 0 in CI test databases. Detail tests andTestInvalidShapeFieldparametrized tests already cover the same shaping logic without pagination sensitivity.
[3.30.0] - 2026-02-28¶
Added¶
- API (Organizations):
/api/organizations/now has a default shape — all responses go through the shaping pipeline, returningkey, fh_key, name, short_name, type, level, is_active, code, fpds_code, cgac, canonical_code, parent_fh_key, full_parent_path_nameby default. (refs #1543, part of #1524) - API (Organizations):
fh_keyis now returned as a zero-padded 9-character string (e.g.,"000000001") everywhere — root fields, expands, and alll{n}_fh_keyfields. Previously returned as a raw integer. (refs #1543) - API (Organizations): New root fields available via shaping:
canonical_code,fpds_org_id,aac_code,start_date,end_date,logo,summary,l1_fh_keythroughl8_fh_key,total_obligations,tree_obligations. (refs #1543) - API (Organizations): New
department(code, name, abbreviation)andagency(code, name, abbreviation)expands let you retrieve legacy-compatible department/agency data from any organization. Returnsnullwhen not applicable (e.g., a department doesn't have a department above it). Safe to use in list responses with mixed hierarchy levels. (refs #1543) - API (Organizations): Enriched
ancestorsexpand now includesleveland cachedshort_name.parentandchildrenexpands now includecodeandcgac. (refs #1543) - Docs: Updated Organizations API Reference and Organizations Data Dictionary with all new fields, expands, and default shape details.
- API (Reference Data): Five reference data endpoints now support the
?shape=query parameter for response shaping:/api/business_types/,/api/mas_sins/,/api/naics/,/api/psc/, and/api/assistance_listings/. Default responses are backward-compatible. (refs #1527, part of #1524) - API (NAICS):
size_standardsandfederal_obligationsare now available as shaping expansions on/api/naics/. Use?shape=code,description,size_standards(*),federal_obligations(*)instead of the legacy?show_limits=1parameter. Detail responses include both expansions by default. (refs #1527) - API (Agencies): Legacy agency endpoints (
/api/departments/,/api/agencies/,/api/offices/) now support the?shape=query parameter for response shaping, letting clients select specific fields per request. (refs #1526, part of #1524) - Docs: API reference pages for Departments, Agencies, and Offices now include Response Shaping sections with available fields, expansions, default shapes, and examples.
- Docs: Reorganized API Reference and Data Dictionary navigation — Organizations moved under "Reference data"; legacy agency endpoints moved to "Shared" section with deprecation notices; new data dictionary pages for Agencies, Departments, and Offices.
- Docs: Response Shaping promoted to top-level documentation — now includes field references for Organizations, GSA eLibrary contracts, Forecasts, and Grants.
- Docs: Added "Guides" section to docs navigation with Quick Start, Authentication, Rate Limits, and Vehicles.
Changed¶
- API (Organizations):
fh_keytype changed from integer to zero-padded string in all API responses. If you parsefh_keyas a number, this is a format change. The integer value is preserved (e.g.,"000000001"→1). (refs #1543) - API (Organizations): Detail endpoint now returns inactive organizations directly — active-only filtering only applies to list requests. Previously,
GET /api/organizations/{fh_key}/returned 404 for inactive orgs unlessinclude_inactive=truewas passed. (refs #1543) - API (Agencies): The
organizationfield has been removed from/api/departments/and/api/agencies/responses. This was an internal FK that leaked an opaque identifier and was never part of the documented API contract. (refs #1526) - API (NAICS): The
?show_limits=1parameter is now deprecated in favor of?shape=code,description,size_standards(*),federal_obligations(*). The legacy parameter still works but has been removed from the OpenAPI/Swagger docs. (refs #1527)
Fixed¶
- API (Organizations): Fixed
childrenexpand performance — now uses prefetch instead of per-row queries. (refs #1543) - API (NAICS): Improved performance for
federal_obligationsexpansion on list endpoints — now uses a single batched query instead of per-item lookups. (refs #1527) - API (Agencies): Fixed
Organization is not JSON serializableerror when requesting/api/agencies/without a?shape=parameter. (refs #1526)
[3.29.2] - 2026-02-26¶
Added¶
- Docs: API Reference Shared page documenting shared response objects (set_aside, office) for shaping.
- Docs: Set-aside codes reference page (Data Dictionary → Reference data); replaces undocumented constant reference (refs makegov/tango-public#44).
- Docs: OpenAPI spec at a stable URL (api/openapi.json) for tools and AI. Single-page HTML at docs/print_page/. Combined markdown at docs/all.md (all public docs in one file). Docs homepage and page head link to the OpenAPI spec for discoverability.
Fixed¶
- API (IDVs): Shaped responses now include
last_date_to_orderunderperiod_of_performancewhen requested viashape=...period_of_performance(start_date,last_date_to_order)(fixes makegov/tango-public#45). - API: Opportunities shaping now supports
set_aside(code,description)expansion (previously only contracts did). Docs no longer reference an undocumented constant; set-aside code list and common response shapes are documented (refs makegov/tango-public#44).
[3.29.0] - 2026-02-25¶
Internal / Infra¶
- Documentation and tooling updates (Cursor agents, session artifacts, docproc).
[3.28.7] - 2026-02-25¶
Added¶
- Opportunities: Change provenance (CDC and field-level source tracking) for opportunity notices and opportunities; source authority:
sam_api,sam_csv,sam_history_api,tango_enrichment.
[3.28.6] - 2026-02-22¶
Fixed¶
- API: Agencies endpoint no longer 500s on cache hits when a cached response entry is malformed; the cache entry is evicted and recomputed. (fixes #1487)
- API: Contracts endpoint no longer 500s on pagination cache hits; cached paginated responses now include renderer metadata so they can be rendered safely. (fixes #1486)
Internal / Infra¶
[3.28.5] - 2026-02-22¶
Added¶
Changed¶
Breaking¶
- API: Contract/award
parent_awardpayload no longer includesawarding_office;idv_typeis now returned as{code, description}.
Fixed¶
- API: Contract/OTA/OTIDV list endpoints avoid unnecessary joins (organizations, offices, recipients, parent awards, place of performance) in default list responses, reducing query time and row width.
- API: Cold-cache list responses do less database work when expanding related fields (recipient, place of performance, parent award, subawards summary), reducing per-row query cost.
Internal / Infra¶
[3.28.4] - 2026-02-21¶
Added¶
- Docs: Index page now links to API Reference and Data Dictionary so readers can discover them without relying on the top nav only.
- Docs: Public documentation pages can be requested with a
.mdextension (e.g./docs/getting-started/response-shaping.md) to receive raw markdown, for easier consumption by LLMs and tools.
Fixed¶
- API: Contract and award list endpoints no longer time out when filtering by awarding or funding agency (e.g.
awarding_agency=CMS). Filtering now uses organization UUIDs under the hood with a legacy fallback for awards that have only office data; response shape forawarding_office/funding_officeis unchanged.
[3.28.2] - 2026-02-19¶
Added¶
- Docs: Documentation pages are available as raw Markdown at stable
/docs/...URLs withContent-Type: text/markdownand 1-day cache for LLM and crawler consumption (refs #1466).
Fixed¶
- API: Read-only endpoints (organizations, departments, agencies, offices, business types, MAS SINs) now apply API key rate limits when
X-API-KEYis sent; previously they did not authenticate API keys and throttled only by anonymous/IP (refs #1469).
[3.28.1] - 2026-02-18¶
Changed¶
- API: Contract and award search now use PostgreSQL
websearch_to_tsqueryfor the search parameter, supporting OR (e.g.cyber OR security), quoted phrases (e.g."cyber security"), and negation (-word). Unquoted words are ANDed. (refs #1405)
Fixed¶
- API: Contract and OTA list endpoints are faster when filtering by UEI, recipient, or PSC with default ordering (refs #1404).
- API: Contract (and award) search no longer times out (504) when the full-text search returns no matches: the fast path now returns an empty result set instead of falling back to a slow LIKE scan. (fixes #1405)
[3.28.0] - 2026-02-15¶
Added¶
- Data: New SAM Awards data pipeline. With FPDS.gov decommissioning on February 24, 2026, Tango is transitioning contract award ingestion from the FPDS Atom feed to SAM.gov's Contract Awards API. The new pipeline runs side-by-side with the existing FPDS loader during the transition period, with full cutover planned for later in FY 2026.
Changed¶
Breaking¶
Fixed¶
Internal / Infra¶
[3.27.8] - 2026-02-13¶
Fixed¶
- API: Keyset (cursor) pagination now returns 400 Bad Request when the cursor contains invalid values (e.g. non-date strings for date fields), instead of a 500 server error. (fixes #1183)
- API: Pagination
next/previouslinks now respect reverse-proxy TLS (viaSECURE_PROXY_SSL_HEADER) so they usehttpswhen the public API is served over HTTPS. (fixes #1436)
[3.27.7] - 2026-02-13¶
Fixed¶
- API: The
shapeparameter is now validated consistently: invalid/malformed shapes return 400 Bad Request with a structured error (error,issues) instead of 500, and endpoints without shaping support return 400 instead of ignoringshape. (fixes #1351)
[3.27.6] - 2026-02-13¶
Added¶
- Signup: Optional marketing communications opt-in checkbox on the complete signup page. (closes #1431)
Internal / Infra¶
- Docs conformance: expanded API reference filter documentation across awards/opportunities/grants/forecasts and aligned docs parsing with runtime filters. (refs #1439)
[3.27.5] - 2026-02-12¶
Added¶
- IDVs API: Expose GSA eLibrary enrichment on IDV list/detail responses and via response shaping (
gsa_elibrary(...)). (refs #1416) - GSA eLibrary API: Add direct endpoints for persisted GSA eLibrary contract metadata at
/api/gsa_elibrary_contracts/(filters + ordering + shaping). Responses includerecipient(cached entity basics) and best-effortidvbasics, and pagination uses exact counts. (refs #1416)
Breaking¶
- GSA eLibrary: Remove
last_updatedfrom GSA eLibrary response payloads (including IDVgsa_elibraryenrichment and shaping). - GSA eLibrary API:
/api/gsa_elibrary_contracts/filters changed — removeexternal_idandlast_updated_*; renameidv_key/idv_piidtokey/piid.
[3.27.4] - 2026-02-10¶
Added¶
- Docs: add a comprehensive rate limits guide and align header/429 examples with runtime behavior. (refs #1425)
- Docs: add external references for NAICS and PSC pages. (refs #1425)
[3.27.3] - 2026-02-09¶
Added¶
- Reference data API: Add MAS SINs reference endpoint at
/api/mas_sins/and loader-backed reference table for normalized SIN metadata. (refs #1417) - Account onboarding: new
/welcome/page used as the authenticated home experience, with quick links and a compact plan summary + upgrade/change CTA. (refs #1412)
Fixed¶
- Social signup: more reliable redirect behavior after first-time social signup (avoid landing on profile due to
next=propagation). (refs #1412) - UI: improve help-text contrast for USWDS hint styling on signup/account pages. (refs #1412)
[3.27.1] - 2026-02-07¶
Fixed¶
- Opportunities API:
notice_historyandmeta.notices_countnow reflect the best-available notice history for an opportunity (preferlatest_notice, otherwise fall back to the most recently refreshed notice), avoiding undercounting whenfirst_noticehas stale history. (fixes #1418)
[3.27.0] - 2026-02-05¶
Fixed¶
- sync_organizations: Improve scheduled runs so failures surface properly, add durable loader error logging, and reduce alias rebuild churn.
[3.26.11] - 2026-02-04¶
Added¶
- IDVs API: IDV list/detail responses now include
vehicle_uuid(UUID of the Tango Vehicle the IDV is grouped under) for easier linking to/api/vehicles/{uuid}/. (refs #1406)
[3.26.10] - 2026-02-03¶
Added¶
- Entities API: New filters on the entity list endpoint:
total_awards_obligated_gte– entities with total obligations ≥ value (USD)total_awards_obligated_lte– entities with total obligations ≤ value (USD)- Total obligated is derived from the entities_awards_totals materialized view (contracts + subawards only; IDV/OTA/OTIDV obligations are not included). The filter is MV-backed for performance.
- Invalid range (e.g. gte > lte) returns a
BadSearchRequesterror. (refs #1146)
[3.26.9] - 2026-02-02¶
Added¶
- Organizations API: Lookup by historical
fh_key(e.g. after an organization merge) now resolves to the merged organization. When the requestedfh_keyis not the current one, the API returns 301 Moved Permanently to the canonical URL/api/organizations/<current_fh_key>/, preserving query parameters. (refs #1146) - sync_organizations: Federal Hierarchy (FH) input can be provided via
--local-fileor--s3-object(FileMixin). Each FH file is processed by a dedicated loader and recorded in File Processing History (FPH) and per-file results. (refs #1146) - Docs: add Data Dictionary + API Reference landing pages, plus new filtering/ordering reference pages for Contracts, Entities, IDVs, and Vehicles. (refs #1396)
- Docs: expand API Reference pages to cover most endpoint groups (excluding
assistance), including organizations/agencies/opportunities/notices/forecasts/grants, awards (OTAs/OTIDVs/subawards), and reference data (business_types,assistance_listings, NAICS, PSC). (refs #1396) - Docs: add a “Report an issue with this page” link at the bottom of every docs page, prefilled to create a GitHub issue for the current page URL. (refs #1396)
- Docs: add project rule and validate-docs checklist to keep MkDocs, Swagger/OpenAPI, and code aligned (
.cursor/rules/documentation.mdc,.cursor/commands/validate-docs.md). (refs #1396)
Changed¶
- Docs: API Reference overview page reorganized to match nav (Awards, Organizations, Opportunities, Other, Reference data). (refs #1396)
- Docs build: make MkDocs overrides + custom CSS first-class (
docs/overrides/,docs/stylesheets/extra.css) and improvebuild_docspath resolution across Docker bind-mount layouts. (refs #1396)
[3.26.8] - 2026-02-01¶
Added¶
- Subawards: support ordering by
last_modified_dateon/api/subawards/and contract-scoped subaward lists. (closes #1297)
Breaking¶
- API: the
orderingquery param is now strictly validated; invalid/unsupported ordering values return HTTP 400 instead of being ignored or causing 500s. (closes #1297) - Forecasts API: ordering is now limited to
anticipated_award_date,fiscal_year, andtitle. (closes #1297)
[3.26.7] - 2026-01-30¶
Changed¶
- API docs: add admin control to Swagger schema visibility. (closes #1314)
[3.26.6] - 2026-01-29¶
Fixed¶
- Vehicles API: fixed shaped vehicle responses so
descriptionsnever containsnullelements when some member IDVs havedescription = NULL. (fixes #1369)
[3.26.5] - 2026-01-28¶
Changed¶
- Docs: the Webhooks Partner Guide now uses the canonical hyphenated path under
/docs/webhooks-user-guide/(instead of the older underscore form).
Breaking¶
- API: removed the deprecated
/api/subscriptions/endpoints. Use/api/webhooks/subscriptions/instead. (closes #1246)
[3.26.4] - 2026-01-28¶
Added¶
- Vehicles API: new
GET /api/vehicles/{uuid}/orders/endpoint returns all task orders (contracts) issued against all IDVs within a vehicle. Supports pagination, response shaping, filtering, search, and transaction expansion. Task orders are ordered by-award_date, -uuid(newest first) by default, with support for custom ordering via?ordering=parameter (e.g.,?ordering=-obligated,?ordering=recipient_name). (closes #1356) - Vehicles API: you can now sort vehicles by activity metrics using the
?ordering=query parameter. Available fields: vehicle_obligations- Sort by total obligations across all IDVs in the vehiclelatest_award_date- Sort by the most recent IDV award date in the vehicle- Use
-prefix for descending order (e.g.,?ordering=-vehicle_obligations) - Combine multiple fields (e.g.,
?ordering=-vehicle_obligations,-latest_award_date) - Default ordering (when no
?ordering=is provided) remains unchanged. (closes #1357)
Fixed¶
- Vehicles API: fixed inconsistency where the default response includes a
descriptionfield, but theshapeparameter only accepteddescriptions. Both field names are now accepted in shaping requests (e.g.,?shape=descriptionor?shape=descriptions). (closes #1362) - API: fixed case-sensitivity issue with
recipientfilter parameter. The filter now works case-insensitively, so searches like?recipient=Deloitte,?recipient=deloitte, and?recipient=DELOITTEall return the same results. This affects/api/contracts,/api/subawards, and other endpoints using recipient filtering. (fixes #1345)
[3.26.3] - 2026-01-27¶
Fixed¶
- Awards: contract obligation time-series metrics are now attributed to the transaction month (instead of the award date), improving trend accuracy for NAICS/PSC and recipient rollups. (fixes #1268)
[3.26.0] - 2026-01-25¶
Added¶
- Data provenance & auditing (Organizations + Entities): Tango now records field-level provenance and per-row audit logs for key datasets so we can answer “where did this value come from?” and “when did it last change?” more reliably.
- Covered models so far: Organizations and Entities (including entity relationships).
- This work is currently not exposed via the API (no new endpoints/fields), but it improves our ability to debug discrepancies, explain changes, and harden future data quality guarantees.
- Read more: Provenance & auditing.
Fixed¶
- Entities ingestion is more robust to inconsistent upstream typing for certification date fields.
- Entities ingestion is now robust to SAM certification date “vector” formats (e.g.
2024-09-17~2024-09-17,null~null), preventing ingestion failures for affected rows. - Entities: fixed recipient filter to enable partial name matching for single-word and short multi-word queries (e.g., "HARVARD" now matches "PRESIDENT AND FELLOWS OF HARVARD COLLEGE"). Previously, exact matching was attempted first, which could skip full-text search and return incomplete results. (fixes #1333)
[3.25.0] - 2026-01-20¶
Added¶
- Awards: new Vehicles API endpoints under
/api/vehicles/to discover and inspect solicitation-based "vehicles" built from IDVs. (closes #1313) GET /api/vehicles/: full-text search via?search=(vehicle-level).GET /api/vehicles/{uuid}/: detail endpoint supports response shaping, includingawardees(...)expansion of the underlying IDVs.- Vehicles are stable: the
uuidis deterministic from \(solicitation_identifier, agency identifier derived from the IDVkey\) so it remains consistent across refreshes. - Optional:
?search=on the detail endpoint filters expanded awardees (not the vehicle itself) whenshapeincludesawardees(...). - Exposes
organization_id(best-effort mapping into/api/organizations/) to support consistent agency filtering and joins.
Fixed¶
- Awards: fixed Swagger/OpenAPI documentation for IDV summary endpoints (closes #1312)
- Removed duplicate
identifierpath parameter declarations - Fixed example generator to correctly detect list vs retrieve actions
- Fixed Swagger examples to use realistic values and proper pagination structure
Internal / Infra¶
- Awards: added a vehicles refresh pipeline (
refresh_vehicles) that rebuildsawards_vehicle,awards_vehicle_award, andawards_vehicle_stats_mvfromawards_idvand reuses existing award search vectors for vehicle search. (refs #1313)
[3.24.1] - 2026-01-12¶
Internal / Infra¶
- Awards: ETL now refreshes awards search tables for contracts, IDVs, OTAs, and OTIDVs via
refresh_awards_search. (closes #1294) - Subawards: add
award_uuidfor deterministic association to prime awards; populate on ingest. (closes #1298)
[3.24.0] - 2026-01-10¶
Internal / Infra¶
- Awards: infrastructure and performance improvements to support faster, more consistent search behavior across award types (contracts, IDVs, OTAs, OTIDVs). (refs #1278)
[3.23.2] - 2026-01-08¶
Added¶
- Account: your account page now shows your daily requests remaining (and when it resets).
- Account: improved signup emails (welcome email + admin notifications) with updated branding. (closes #280)
Changed¶
- Account: API keys now explicitly note that they share the same account rate limits.
[3.23.1] - 2026-01-08¶
Added¶
- Account: manage API keys from your account page (create, revoke, delete) to support key rotation. (closes #1269)
[3.23.0] - 2026-01-07¶
Added¶
- Webhooks: expanded webhook coverage beyond awards to include entities, opportunities, grants, and forecasts (including new/create-style events for opportunities, grants, and forecasts). See the Webhooks partner guide.
- Webhooks: entities now emit explicit new entity events (
entities.new_entity) when a new entity appears (in addition toentities.updated). - Webhooks: subscriptions now support richer filtering via subjects (e.g. entity UEI, award key, agency, notice ID, notice type), so you can subscribe more precisely.
- Webhooks: new discovery endpoint to list supported event types and subject types (
GET /api/webhooks/event-types/).
Changed¶
- Webhooks: improved “data is ready” guarantees; events are published only once the underlying data is queryable via the API (including publishing opportunity updates at the end of loading, not during maintenance processing).
- Webhooks: legacy immediate-dispatch buffering has been removed; webhooks are now produced via the outbox + publish pipeline.
- Webhooks: duplicate subscription configurations are now rejected per endpoint (prevents accidentally subscribing to the same thing twice).
- Webhooks: sample payload endpoint now returns Tango-shaped sample deliveries for all supported event types and includes copy/paste subscription examples.
Breaking¶
- Webhooks:
GET /api/webhooks/endpoints/sample-payload/has a new contract. It now accepts?event_type=<event_type>and returnssample_delivery/sample_subjects/sample_subscription_requests(the legacyentity_type/change_typequery params and response shape are no longer supported). - Webhooks: award events no longer include legacy
resource_id, and award identifiers are now delivered asaward_key(notaward_id). Update any webhook handlers that were reading the old fields. - Webhooks (legacy): subscriptions that use
event_type: "entity_awards"will not match v2 award events. Migrate toawards.new_award/awards.new_transactionwithsubject_type: "entity"(UEI).
Deprecated¶
- Webhooks: The
/api/subscriptions/endpoints are deprecated and will be removed in a future release. Please migrate to/api/webhooks/subscriptions/instead. The deprecated endpoints remain functional but are no longer documented in Swagger.
[3.22.7] - 2025-12-31¶
Fixed¶
- Fixed an internal opportunities ingestion failure when rebuilding notice history could encounter NULL IDs. (fixes #1257)
- Awards: ensure deterministic ordering for smart-filtered award queries by appending
-keyas a tiebreaker when ordering byaward_date. (fixes #1254)
[3.22.5] - 2025-12-30¶
Added¶
- Cursor pagination now supports backwards navigation via
previouslinks. (closes #1097) - Add
obligated_gteandobligated_ltefilters to/api/contracts/. (closes #1138)
Changed¶
- Opportunities ingestion is now faster, improving update freshness. (addresses #1248)
- Admin: bulk enable/disable API maintenance rules. (closes #1241)
Fixed¶
- Fixed duplicate
WHERE ... IN (...)predicates in contract queries when filtering by awarding/funding agency. (fixes #1247) - Improved DSBS enrichment reliability/performance and reduced lock contention with entity loads. (fixes #1238) (closes #1239) (fixes #1240) (addresses #949)
[3.22.4] - 2025-12-24¶
Changed¶
- Improved the “Get API access” sign-in page to make account creation and sign-in clearer. (closes #1233)
Fixed¶
- Social sign-in now preserves redirect destinations more reliably (e.g.
?next=...). (fixes #1233)
[3.22.3] - 2025-12-23¶
Added¶
- Improved contract search performance for large result sets via a new count estimation helper.
Fixed¶
- API requests now fail fast with a clean 504 when Postgres statement/lock timeouts are hit, instead of timing out at the proxy.
- Opportunities rollups avoid spurious updates when incoming values are NULL, and notice status maintenance is faster via a single-pass UPSERT.
[3.22.2] - 2025-12-22¶
Changed¶
- Internal improvements to organization management and data synchronization.
[3.22.0] - 2025-12-21¶
Added¶
- Organizations: a unified federal organization hierarchy (departments, agencies, and offices) with powerful search and filtering via
/api/organizations/. - Better organization identifiers: stable organization UUIDs (
key), SAM Federal Hierarchy keys (fh_key), and operational codes like CGAC / FPDS codes (when available), so you can reliably map transaction data to the right org. - Organization rollups: obligation rollups for organizations (including descendants) to support exploration and analytics.
Changed¶
- Agency/org consistency: agency-related behavior across the API now uses the unified Organizations hierarchy, improving hierarchy consistency and organization matching across endpoints.
Documentation¶
- Organizations endpoint data dictionary: Organizations
- Background on the federal hierarchy + why org matching is hard: Federal agency hierarchy
[3.21.11] - 2025-12-16¶
Added¶
- NAICS and PSC descriptions now available in awards endpoint response shapes
Fixed¶
- Redis connection stability issues
[3.21.10] - 2025-12-15¶
Fixed¶
- Cache warming CROSSSLOT key hashing errors
- Bulk entities endpoint post-caching changes
[3.21.0] - 2025-12-09¶
Added¶
- API key authentication caching with 1-hour TTL and cache reconstruction
Changed¶
- API authentication reconstructs APIKey and User objects from cache to avoid database queries
- API pagination cache keys standardized for more consistent caching
[3.20.9] - 2025-11-28¶
Added¶
- Officer expand configuration in response shaping
[3.20.4] - 2025-11-23¶
Added¶
- Quick-start documentation (
docs/getting-started/quick-start.md) with response shaping examples
[3.18.11] - 2025-11-11¶
Fixed¶
- Critical fix for
generate_unique_award_keyfunction
[3.18.10] - 2025-11-07¶
Changed¶
- Pagination enhanced with search hit ordering
[3.18.6] - 2025-10-27¶
Added¶
ApiMaintenanceRulemodel for endpoint-level maintenance control- API maintenance middleware
[3.17.16] - 2025-10-10¶
Added¶
cursorproperty now included in paginated responses
Fixed¶
- Cache pagination edge cases
- Caching and cursor interaction conflict
[3.17.12] - 2025-10-07¶
Changed¶
- Pagination
nulls_lastparameter handling for nullable vs non-nullable fields
[3.17.7] - 2025-10-01¶
Added¶
- Webhooks are now ordered predictably for pagination
Changed¶
- Webhook delivery timeout configuration added (30s connect, 60s read/write)
Fixed¶
- Missing
sam_urlfield in opportunities response shaping
[3.17.0] - 2025-09-26¶
Added¶
- Response shaping system: clients can now customize API response fields using the
shapequery parameter
[3.14.0] - 2025-08-08¶
Fixed¶
- Broken cache key for opportunity attachments
- Invalid
select_relatedfield in OTIDV API endpoint
[3.13.9] - 2025-08-07¶
Changed¶
- Performance improvements in agencies and recipients endpoints
[3.13.4] - 2025-08-01¶
Changed¶
- Opportunity endpoint performance
[3.13.0] - 2025-07-28¶
Added¶
- GitHub OAuth social authentication
[3.12.5] - 2025-07-23¶
Changed¶
- Pagination ordering logic in opportunities
[3.11.2] - 2025-06-29¶
Changed¶
- API filters for agency search performance
[3.10.2] - 2025-06-19¶
Added¶
- Webhook system improvements
Changed¶
- Webhook delivery improvements
Fixed¶
- G2X wrapper bug (hotfix)
[3.10.0] - 2025-06-17¶
Added¶
- Webhook delivery includes retry logic and error handling
- Webhook subscriptions can filter by entity type and entity IDs
- Webhook buffering and deduplication to prevent duplicate deliveries
Changed¶
- Award and entity updates now trigger webhook events on data changes
- Award transaction updates now emit webhook events
[3.7.6] - 2025-05-25¶
Fixed¶
- Swagger documentation routing (corrected
/api/apipath)
[3.7.5] - 2025-05-22¶
Fixed¶
- Bulk entities endpoint tweaks
[3.7.4] - 2025-05-20¶
Added¶
- Swagger docs now include realistic API response examples
- Swagger docs now include examples for agencies, awards, entities, grants, and opportunities
- OpenAPI schema customization improvements
- Swagger documentation organization improvements
Changed¶
- API viewsets now use generated examples for Swagger UI instead of static/hardcoded data
[3.7.0] - 2025-05-12¶
Added¶
- Grant pagination system with cursor support
[3.6.0] - 2025-05-02¶
Fixed¶
- Notice and opportunity loading deduplication and data integrity issues
[3.5.0] - 2025-04-27¶
Changed¶
- Metrics models rebuilt with consistent schema across NAICS, PSC, and entities
[3.4.0] - 2025-04-23¶
Changed¶
- API serializers updated with improved field selection logic
[3.3.1] - 2025-04-21¶
Fixed¶
- PSC detail endpoint query logic
[3.2.0] - 2025-04-11¶
Added¶
- Entity display name ordering index
Changed¶
- Pagination responses now include consistent
count,next,previous,resultsstructure across all endpoints
Fixed¶
- Entity ordering and caching logic edge cases
[3.1.0] - 2025-04-04¶
Changed¶
- Subaward field mapping aligned with USASpending schema changes
[3.0.4] - 2025-03-27¶
Added¶
- API key authentication
- Automatic default API key creation for new users
Changed¶
- Accounts page updated with API key management
[3.0.0] - 2025-03-25¶
Added¶
- Keyset (cursor-based) pagination system for awards with
cursorandlimitquery parameters - Cursor encoding/decoding using Base64-encoded composite keys (date + unique key)
Changed¶
- Pagination now supports approximate counts via
get_approximate_countfor performance - Cached pagination increased to 30-day TTL for static models (NAICS, PSC) with 10K max page size
[2.6.21] - 2025-03-18¶
Added¶
- Entities endpoint includes summary metrics
[2.6.20] - 2025-03-15¶
Added¶
- NAICS and PSC code metrics endpoints
[2.6.19] - 2025-03-14¶
Added¶
- Basic entity metrics API support
[2.6.13] - 2025-02-18¶
Added¶
psc_codefiltering oncontractsendpoint
[2.6.11] - 2025-02-03¶
Added¶
- New aggregate view for aggregated award data (for faster API responses)
[2.6.10] - 2025-01-26¶
Added¶
- More fields on
assistance_transactionsendpoint
[2.6.6] - 2025-01-03¶
Fixed¶
- Filtering by NAICS/PSC combo
[2.6.1] - 2024-12-01¶
Fixed¶
- Date filters returning incorrect opportunities
[2.6.0] - 2024-11-28¶
Added¶
related_entitiesendpointbase_notice_type_codeadded to API responses
[2.5.0] - 2024-11-25¶
Added¶
- Entity summary endpoint
[2.1.5] - 2024-11-22¶
Changed¶
- Opportunity management API improvements
[2.0.0] - 2024-11-11¶
Changed¶
- Opportunities schema updates for improved structure and usability
[1.5.1] - 2024-11-04¶
Added¶
- Ordering parameters added to
contractsandidvsendpoints
Changed¶
- Default ordering for
contractsandidvsendpoints changed toaward_date
[1.4.5] - 2024-10-11¶
Added¶
assistance_listingsendpointversionendpoint
Changed¶
business_typesdetail endpoint now properly accepts business type codes- Breaking:
last_updated_timerenamed tolast_updatedonnoticesandopportunitiesendpoints
[1.4.0] - 2024-09-27¶
Added¶
pscparameter (endpoints:notices,opportunities)place_of_performanceparameter (endpoints:notices,opportunities)- Disjunctive search for
agency,naics,office,psc(endpoints: all)
Changed¶
- Breaking: Standardized all API endpoints to use
limit(replacingpage_sizewhere applicable) - Breaking: Renamed
naics_codetonaicsfornoticesandopportunitiesendpoints - Removed alphabetical sorting of parameters (endpoints: all)