Skip to content

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.

Production Badge

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 name field is now user-chosen (previously auto-set to username)
  • Webhooks: Subscription creation accepts an endpoint UUID 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 endpoint field 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 name field is now user-chosen (previously auto-set to username)
  • Webhooks: Subscription creation accepts an endpoint UUID to target a specific endpoint; auto-resolves for single-endpoint users

Breaking

  • Webhooks API: Users with multiple endpoints must now include an endpoint field 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 a 400 with 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), and business_size(code,description) expansions
  • API (CALC Rates): Default shape applied automatically; ?flat=true works without an explicit ?shape= parameter
  • API: New RequiresAccessLevel generic tier-based permission class for endpoint gating
  • API: New PremiumQueryThrottle for premium query rate limiting on expensive endpoints

Fixed

  • API (Entities): Fixed an issue that could prevent the past_performance expansion data from refreshing correctly (fixes #1710)
  • API (Protests): ?flat=true without 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_performance expansion on /api/entities/ — aggregated contract history showing top agencies, NAICS/PSC codes, and obligation totals. Use ?shape=uei,past_performance(*) for defaults or past_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_key or a UUID key as the URL parameter. Historical fh_key redirects (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 includes match_confidence ("confident" or "review") and a human-readable rationale. Low-confidence matches return null.
  • API: Paginated endpoints that use approximate counts (contracts, IDVs, opportunities, notices) now support ?exact=true to 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-CountType header (exact or approximate) indicating whether the count is exact or estimated.

Breaking

  • API: The count_type field has been removed from paginated response bodies. Count exactness is now reported exclusively via the X-Results-CountType response header.

Fixed

  • API: X-Results-CountType header now correctly reports exact when the count is known to be exact, instead of always reporting approximate.
  • 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=true schema discovery now includes expand names in the fields list. Previously, expand-only names (e.g., recipient, awarding_office) appeared under expands but were missing from fields, 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 includes last_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, and award_type are now expandable to {code, description} via ?shape=. award_type uses 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 a naics_code field or naics expand. (refs #1600)
  • API (OTIDVs): Full response shaping support. type_of_ot_agreement and extent_competed are 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 a naics_code field or naics expand. (refs #1600)
  • Docs: Documented wildcard_fields property in available_fields schema — when true, the expansion accepts arbitrary field names (freeform JSON like raw_data(*)); when false, 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_fields in available_fields schema was serialized as the string "False" instead of JSON false in 400 error responses (e.g., invalid shape requests). The ?show_shapes=true path was unaffected. All shaped endpoints are now consistent. (refs #1600)
  • API (IDVs): Pagination count on /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 count on /api/vehicles/{uuid}/awardees/ now returns an exact value instead of an EXPLAIN-based estimate. (refs #1601)
  • API (Vehicles): ?exact=true on /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_hints listing 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_text in 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=true were triggering a slow COUNT(*) 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=1 to /api/vehicles/{uuid}/orders/ would bypass the fast path, causing ~15s response times and inaccurate counts. The page parameter is now ignored (this endpoint uses cursor pagination). (refs #1624)

[3.31.3] - 2026-03-04

Added

  • API (Shaping): ?show_shapes=true on any shaped endpoint appends a _shaping key at the bottom of the response containing available_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_fields at 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_shapes and the _shaping response block. (refs #1545)

Breaking

  • Entities API: relationships is 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 includes relationships by 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 a display expand 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 by case_id. Use ?shape=...,dockets(*) to expand docket-level data. Gated behind PROTESTS_API feature flag.

[3.31.0] - 2026-03-03

Breaking

  • Awards: removed the deprecated IDV summary endpoints (GET /api/idvs/{identifier}/summary/ and GET /api/idvs/{identifier}/summary/awards/). Use the Vehicles API (GET /api/vehicles/ and GET /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 with meta(*), office(*), place_of_performance(*) expanded by default. Detail responses additionally include attachments(*), description, notice_history(*), primary_contact(*). (refs #1530, part of #1524)
  • API (Opportunities): set_aside is now expandable to {code, description} via ?shape=set_aside(code,description) or set_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, plus agency(*), department(*), and latest_notice(notice_id,link).
  • API (Notices): /api/notices/ now has a default shape — all responses go through the shaping pipeline. List responses expand address(*), meta(*), office(*), opportunity(*), place_of_performance(*) by default. Detail responses additionally include archive(*), primary_contact(*), secondary_contact(*). (refs #1530, part of #1524)
  • API (Notices): set_aside is 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_number is now available as a shapeable field (previously only in serializer output). (refs #1530)
  • API (Notices): opportunity_id is 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, returning key, fh_key, name, short_name, type, level, is_active, code, fpds_code, cgac, canonical_code, parent_fh_key, full_parent_path_name by default. (refs #1543, part of #1524)
  • API (Organizations): fh_key is now returned as a zero-padded 9-character string (e.g., "000000001") everywhere — root fields, expands, and all l{n}_fh_key fields. 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_key through l8_fh_key, total_obligations, tree_obligations. (refs #1543)
  • API (Organizations): New department(code, name, abbreviation) and agency(code, name, abbreviation) expands let you retrieve legacy-compatible department/agency data from any organization. Returns null when 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 ancestors expand now includes level and cached short_name. parent and children expands now include code and cgac. (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_standards and federal_obligations are now available as shaping expansions on /api/naics/. Use ?shape=code,description,size_standards(*),federal_obligations(*) instead of the legacy ?show_limits=1 parameter. 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_key type changed from integer to zero-padded string in all API responses. If you parse fh_key as 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 unless include_inactive=true was passed. (refs #1543)
  • API (Agencies): The organization field 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=1 parameter 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_award in contract and IDV responses is now a minimal {key, piid} reference — no database query required. To get the full parent award object, use the shape parameter with parent_award(key,piid) or parent_award(*). OTIDV endpoints are unchanged. (refs #1576)

Breaking

  • API (Financial assistance): Removed the financial_assistance app and the assistance transactions API surface. CFDA reference data via AssistanceListing remains (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 as field(*) 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. Grants status).
  • 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 children expand performance — now uses prefetch instead of per-row queries. (refs #1543)
  • API (NAICS): Improved performance for federal_obligations expansion on list endpoints — now uses a single batched query instead of per-item lookups. (refs #1527)
  • API (Agencies): Fixed Organization is not JSON serializable error when requesting /api/agencies/ without a ?shape= parameter. (refs #1526)

[3.30.2] - 2026-03-01

Fixed

  • API (Entities): Fixed a crash (AttributeError) when federal_obligations data is None for 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_obligations is now an expand-only field supporting child selection — use federal_obligations(*) for both total and active, or federal_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 consistently address_line1, zip_code, state_or_province_code. SAM-loaded entities (the majority) already used snake_case and are unaffected. (refs #1531)
  • API (Entities): business_types expanded via business_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_types expanded via sba_business_types(*) now always returns [{code, description, entry_date, exit_date}] arrays, with the same dict-to-array normalization as business_types. (refs #1531)
  • API (Entities): naics_codes expanded via naics_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/_desc leaf fields. Description fallbacks by field: entity_structureENTITY_STRUCTURE_MAP; entity_type, profit_structure, organization_structureBUSINESS_TYPE_MAP; country_of_incorporationdjango-genc (GENC country names); purpose_of_registrationPURPOSE_OF_REGISTRATION_MAP; state_of_incorporation → model value only. (refs #1531)

Fixed

  • API (Grants): status as a root leaf field now correctly maps to the underlying opportunity_status model attribute. (refs #1531)
  • API (Grants): attachments expand fixed for correct query behavior (was using invalid select_related on a reverse FK). (refs #1531)
  • API (Grants): Removed attachment_id from grant attachments — field does not exist on the model. Use resource_id as the attachment identifier. (refs #1531)
  • API (Grants): important_dates, funding_details, grantor_contact, and additional_info expands 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) and cfda_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_data memoized 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 and TestInvalidShapeField parametrized 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, returning key, fh_key, name, short_name, type, level, is_active, code, fpds_code, cgac, canonical_code, parent_fh_key, full_parent_path_name by default. (refs #1543, part of #1524)
  • API (Organizations): fh_key is now returned as a zero-padded 9-character string (e.g., "000000001") everywhere — root fields, expands, and all l{n}_fh_key fields. 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_key through l8_fh_key, total_obligations, tree_obligations. (refs #1543)
  • API (Organizations): New department(code, name, abbreviation) and agency(code, name, abbreviation) expands let you retrieve legacy-compatible department/agency data from any organization. Returns null when 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 ancestors expand now includes level and cached short_name. parent and children expands now include code and cgac. (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_standards and federal_obligations are now available as shaping expansions on /api/naics/. Use ?shape=code,description,size_standards(*),federal_obligations(*) instead of the legacy ?show_limits=1 parameter. 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_key type changed from integer to zero-padded string in all API responses. If you parse fh_key as 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 unless include_inactive=true was passed. (refs #1543)
  • API (Agencies): The organization field 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=1 parameter 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 children expand performance — now uses prefetch instead of per-row queries. (refs #1543)
  • API (NAICS): Improved performance for federal_obligations expansion on list endpoints — now uses a single batched query instead of per-item lookups. (refs #1527)
  • API (Agencies): Fixed Organization is not JSON serializable error 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_order under period_of_performance when requested via shape=...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_award payload no longer includes awarding_office; idv_type is 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 .md extension (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 for awarding_office / funding_office is unchanged.

[3.28.2] - 2026-02-19

Added

  • Docs: Documentation pages are available as raw Markdown at stable /docs/... URLs with Content-Type: text/markdown and 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-KEY is 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_tsquery for 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/previous links now respect reverse-proxy TLS (via SECURE_PROXY_SSL_HEADER) so they use https when the public API is served over HTTPS. (fixes #1436)

[3.27.7] - 2026-02-13

Fixed

  • API: The shape parameter 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 ignoring shape. (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 include recipient (cached entity basics) and best-effort idv basics, and pagination uses exact counts. (refs #1416)

Breaking

  • GSA eLibrary: Remove last_updated from GSA eLibrary response payloads (including IDV gsa_elibrary enrichment and shaping).
  • GSA eLibrary API: /api/gsa_elibrary_contracts/ filters changed — remove external_id and last_updated_*; rename idv_key/idv_piid to key/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_history and meta.notices_count now reflect the best-available notice history for an opportunity (prefer latest_notice, otherwise fall back to the most recently refreshed notice), avoiding undercounting when first_notice has 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 BadSearchRequest error. (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 requested fh_key is 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-file or --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 improve build_docs path resolution across Docker bind-mount layouts. (refs #1396)

[3.26.8] - 2026-02-01

Added

  • Subawards: support ordering by last_modified_date on /api/subawards/ and contract-scoped subaward lists. (closes #1297)

Breaking

  • API: the ordering query 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, and title. (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 descriptions never contains null elements when some member IDVs have description = 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 vehicle
  • latest_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 description field, but the shape parameter only accepted descriptions. Both field names are now accepted in shaping requests (e.g., ?shape=description or ?shape=descriptions). (closes #1362)
  • API: fixed case-sensitivity issue with recipient filter parameter. The filter now works case-insensitively, so searches like ?recipient=Deloitte, ?recipient=deloitte, and ?recipient=DELOITTE all 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, including awardees(...) expansion of the underlying IDVs.
  • Vehicles are stable: the uuid is deterministic from \(solicitation_identifier, agency identifier derived from the IDV key\) so it remains consistent across refreshes.
  • Optional: ?search= on the detail endpoint filters expanded awardees (not the vehicle itself) when shape includes awardees(...).
  • 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 identifier path 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 rebuilds awards_vehicle, awards_vehicle_award, and awards_vehicle_stats_mv from awards_idv and 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_uuid for 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 to entities.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 returns sample_delivery/sample_subjects/sample_subscription_requests (the legacy entity_type/change_type query params and response shape are no longer supported).
  • Webhooks: award events no longer include legacy resource_id, and award identifiers are now delivered as award_key (not award_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 to awards.new_award / awards.new_transaction with subject_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 -key as a tiebreaker when ordering by award_date. (fixes #1254)

[3.22.5] - 2025-12-30

Added

  • Cursor pagination now supports backwards navigation via previous links. (closes #1097)
  • Add obligated_gte and obligated_lte filters 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

[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_key function

[3.18.10] - 2025-11-07

Changed

  • Pagination enhanced with search hit ordering

[3.18.6] - 2025-10-27

Added

  • ApiMaintenanceRule model for endpoint-level maintenance control
  • API maintenance middleware

[3.17.16] - 2025-10-10

Added

  • cursor property now included in paginated responses

Fixed

  • Cache pagination edge cases
  • Caching and cursor interaction conflict

[3.17.12] - 2025-10-07

Changed

  • Pagination nulls_last parameter 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_url field in opportunities response shaping

[3.17.0] - 2025-09-26

Added

  • Response shaping system: clients can now customize API response fields using the shape query parameter

[3.14.0] - 2025-08-08

Fixed

  • Broken cache key for opportunity attachments
  • Invalid select_related field 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/api path)

[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, results structure 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 cursor and limit query parameters
  • Cursor encoding/decoding using Base64-encoded composite keys (date + unique key)

Changed

  • Pagination now supports approximate counts via get_approximate_count for 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_code filtering on contracts endpoint

[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_transactions endpoint

[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_entities endpoint
  • base_notice_type_code added 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 contracts and idvs endpoints

Changed

  • Default ordering for contracts and idvs endpoints changed to award_date

[1.4.5] - 2024-10-11

Added

  • assistance_listings endpoint
  • version endpoint

Changed

  • business_types detail endpoint now properly accepts business type codes
  • Breaking: last_updated_time renamed to last_updated on notices and opportunities endpoints

[1.4.0] - 2024-09-27

Added

  • psc parameter (endpoints: notices, opportunities)
  • place_of_performance parameter (endpoints: notices, opportunities)
  • Disjunctive search for agency, naics, office, psc (endpoints: all)

Changed

  • Breaking: Standardized all API endpoints to use limit (replacing page_size where applicable)
  • Breaking: Renamed naics_code to naics for notices and opportunities endpoints
  • Removed alphabetical sorting of parameters (endpoints: all)