tango-python 1.12.0__tar.gz → 1.13.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. {tango_python-1.12.0 → tango_python-1.13.0}/CHANGELOG.md +16 -0
  2. {tango_python-1.12.0 → tango_python-1.13.0}/PKG-INFO +1 -1
  3. {tango_python-1.12.0 → tango_python-1.13.0}/docs/API_REFERENCE.md +13 -3
  4. {tango_python-1.12.0 → tango_python-1.13.0}/pyproject.toml +1 -1
  5. {tango_python-1.12.0 → tango_python-1.13.0}/tango/__init__.py +1 -1
  6. {tango_python-1.12.0 → tango_python-1.13.0}/tango/client.py +13 -1
  7. {tango_python-1.12.0 → tango_python-1.13.0}/tango/models.py +9 -3
  8. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/explicit_schemas.py +5 -0
  9. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/generated_overlay.py +3 -0
  10. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists +39 -35
  11. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_with_metrics_expansion +41 -37
  12. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape +44 -40
  13. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_orders_uses_default_shape +56 -52
  14. tango_python-1.13.0/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search +150 -0
  15. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_client.py +63 -0
  16. tango_python-1.12.0/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search +0 -150
  17. {tango_python-1.12.0 → tango_python-1.13.0}/.gitignore +0 -0
  18. {tango_python-1.12.0 → tango_python-1.13.0}/LICENSE +0 -0
  19. {tango_python-1.12.0 → tango_python-1.13.0}/README.md +0 -0
  20. {tango_python-1.12.0 → tango_python-1.13.0}/docs/CLIENT.md +0 -0
  21. {tango_python-1.12.0 → tango_python-1.13.0}/docs/DYNAMIC_MODELS.md +0 -0
  22. {tango_python-1.12.0 → tango_python-1.13.0}/docs/ERRORS.md +0 -0
  23. {tango_python-1.12.0 → tango_python-1.13.0}/docs/PAGINATION.md +0 -0
  24. {tango_python-1.12.0 → tango_python-1.13.0}/docs/SHAPES.md +0 -0
  25. {tango_python-1.12.0 → tango_python-1.13.0}/docs/WEBHOOKS.md +0 -0
  26. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/README.md +0 -0
  27. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/check_filter_shape_conformance.py +0 -0
  28. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/check_shape_coverage.py +0 -0
  29. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/fetch_api_schema.py +0 -0
  30. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/generate_schemas_from_api.py +0 -0
  31. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/generate_shape_overlay.py +0 -0
  32. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/pr_review.py +0 -0
  33. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/probe_shape_types.py +0 -0
  34. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/refresh_contract.py +0 -0
  35. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/smoke_api_parity.py +0 -0
  36. {tango_python-1.12.0 → tango_python-1.13.0}/scripts/test_production.py +0 -0
  37. {tango_python-1.12.0 → tango_python-1.13.0}/tango/exceptions.py +0 -0
  38. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/__init__.py +0 -0
  39. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/factory.py +0 -0
  40. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/generator.py +0 -0
  41. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/models.py +0 -0
  42. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/parser.py +0 -0
  43. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/schema.py +0 -0
  44. {tango_python-1.12.0 → tango_python-1.13.0}/tango/shapes/types.py +0 -0
  45. {tango_python-1.12.0 → tango_python-1.13.0}/tango/webhooks/__init__.py +0 -0
  46. {tango_python-1.12.0 → tango_python-1.13.0}/tango/webhooks/cli.py +0 -0
  47. {tango_python-1.12.0 → tango_python-1.13.0}/tango/webhooks/receiver.py +0 -0
  48. {tango_python-1.12.0 → tango_python-1.13.0}/tango/webhooks/signing.py +0 -0
  49. {tango_python-1.12.0 → tango_python-1.13.0}/tango/webhooks/simulate.py +0 -0
  50. {tango_python-1.12.0 → tango_python-1.13.0}/tests/__init__.py +0 -0
  51. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestAgenciesIntegration.test_get_agency +0 -0
  52. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestAgenciesIntegration.test_list_agencies +0 -0
  53. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_field_type_validation +0 -0
  54. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_parsing_consistency +0 -0
  55. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestBusinessTypesIntegration.test_list_business_types +0 -0
  56. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_combined_filters_work_together +0 -0
  57. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination +0 -0
  58. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_contract_data_object_parsing +0 -0
  59. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_contract_field_types +0 -0
  60. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[keyword-software] +0 -0
  61. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[psc_code-R425] +0 -0
  62. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_awarding_agency_filter +0 -0
  63. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_date_range_filter +0 -0
  64. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_flat +0 -0
  65. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_naics_code_filter +0 -0
  66. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[custom-key,piid,recipient(display_name),total_contract_value,award_date] +0 -0
  67. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[default-None] +0 -0
  68. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[detailed-key,piid,award_date,description,total_contract_value,obligated,fiscal_year,set_aside,recipient(display_name,uei),awarding_office(-),place_of_performa...ce114a3c47e2037aaa3c15d00b7031bd +0 -0
  69. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -0
  70. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_new_expiring_filters +0 -0
  71. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_new_fiscal_year_range_filters +0 -0
  72. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_new_identifier_filters +0 -0
  73. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_search_contracts_with_filters +0 -0
  74. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_search_filters_object_with_new_parameters +0 -0
  75. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[asc-] +0 -0
  76. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[desc--] +0 -0
  77. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_contracts +0 -0
  78. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_entities +0 -0
  79. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_date_field_parsing_edge_cases +0 -0
  80. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_decimal_field_parsing_edge_cases +0 -0
  81. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_empty_list_responses +0 -0
  82. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_entity_parsing_with_various_address_formats +0 -0
  83. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_flattened_responses_with_flat_lists +0 -0
  84. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_list_field_parsing_consistency +0 -0
  85. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_nested_objects_with_missing_data +0 -0
  86. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_null_missing_fields_in_contracts +0 -0
  87. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_with_minimal_shape_sparse_data +0 -0
  88. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_entity_field_types +0 -0
  89. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_entity_location_parsing +0 -0
  90. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_entity_parsing_with_business_types +0 -0
  91. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_entity_with_various_identifiers +0 -0
  92. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_get_entity_budget_flows +0 -0
  93. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_get_entity_by_uei +0 -0
  94. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_flat +0 -0
  95. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_search +0 -0
  96. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[comprehensive-uei,legal_business_name,dba_name,cage_code,business_types,primary_naics,naics_codes,psc_codes,email_address,entity_url,description,capabilities,ke...1603a7d52e211cf2b3bc7d32080238aa +0 -0
  97. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[custom-uei,legal_business_name,cage_code] +0 -0
  98. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
  99. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -0
  100. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestForecastsIntegration.test_forecast_field_types +0 -0
  101. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[custom-id,title,anticipated_award_date] +0 -0
  102. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[default-None] +0 -0
  103. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[detailed-id,source_system,external_id,title,description,anticipated_award_date,fiscal_year,naics_code,status,is_active] +0 -0
  104. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[minimal-id,title,anticipated_award_date,fiscal_year,naics_code,status] +0 -0
  105. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestGrantsIntegration.test_grant_field_types +0 -0
  106. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestGrantsIntegration.test_grant_pagination +0 -0
  107. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[custom-grant_id,title,opportunity_number] +0 -0
  108. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[default-None] +0 -0
  109. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[detailed-grant_id,opportunity_number,title,status(-),agency_code,description,last_updated,cfda_numbers(number,title),applicant_types(-),funding_categories(-)] +0 -0
  110. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[minimal-grant_id,opportunity_number,title,status(-),agency_code] +0 -0
  111. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape +0 -0
  112. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape +0 -0
  113. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape +0 -0
  114. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions +0 -0
  115. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params +0 -0
  116. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_agency_code +0 -0
  117. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_agency_name_text +0 -0
  118. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_cio_rating +0 -0
  119. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_cio_rating_max +0 -0
  120. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_performance_risk +0 -0
  121. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_type_of_investment +0 -0
  122. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_updated_time_range +0 -0
  123. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_funding_and_cio_evaluation_expansions +0 -0
  124. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_get_itdashboard_investment_by_uii +0 -0
  125. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_itdashboard_pagination +0 -0
  126. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_search +0 -0
  127. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[custom-uii,agency_name,investment_title,updated_time] +0 -0
  128. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[default-None] +0 -0
  129. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[minimal-uii,agency_name,bureau_name,investment_title,type_of_investment,part_of_it_portfolio,updated_time,url] +0 -0
  130. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestNaicsIntegration.test_list_naics +0 -0
  131. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[custom-notice_id,title,solicitation_number] +0 -0
  132. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[default-None] +0 -0
  133. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[detailed-notice_id,title,description,solicitation_number,posted_date,naics_code,set_aside,office(-),place_of_performance(-)] +0 -0
  134. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
  135. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestNoticesIntegration.test_notice_field_types +0 -0
  136. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestNoticesIntegration.test_notice_pagination +0 -0
  137. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestNoticesIntegration.test_notice_with_meta_fields +0 -0
  138. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOTAsIntegration.test_get_ota +0 -0
  139. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOTAsIntegration.test_list_otas +0 -0
  140. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOTIDVsIntegration.test_get_otidv +0 -0
  141. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs +0 -0
  142. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOfficesIntegration.test_get_office +0 -0
  143. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOfficesIntegration.test_list_offices +0 -0
  144. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[custom-opportunity_id,title,solicitation_number] +0 -0
  145. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[default-None] +0 -0
  146. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[detailed-opportunity_id,title,description,solicitation_number,response_deadline,first_notice_date,last_notice_date,active,naics_code,psc_code,set_asid...23b6b4502ddd665b7184afcff6c6d8d9 +0 -0
  147. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
  148. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOpportunitiesIntegration.test_opportunity_field_types +0 -0
  149. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOrganizationsIntegration.test_get_organization +0 -0
  150. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestOrganizationsIntegration.test_list_organizations +0 -0
  151. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestProtestsIntegration.test_get_protest_by_case_id +0 -0
  152. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_filter +0 -0
  153. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[custom-case_id,title,source_system,outcome] +0 -0
  154. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[default-None] +0 -0
  155. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[minimal-case_id,case_number,title,source_system,outcome,filed_date] +0 -0
  156. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[with_dockets-case_id,case_number,title,outcome,filed_date,dockets(docket_number,filed_date,outcome)] +0 -0
  157. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestProtestsIntegration.test_protest_pagination +0 -0
  158. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestSubawardsIntegration.test_list_subawards +0 -0
  159. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[custom-key,piid,description] +0 -0
  160. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -0
  161. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[ultra_minimal-key,piid,recipient(display_name),total_contract_value] +0 -0
  162. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
  163. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -0
  164. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[detailed-notice_id,title,description,solicitation_number,posted_date,naics_code,set_aside,office(-),place_of_performance(-)] +0 -0
  165. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
  166. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[detailed-opportunity_id,title,description,solicitation_number,response_deadline,first_notice_date,last_notice_date,active,naics_code,psc_code,set_aside,sam_url,office(-),place_of_performance(-)] +0 -0
  167. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
  168. {tango_python-1.12.0 → tango_python-1.13.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_with_ordering +0 -0
  169. {tango_python-1.12.0 → tango_python-1.13.0}/tests/conftest.py +0 -0
  170. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/README.md +0 -0
  171. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/__init__.py +0 -0
  172. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/conftest.py +0 -0
  173. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_agencies_integration.py +0 -0
  174. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_contracts_integration.py +0 -0
  175. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_edge_cases_integration.py +0 -0
  176. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_entities_integration.py +0 -0
  177. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_forecasts_integration.py +0 -0
  178. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_grants_integration.py +0 -0
  179. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_itdashboard_integration.py +0 -0
  180. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_naics_integration.py +0 -0
  181. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_notices_integration.py +0 -0
  182. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_offices_integration.py +0 -0
  183. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_opportunities_integration.py +0 -0
  184. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_organizations_integration.py +0 -0
  185. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_otas_otidvs_integration.py +0 -0
  186. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_protests_integration.py +0 -0
  187. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_reference_data_integration.py +0 -0
  188. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_subawards_integration.py +0 -0
  189. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/test_vehicles_idvs_integration.py +0 -0
  190. {tango_python-1.12.0 → tango_python-1.13.0}/tests/integration/validation.py +0 -0
  191. {tango_python-1.12.0 → tango_python-1.13.0}/tests/production/__init__.py +0 -0
  192. {tango_python-1.12.0 → tango_python-1.13.0}/tests/production/conftest.py +0 -0
  193. {tango_python-1.12.0 → tango_python-1.13.0}/tests/production/test_production_smoke.py +0 -0
  194. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_api_parity.py +0 -0
  195. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_contract_appeals.py +0 -0
  196. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_dibbs_exclusions_sbir.py +0 -0
  197. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_ebuy.py +0 -0
  198. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_federal_register.py +0 -0
  199. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_models.py +0 -0
  200. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_opportunity_attachments.py +0 -0
  201. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_opportunity_awards.py +0 -0
  202. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_organization_scope.py +0 -0
  203. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_shape_coverage_gate.py +0 -0
  204. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_shapes.py +0 -0
  205. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_sled.py +0 -0
  206. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_webhooks_cli.py +0 -0
  207. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_webhooks_receiver.py +0 -0
  208. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_webhooks_signing.py +0 -0
  209. {tango_python-1.12.0 → tango_python-1.13.0}/tests/test_webhooks_simulate.py +0 -0
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.13.0] - 2026-10-02
11
+
12
+ ### Added
13
+
14
+ - **`holder_count` and `order_winner_count` on vehicles** (Tango API 5.8.0). `holder_count` is the number of distinct companies holding one of the vehicle's IDVs, and `order_winner_count` is the number of distinct companies that have won a task order under it. Both are in the default `VEHICLES_MINIMAL` and `VEHICLES_COMPREHENSIVE` shapes and accepted in custom shapes.
15
+ - **`data_through_period` on budget accounts** (Tango API 5.8.0). The File A period (1-12) an account-year's figures run through; below 12 the year is partial, and `None` means there is no File A data. It is in the default `BUDGET_ACCOUNTS_MINIMAL` shape and accepted in custom shapes.
16
+ - **`list_budget_accounts(data_through_period=..., data_through_period_gte=..., data_through_period_lte=..., data_through_period_isnull=...)`** filters by that period, exactly, by range, or by whether it is set.
17
+
18
+ ### Changed
19
+
20
+ - Re-vendored `contracts/filter_shape_contract.json` (Tango API 5.8.0) and regenerated `tango/shapes/generated_overlay.py`.
21
+
22
+ ### Deprecated
23
+
24
+ - **`awardee_count` on vehicles.** It is the same value as `order_winner_count`; use that instead. The API removes it at its next major version, and the SDK's default vehicle shapes will drop it then.
25
+
10
26
  ## [1.12.0] - 2026-10-02
11
27
 
12
28
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tango-python
3
- Version: 1.12.0
3
+ Version: 1.13.0
4
4
  Summary: Python SDK for the Tango API
5
5
  Project-URL: Homepage, https://github.com/makegov/tango-python
6
6
  Project-URL: Documentation, https://docs.makegov.com/tango-python
@@ -599,7 +599,10 @@ The post-cutover (May 2026) vehicle response includes these top-level fields, al
599
599
  | `vehicle_type`, `who_can_use`, `type_of_idc`, `contract_type` | dict \| None | Returned as `{code, description}`. |
600
600
  | `description` | str \| None | Common text across IDV descriptions. |
601
601
  | `descriptions` | list[str] \| None | Distinct IDV descriptions. |
602
- | `idv_count`, `awardee_count`, `order_count` | int \| None | Denormalized rollups. |
602
+ | `idv_count`, `order_count` | int \| None | Denormalized rollups. |
603
+ | `holder_count` | int \| None | Distinct companies holding one of the vehicle's IDVs. |
604
+ | `order_winner_count` | int \| None | Distinct companies that have won a task order under the vehicle. |
605
+ | `awardee_count` | int \| None | **Deprecated.** Same value as `order_winner_count`; use that instead. Removed at the next major API version. |
603
606
  | `total_obligated`, `vehicle_obligations`, `vehicle_contracts_value` | Decimal \| None | Denormalized rollups. |
604
607
  | `award_date`, `latest_award_date`, `last_date_to_order` | date \| None | |
605
608
  | `solicitation_title`, `solicitation_description`, `solicitation_date`, `opportunity_id` | str / date / None | From SAM.gov via the linked Opportunity. |
@@ -1772,6 +1775,10 @@ accounts = client.list_budget_accounts(
1772
1775
  subfunction_code=None,
1773
1776
  account_category=None,
1774
1777
  account_category_in=None,
1778
+ data_through_period=None,
1779
+ data_through_period_gte=None,
1780
+ data_through_period_lte=None,
1781
+ data_through_period_isnull=None,
1775
1782
  search=None,
1776
1783
  ordering=None,
1777
1784
  )
@@ -1789,6 +1796,9 @@ accounts = client.list_budget_accounts(
1789
1796
  - `subfunction_code` - Subfunction code (exact)
1790
1797
  - `account_category` - Account category (exact): `budgetary` or `credit_financing` today; treat it as an open string
1791
1798
  - `account_category_in` - Comma-separated account categories to match any of (e.g. `"budgetary,credit_financing"`)
1799
+ - `data_through_period` - File A period (1-12) the account-year's figures run through (exact); below 12 the year is partial
1800
+ - `data_through_period_gte` / `data_through_period_lte` - `data_through_period` range
1801
+ - `data_through_period_isnull` - `True` for accounts with no File A data, `False` for accounts with it
1792
1802
  - `search` - Full-text search over `account_title`, `agency_name`, `bureau_name`
1793
1803
  - `ordering` - Sort field; prefix with `-` for descending. The default is the latest fiscal year first, then largest `enacted_ba` first, with accounts that have no `enacted_ba` last.
1794
1804
 
@@ -2544,7 +2554,7 @@ entity = client.get_entity("UEI_KEY", shape=ShapeConfig.ENTITIES_COMPREHENSIVE)
2544
2554
  | `GRANTS_MINIMAL` | `list_grants` | grant_id, opportunity_number, title, status(*), agency_code |
2545
2555
  | `IDVS_MINIMAL` | `list_idvs`, `list_vehicle_awardees` | key, piid, award_date, recipient(display_name,uei), description, total_contract_value, obligated, idv_type |
2546
2556
  | `IDVS_COMPREHENSIVE` | `get_idv` | Full IDV with offices, place_of_performance, competition, transactions, etc. |
2547
- | `VEHICLES_MINIMAL` | `list_vehicles` | uuid, solicitation_identifier, is_synthetic_solicitation, program_acronym, organization_id, organization, vehicle_type, description, idv_count, awardee_count, order_count, total_obligated, vehicle_obligations, vehicle_contracts_value, latest_award_date, solicitation_title, solicitation_date |
2557
+ | `VEHICLES_MINIMAL` | `list_vehicles` | uuid, solicitation_identifier, is_synthetic_solicitation, program_acronym, organization_id, organization, vehicle_type, description, idv_count, holder_count, order_winner_count, awardee_count, order_count, total_obligated, vehicle_obligations, vehicle_contracts_value, latest_award_date, solicitation_title, solicitation_date |
2548
2558
  | `VEHICLES_COMPREHENSIVE` | `get_vehicle` | Full vehicle with competition_details, fiscal_year, set_aside, etc. |
2549
2559
  | `VEHICLE_AWARDEES_MINIMAL` | `list_vehicle_awardees` | uuid, key, piid, award_date, title, order_count, idv_obligations, idv_contracts_value, recipient(display_name,uei) |
2550
2560
  | `ORGANIZATIONS_MINIMAL` | `list_organizations` | key, fh_key, name, level, type, short_name |
@@ -2559,7 +2569,7 @@ entity = client.get_entity("UEI_KEY", shape=ShapeConfig.ENTITIES_COMPREHENSIVE)
2559
2569
  | `FEDERAL_REGISTER_COMPREHENSIVE` | `get_federal_register_document` | The list fields plus dates, signing_date, start_page, end_page, volume, docket_ids, dockets, regulation_id_numbers, topics, correction_of, corrections, executive_order_number, presidential_document_number, proclamation_number, comment_url, regulations_dot_gov_url, raw_text_url, body_html_url (omits `full_text`) |
2560
2570
  | `EBUY_REQUESTS_MINIMAL` | `list_ebuy_requests` | rfq_id, request_type, title, schedule, sin, status, buyer_name, buyer_agency, buyer_agency_code, reference_number, issue_date, close_date, attachment_count, link_count, last_seen |
2561
2571
  | `EBUY_REQUESTS_COMPREHENSIVE` | `get_ebuy_request` | Every field, plus the `organization` and `attachments` expands |
2562
- | `BUDGET_ACCOUNTS_MINIMAL` | `list_budget_accounts`, `get_budget_account` | id, federal_account_symbol, fiscal_year, agency_code/name, bureau_name, account_title, bea_category, on_off_budget, subfunction_code, account_category, lifecycle (requested/enacted/apportioned/obligated/outlayed/unobligated), contract & assistance rollups, key ratios, next-year growth, source_anomalies |
2572
+ | `BUDGET_ACCOUNTS_MINIMAL` | `list_budget_accounts`, `get_budget_account` | id, federal_account_symbol, fiscal_year, data_through_period, agency_code/name, bureau_name, account_title, bea_category, on_off_budget, subfunction_code, account_category, lifecycle (requested/enacted/apportioned/obligated/outlayed/unobligated), contract & assistance rollups, key ratios, next-year growth, source_anomalies |
2563
2573
  | `VEHICLE_ORDERS_MINIMAL` | `list_vehicle_orders` | key, piid, award_date, recipient(display_name,uei), total_contract_value, obligated |
2564
2574
  | `ITDASHBOARD_INVESTMENTS_MINIMAL` | `list_itdashboard_investments` | Minimal IT Dashboard investment fields |
2565
2575
  | `ITDASHBOARD_INVESTMENTS_COMPREHENSIVE` | `get_itdashboard_investment` | Full investment fields: uii, agency_code, agency_name, bureau_code, bureau_name, investment_title, type_of_investment, part_of_it_portfolio, updated_time, url |
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "tango-python"
7
- version = "1.12.0"
7
+ version = "1.13.0"
8
8
  description = "Python SDK for the Tango API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -62,7 +62,7 @@ from .webhooks import (
62
62
  )
63
63
  from .webhooks.receiver import Delivery, WebhookReceiver
64
64
 
65
- __version__ = "1.12.0"
65
+ __version__ = "1.13.0"
66
66
  __all__ = [
67
67
  "TangoClient",
68
68
  "TangoAPIError",
@@ -4450,6 +4450,10 @@ class TangoClient:
4450
4450
  subfunction_code: str | None = None,
4451
4451
  account_category: str | None = None,
4452
4452
  account_category_in: str | None = None,
4453
+ data_through_period: int | None = None,
4454
+ data_through_period_gte: int | None = None,
4455
+ data_through_period_lte: int | None = None,
4456
+ data_through_period_isnull: bool | None = None,
4453
4457
  # Range-numeric filters: each field also accepts ``__gte`` / ``__lte``.
4454
4458
  requested_ba: float | None = None,
4455
4459
  requested_ba_gte: float | None = None,
@@ -4561,6 +4565,8 @@ class TangoClient:
4561
4565
  categories may be added.
4562
4566
  account_category_in: Comma-separated account categories to match
4563
4567
  any of, e.g. ``"budgetary,credit_financing"``.
4568
+ data_through_period: File A period (1-12) the account-year's figures run through (exact). Also ``data_through_period_gte`` / ``data_through_period_lte``; a value below 12 means a partial year.
4569
+ data_through_period_isnull: ``True`` for accounts with no File A data, ``False`` for accounts with it.
4564
4570
  requested_ba: President's-budget requested BA (exact). Also
4565
4571
  ``requested_ba_gte`` / ``requested_ba_lte`` for range queries.
4566
4572
  enacted_ba: Enacted budget authority (exact / gte / lte).
@@ -4630,11 +4636,17 @@ class TangoClient:
4630
4636
  ("subfunction_code", subfunction_code),
4631
4637
  ("account_category", account_category),
4632
4638
  ("account_category__in", account_category_in),
4639
+ ("data_through_period", data_through_period),
4640
+ ("data_through_period__gte", data_through_period_gte),
4641
+ ("data_through_period__lte", data_through_period_lte),
4642
+ ("data_through_period__isnull", data_through_period_isnull),
4633
4643
  ("search", search),
4634
4644
  ("ordering", ordering),
4635
4645
  )
4636
4646
  for key, val in scalar_filters:
4637
- if val is not None:
4647
+ if isinstance(val, bool):
4648
+ params[key] = "true" if val else "false"
4649
+ elif val is not None:
4638
4650
  params[key] = val
4639
4651
  # Range-numeric filters: each field has exact / __gte / __lte forms.
4640
4652
  range_filters: tuple[tuple[str, float | None, float | None, float | None], ...] = (
@@ -489,6 +489,8 @@ class Vehicle:
489
489
  program_acronym: str | None = None
490
490
  description: str | None = None
491
491
  idv_count: int | None = None
492
+ holder_count: int | None = None
493
+ order_winner_count: int | None = None
492
494
  total_obligated: Decimal | None = None
493
495
  latest_award_date: date | None = None
494
496
  solicitation_title: str | None = None
@@ -847,6 +849,8 @@ class BudgetAccount:
847
849
  id: int | None = None
848
850
  federal_account_symbol: str | None = None
849
851
  fiscal_year: int | None = None
852
+ # File A period (1-12) this account-year's figures run through; below 12 the year is partial, and `None` means no File A data.
853
+ data_through_period: int | None = None
850
854
  agency_code: str | None = None
851
855
  agency_name: str | None = None
852
856
  bureau_name: str | None = None
@@ -1752,7 +1756,7 @@ class ShapeConfig:
1752
1756
  VEHICLES_MINIMAL: Final = (
1753
1757
  "uuid,solicitation_identifier,is_synthetic_solicitation,program_acronym,"
1754
1758
  "organization_id,organization,vehicle_type,description,"
1755
- "idv_count,awardee_count,order_count,total_obligated,"
1759
+ "idv_count,holder_count,order_winner_count,awardee_count,order_count,total_obligated,"
1756
1760
  "vehicle_obligations,vehicle_contracts_value,latest_award_date,"
1757
1761
  "solicitation_title,solicitation_date"
1758
1762
  )
@@ -1764,7 +1768,8 @@ class ShapeConfig:
1764
1768
  "solicitation_title,solicitation_description,solicitation_date,opportunity_id,"
1765
1769
  "naics_code,psc_code,set_aside,"
1766
1770
  "fiscal_year,award_date,latest_award_date,last_date_to_order,"
1767
- "description,idv_count,awardee_count,order_count,total_obligated,"
1771
+ "description,idv_count,holder_count,order_winner_count,awardee_count,order_count,"
1772
+ "total_obligated,"
1768
1773
  "vehicle_obligations,vehicle_contracts_value,"
1769
1774
  "type_of_idc,contract_type,metrics(*)"
1770
1775
  )
@@ -1780,7 +1785,8 @@ class ShapeConfig:
1780
1785
  # Default for list_budget_accounts() / get_budget_account()
1781
1786
  # Mirrors the API's BUDGET_ACCOUNT_DEFAULT_SHAPE.
1782
1787
  BUDGET_ACCOUNTS_MINIMAL: Final = (
1783
- "id,federal_account_symbol,fiscal_year,agency_code,agency_name,bureau_name,"
1788
+ "id,federal_account_symbol,fiscal_year,data_through_period,agency_code,agency_name,"
1789
+ "bureau_name,"
1784
1790
  "account_title,bea_category,on_off_budget,subfunction_code,account_category,"
1785
1791
  "requested_ba,enacted_ba,apportioned,obligated_total,outlayed_total,"
1786
1792
  "unobligated_balance,contract_obligated,contract_share_of_obligated_capped,"
@@ -1337,6 +1337,11 @@ VEHICLE_SCHEMA: dict[str, FieldSchema] = {
1337
1337
  ),
1338
1338
  # Denormalized rollups
1339
1339
  "idv_count": FieldSchema(name="idv_count", type=int, is_optional=True, is_list=False),
1340
+ "holder_count": FieldSchema(name="holder_count", type=int, is_optional=True, is_list=False),
1341
+ "order_winner_count": FieldSchema(
1342
+ name="order_winner_count", type=int, is_optional=True, is_list=False
1343
+ ),
1344
+ # Deprecated: same value as `order_winner_count`; removed at the next major API version.
1340
1345
  "awardee_count": FieldSchema(name="awardee_count", type=int, is_optional=True, is_list=False),
1341
1346
  "order_count": FieldSchema(name="order_count", type=int, is_optional=True, is_list=False),
1342
1347
  "total_obligated": FieldSchema(
@@ -1318,6 +1318,9 @@ GENERATED_OVERLAY: dict[str, dict[str, FieldSchema]] = {
1318
1318
  name="contract_share_of_obligated_capped", type=str, is_optional=True, is_list=False
1319
1319
  ),
1320
1320
  "created": FieldSchema(name="created", type=datetime, is_optional=True, is_list=False),
1321
+ "data_through_period": FieldSchema(
1322
+ name="data_through_period", type=int, is_optional=True, is_list=False
1323
+ ),
1321
1324
  "enacted_ba": FieldSchema(name="enacted_ba", type=str, is_optional=True, is_list=False),
1322
1325
  "enacted_ba_5yr_cagr": FieldSchema(
1323
1326
  name="enacted_ba_5yr_cagr", type=str, is_optional=True, is_list=False
@@ -2,40 +2,40 @@ interactions:
2
2
  - request:
3
3
  body: ''
4
4
  headers:
5
- accept:
5
+ Accept:
6
6
  - '*/*'
7
- accept-encoding:
7
+ Accept-Encoding:
8
8
  - gzip, deflate
9
- connection:
9
+ Connection:
10
10
  - keep-alive
11
- host:
11
+ Host:
12
12
  - tango.makegov.com
13
- user-agent:
13
+ User-Agent:
14
14
  - python-httpx/0.28.1
15
15
  method: GET
16
- uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Cis_synthetic_solicitation%2Cprogram_acronym%2Corganization_id%2Corganization%2Cvehicle_type%2Cdescription%2Cidv_count%2Cawardee_count%2Corder_count%2Ctotal_obligated%2Cvehicle_obligations%2Cvehicle_contracts_value%2Clatest_award_date%2Csolicitation_title%2Csolicitation_date
16
+ uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Cis_synthetic_solicitation%2Cprogram_acronym%2Corganization_id%2Corganization%2Cvehicle_type%2Cdescription%2Cidv_count%2Cholder_count%2Corder_winner_count%2Cawardee_count%2Corder_count%2Ctotal_obligated%2Cvehicle_obligations%2Cvehicle_contracts_value%2Clatest_award_date%2Csolicitation_title%2Csolicitation_date
17
17
  response:
18
18
  body:
19
- string: '{"count":20452,"next":"https://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Cis_synthetic_solicitation%2Cprogram_acronym%2Corganization_id%2Corganization%2Cvehicle_type%2Cdescription%2Cidv_count%2Cawardee_count%2Corder_count%2Ctotal_obligated%2Cvehicle_obligations%2Cvehicle_contracts_value%2Clatest_award_date%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"awardee_count":2,"description":["CATTLE
19
+ string: '{"count":22055,"next":"https://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Cis_synthetic_solicitation%2Cprogram_acronym%2Corganization_id%2Corganization%2Cvehicle_type%2Cdescription%2Cidv_count%2Cholder_count%2Corder_winner_count%2Cawardee_count%2Corder_count%2Ctotal_obligated%2Cvehicle_obligations%2Cvehicle_contracts_value%2Clatest_award_date%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"awardee_count":2,"description":["CATTLE
20
20
  AND SWINE BACKTAG CEMENT","CATTLE AND SWINE BACKTAG CEMENT TO BE DELIVERED
21
- ON AN IDIQ BASIS TO KS, MO."],"idv_count":2,"is_synthetic_solicitation":false,"latest_award_date":"2006-06-01","order_count":25,"organization":{"organization_id":"767bb2b0-239a-5bb4-8f3c-16d0a418fb71","office_code":"126395","office_name":"MRPBS
21
+ ON AN IDIQ BASIS TO KS, MO."],"holder_count":2,"idv_count":2,"is_synthetic_solicitation":false,"latest_award_date":"2006-06-01","order_count":25,"order_winner_count":2,"organization":{"organization_id":"767bb2b0-239a-5bb4-8f3c-16d0a418fb71","office_code":"126395","office_name":"MRPBS
22
22
  MINNEAPOLIS MN","agency_code":"12K3","agency_name":"ANIMAL AND PLANT HEALTH
23
23
  INSPECTION SERVICE","department_code":"012","department_name":"AGRICULTURE,
24
24
  DEPARTMENT OF"},"organization_id":"767bb2b0-239a-5bb4-8f3c-16d0a418fb71","program_acronym":"APHIS
25
- VS","solicitation_date":null,"solicitation_identifier":"002-M-APHIS-06","solicitation_title":null,"total_obligated":5388564.69,"uuid":"8597845d-2a4c-5acd-99ff-1f5fe348501e","vehicle_contracts_value":5116733.97,"vehicle_obligations":5388564.6899999995,"vehicle_type":{"code":"B","description":"IDC"}}]}'
25
+ VS","solicitation_date":null,"solicitation_identifier":"002-M-APHIS-06","solicitation_title":null,"total_obligated":5388564.69,"uuid":"8597845d-2a4c-5acd-99ff-1f5fe348501e","vehicle_contracts_value":5388564.6899999995,"vehicle_obligations":5388564.6899999995,"vehicle_type":{"code":"B","description":"IDC"}}]}'
26
26
  headers:
27
27
  CF-RAY:
28
- - 9f73b81ebb963d59-JAX
28
+ - a447660dcefcf84d-ORD
29
29
  Connection:
30
30
  - keep-alive
31
31
  Content-Type:
32
32
  - application/json
33
33
  Date:
34
- - Wed, 06 May 2026 00:02:59 GMT
34
+ - Fri, 02 Oct 2026 23:13:37 GMT
35
35
  Nel:
36
36
  - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}'
37
37
  Report-To:
38
- - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=nlkDo84xSKlQqOxVMCULQpSFUr%2ByvNqk5clNAiAUG3P3v9GZj4sWYIijGnArPlv%2BaO9z%2B637EZfDn5VLkMykl6392hG%2BWNMYaI9%2B0cXLrEgfbcn12luHzYHEcVOIk2By9FZVYoJbO6CEhCeoeNzS"}]}'
38
+ - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=AmrLIFxuKDudhcIWGN5N4ezSw2Qz5gPr%2F7KEKepEefWA2xsY7Y3QsVwCQ%2FU7BGTrlKIB8NXh3ZTJr7p9LaWJW1FnhLhUlearwN5jMAeEvUZORDa1NicaCMony9wC7CHNTeIaiBRKMRpOVf5dZ4VW"}]}'
39
39
  Server:
40
40
  - cloudflare
41
41
  Transfer-Encoding:
@@ -45,7 +45,7 @@ interactions:
45
45
  cf-cache-status:
46
46
  - DYNAMIC
47
47
  content-length:
48
- - '1333'
48
+ - '1417'
49
49
  cross-origin-opener-policy:
50
50
  - same-origin
51
51
  referrer-policy:
@@ -55,44 +55,46 @@ interactions:
55
55
  x-content-type-options:
56
56
  - nosniff
57
57
  x-execution-time:
58
- - 0.024s
58
+ - 0.033s
59
59
  x-frame-options:
60
60
  - DENY
61
61
  x-ratelimit-burst-limit:
62
62
  - '1000'
63
63
  x-ratelimit-burst-remaining:
64
- - '986'
64
+ - '989'
65
65
  x-ratelimit-burst-reset:
66
- - '29'
66
+ - '37'
67
67
  x-ratelimit-daily-limit:
68
68
  - '2000000'
69
69
  x-ratelimit-daily-remaining:
70
- - '1999986'
70
+ - '1997193'
71
71
  x-ratelimit-daily-reset:
72
- - '86220'
72
+ - '2782'
73
73
  x-ratelimit-limit:
74
74
  - '1000'
75
75
  x-ratelimit-remaining:
76
- - '986'
76
+ - '989'
77
77
  x-ratelimit-reset:
78
- - '29'
78
+ - '37'
79
79
  x-results-counttype:
80
80
  - exact
81
+ x-tango-api-version:
82
+ - 5.8.0
81
83
  status:
82
84
  code: 200
83
85
  message: OK
84
86
  - request:
85
87
  body: ''
86
88
  headers:
87
- accept:
89
+ Accept:
88
90
  - '*/*'
89
- accept-encoding:
91
+ Accept-Encoding:
90
92
  - gzip, deflate
91
- connection:
93
+ Connection:
92
94
  - keep-alive
93
- host:
95
+ Host:
94
96
  - tango.makegov.com
95
- user-agent:
97
+ User-Agent:
96
98
  - python-httpx/0.28.1
97
99
  method: GET
98
100
  uri: https://tango.makegov.com/api/vehicles/8597845d-2a4c-5acd-99ff-1f5fe348501e/?shape=uuid%2Corganization&flat=true&joiner=__&flat_lists=true
@@ -104,17 +106,17 @@ interactions:
104
106
  DEPARTMENT OF","uuid":"8597845d-2a4c-5acd-99ff-1f5fe348501e"}'
105
107
  headers:
106
108
  CF-RAY:
107
- - 9f73b81f5ca93d59-JAX
109
+ - a447660f989b1910-ORD
108
110
  Connection:
109
111
  - keep-alive
110
112
  Content-Type:
111
113
  - application/json
112
114
  Date:
113
- - Wed, 06 May 2026 00:02:59 GMT
115
+ - Fri, 02 Oct 2026 23:13:37 GMT
114
116
  Nel:
115
117
  - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}'
116
118
  Report-To:
117
- - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=CqJJ85Cgv80%2Fz2c7k61dXKeYrVFFz8RUxhtcsY3j86jFwjPcYo7xcPBjBH5cyohJxE%2FWeS%2Bdy2YWh1tWkStjis8jta9f%2BGiiyKyRqvQ3Zb3kzqFQwTGjXnTMPTW%2FNrzQ8shECys8DGoRPOZnWOab"}]}'
119
+ - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Dh5eo3m5%2Bhp8A56KhBrB659PGcdvM13ZcVQnL4r4ppR5M%2BtlrC0iiCW%2BrCISCEKnnu6IXNYzUui2P5rexhv0ZofkM9shRcr2lLoxc5k8p8DTSeHf7xJL6W9RkwRasgfvH%2BinRMjlzsNyj80d2msP"}]}'
118
120
  Server:
119
121
  - cloudflare
120
122
  Transfer-Encoding:
@@ -134,27 +136,29 @@ interactions:
134
136
  x-content-type-options:
135
137
  - nosniff
136
138
  x-execution-time:
137
- - 0.016s
139
+ - 0.021s
138
140
  x-frame-options:
139
141
  - DENY
140
142
  x-ratelimit-burst-limit:
141
143
  - '1000'
142
144
  x-ratelimit-burst-remaining:
143
- - '985'
145
+ - '988'
144
146
  x-ratelimit-burst-reset:
145
- - '29'
147
+ - '36'
146
148
  x-ratelimit-daily-limit:
147
149
  - '2000000'
148
150
  x-ratelimit-daily-remaining:
149
- - '1999985'
151
+ - '1997192'
150
152
  x-ratelimit-daily-reset:
151
- - '86220'
153
+ - '2782'
152
154
  x-ratelimit-limit:
153
155
  - '1000'
154
156
  x-ratelimit-remaining:
155
- - '985'
157
+ - '988'
156
158
  x-ratelimit-reset:
157
- - '29'
159
+ - '36'
160
+ x-tango-api-version:
161
+ - 5.8.0
158
162
  status:
159
163
  code: 200
160
164
  message: OK
@@ -2,40 +2,40 @@ interactions:
2
2
  - request:
3
3
  body: ''
4
4
  headers:
5
- accept:
5
+ Accept:
6
6
  - '*/*'
7
- accept-encoding:
7
+ Accept-Encoding:
8
8
  - gzip, deflate
9
- connection:
9
+ Connection:
10
10
  - keep-alive
11
- host:
11
+ Host:
12
12
  - tango.makegov.com
13
- user-agent:
13
+ User-Agent:
14
14
  - python-httpx/0.28.1
15
15
  method: GET
16
- uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Cis_synthetic_solicitation%2Cprogram_acronym%2Corganization_id%2Corganization%2Cvehicle_type%2Cdescription%2Cidv_count%2Cawardee_count%2Corder_count%2Ctotal_obligated%2Cvehicle_obligations%2Cvehicle_contracts_value%2Clatest_award_date%2Csolicitation_title%2Csolicitation_date
16
+ uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Cis_synthetic_solicitation%2Cprogram_acronym%2Corganization_id%2Corganization%2Cvehicle_type%2Cdescription%2Cidv_count%2Cholder_count%2Corder_winner_count%2Cawardee_count%2Corder_count%2Ctotal_obligated%2Cvehicle_obligations%2Cvehicle_contracts_value%2Clatest_award_date%2Csolicitation_title%2Csolicitation_date
17
17
  response:
18
18
  body:
19
- string: '{"count":20452,"next":"https://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Cis_synthetic_solicitation%2Cprogram_acronym%2Corganization_id%2Corganization%2Cvehicle_type%2Cdescription%2Cidv_count%2Cawardee_count%2Corder_count%2Ctotal_obligated%2Cvehicle_obligations%2Cvehicle_contracts_value%2Clatest_award_date%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"awardee_count":2,"description":["CATTLE
19
+ string: '{"count":22055,"next":"https://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Cis_synthetic_solicitation%2Cprogram_acronym%2Corganization_id%2Corganization%2Cvehicle_type%2Cdescription%2Cidv_count%2Cholder_count%2Corder_winner_count%2Cawardee_count%2Corder_count%2Ctotal_obligated%2Cvehicle_obligations%2Cvehicle_contracts_value%2Clatest_award_date%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"awardee_count":2,"description":["CATTLE
20
20
  AND SWINE BACKTAG CEMENT","CATTLE AND SWINE BACKTAG CEMENT TO BE DELIVERED
21
- ON AN IDIQ BASIS TO KS, MO."],"idv_count":2,"is_synthetic_solicitation":false,"latest_award_date":"2006-06-01","order_count":25,"organization":{"organization_id":"767bb2b0-239a-5bb4-8f3c-16d0a418fb71","office_code":"126395","office_name":"MRPBS
21
+ ON AN IDIQ BASIS TO KS, MO."],"holder_count":2,"idv_count":2,"is_synthetic_solicitation":false,"latest_award_date":"2006-06-01","order_count":25,"order_winner_count":2,"organization":{"organization_id":"767bb2b0-239a-5bb4-8f3c-16d0a418fb71","office_code":"126395","office_name":"MRPBS
22
22
  MINNEAPOLIS MN","agency_code":"12K3","agency_name":"ANIMAL AND PLANT HEALTH
23
23
  INSPECTION SERVICE","department_code":"012","department_name":"AGRICULTURE,
24
24
  DEPARTMENT OF"},"organization_id":"767bb2b0-239a-5bb4-8f3c-16d0a418fb71","program_acronym":"APHIS
25
- VS","solicitation_date":null,"solicitation_identifier":"002-M-APHIS-06","solicitation_title":null,"total_obligated":5388564.69,"uuid":"8597845d-2a4c-5acd-99ff-1f5fe348501e","vehicle_contracts_value":5116733.97,"vehicle_obligations":5388564.6899999995,"vehicle_type":{"code":"B","description":"IDC"}}]}'
25
+ VS","solicitation_date":null,"solicitation_identifier":"002-M-APHIS-06","solicitation_title":null,"total_obligated":5388564.69,"uuid":"8597845d-2a4c-5acd-99ff-1f5fe348501e","vehicle_contracts_value":5388564.6899999995,"vehicle_obligations":5388564.6899999995,"vehicle_type":{"code":"B","description":"IDC"}}]}'
26
26
  headers:
27
27
  CF-RAY:
28
- - 9f73b823692c60c7-JAX
28
+ - a44766154de3123a-ORD
29
29
  Connection:
30
30
  - keep-alive
31
31
  Content-Type:
32
32
  - application/json
33
33
  Date:
34
- - Wed, 06 May 2026 00:02:59 GMT
34
+ - Fri, 02 Oct 2026 23:13:38 GMT
35
35
  Nel:
36
36
  - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}'
37
37
  Report-To:
38
- - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=B6gMSdTzCoCyerbzAHIcVlqBefWD2yJM28l29mzuR4ye3cO5QBChXu%2Foof465c8FHkZe8jIIWNe9U9rJfvAMpvgPgzx8eLhyJYVdac5U3d9XyF0qKbxJt58%2FMsn51P4CcUG49wsHDkNwLfd7N8qo"}]}'
38
+ - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=WC5DlXnrN1iQxaM1il4uCMfwOhz9JnJCMqAkDhrEg0gj4jiG3codMj8aBvSrqzESYlXFxQy4RyjYaANM7zRdXMVaxhMGuijsaMDEQ%2Bzl6XCogz8IL%2FLnsOzSGg5v4QllWCS7u5LeLbIaan2%2F%2BI5E"}]}'
39
39
  Server:
40
40
  - cloudflare
41
41
  Transfer-Encoding:
@@ -45,7 +45,7 @@ interactions:
45
45
  cf-cache-status:
46
46
  - DYNAMIC
47
47
  content-length:
48
- - '1333'
48
+ - '1417'
49
49
  cross-origin-opener-policy:
50
50
  - same-origin
51
51
  referrer-policy:
@@ -55,63 +55,65 @@ interactions:
55
55
  x-content-type-options:
56
56
  - nosniff
57
57
  x-execution-time:
58
- - 0.021s
58
+ - 0.029s
59
59
  x-frame-options:
60
60
  - DENY
61
61
  x-ratelimit-burst-limit:
62
62
  - '1000'
63
63
  x-ratelimit-burst-remaining:
64
- - '981'
64
+ - '985'
65
65
  x-ratelimit-burst-reset:
66
- - '28'
66
+ - '35'
67
67
  x-ratelimit-daily-limit:
68
68
  - '2000000'
69
69
  x-ratelimit-daily-remaining:
70
- - '1999981'
70
+ - '1997189'
71
71
  x-ratelimit-daily-reset:
72
- - '86220'
72
+ - '2781'
73
73
  x-ratelimit-limit:
74
74
  - '1000'
75
75
  x-ratelimit-remaining:
76
- - '981'
76
+ - '985'
77
77
  x-ratelimit-reset:
78
- - '28'
78
+ - '35'
79
79
  x-results-counttype:
80
80
  - exact
81
+ x-tango-api-version:
82
+ - 5.8.0
81
83
  status:
82
84
  code: 200
83
85
  message: OK
84
86
  - request:
85
87
  body: ''
86
88
  headers:
87
- accept:
89
+ Accept:
88
90
  - '*/*'
89
- accept-encoding:
91
+ Accept-Encoding:
90
92
  - gzip, deflate
91
- connection:
93
+ Connection:
92
94
  - keep-alive
93
- host:
95
+ Host:
94
96
  - tango.makegov.com
95
- user-agent:
97
+ User-Agent:
96
98
  - python-httpx/0.28.1
97
99
  method: GET
98
100
  uri: https://tango.makegov.com/api/vehicles/8597845d-2a4c-5acd-99ff-1f5fe348501e/?shape=uuid%2Cmetrics%28%2A%29
99
101
  response:
100
102
  body:
101
- string: '{"metrics":{"avg_offers_received":1.5,"award_concentration_hhi":6058.0,"order_concentration_hhi":5200.0,"competed_rate":0.88,"using_agency_count":1,"avg_order_value":215542.58759999997,"max_order_value":602601.6,"top_recipient_share":72.99,"recent_obligations_24mo":0.0,"recent_orders_24mo":0,"days_since_last_order":5710,"obligation_to_ceiling_ratio":1.053125826277812},"uuid":"8597845d-2a4c-5acd-99ff-1f5fe348501e"}'
103
+ string: '{"metrics":{"avg_offers_received":1.5,"award_concentration_hhi":6058.0,"order_concentration_hhi":5200.0,"competed_rate":0.88,"using_agency_count":1,"avg_order_value":215542.58759999997,"max_order_value":602601.6,"top_recipient_share":72.99,"recent_obligations_24mo":0.0,"recent_orders_24mo":0,"days_since_last_order":5860,"obligation_to_ceiling_ratio":1.0},"uuid":"8597845d-2a4c-5acd-99ff-1f5fe348501e"}'
102
104
  headers:
103
105
  CF-RAY:
104
- - 9f73b823da9360c7-JAX
106
+ - a4476616fea66195-ORD
105
107
  Connection:
106
108
  - keep-alive
107
109
  Content-Type:
108
110
  - application/json
109
111
  Date:
110
- - Wed, 06 May 2026 00:02:59 GMT
112
+ - Fri, 02 Oct 2026 23:13:38 GMT
111
113
  Nel:
112
114
  - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}'
113
115
  Report-To:
114
- - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=5i%2Bk54VkK%2FXROY20rDQl9Rsx8mWgHA2Cn8jk3aUms2rC%2FpUJW8g4ecY5n8OZlTXhCF%2B5a0kpjUoAXs7btqOqBrmtTDnAaKNTjRYKpz72at%2Bbcu8K%2BCcopKM7zRf7KdNL9q9hPXB01yre8vUVrCJ0"}]}'
116
+ - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=idj%2FtMJqyNQN4yuAEUAi%2BA48E6G8np2OT48Z7jox%2FxcbhwLF6%2BvnucPWD8ThtMHngHLhWhI6Ikz8eivtHTPKgLf4610C2R0bEzGEK7tHn4QBkA%2F7RktYDQCZHwK1JucbFwXA98ED0WZmyJ1EFe%2BX"}]}'
115
117
  Server:
116
118
  - cloudflare
117
119
  Transfer-Encoding:
@@ -121,7 +123,7 @@ interactions:
121
123
  cf-cache-status:
122
124
  - DYNAMIC
123
125
  content-length:
124
- - '417'
126
+ - '403'
125
127
  cross-origin-opener-policy:
126
128
  - same-origin
127
129
  referrer-policy:
@@ -131,27 +133,29 @@ interactions:
131
133
  x-content-type-options:
132
134
  - nosniff
133
135
  x-execution-time:
134
- - 0.016s
136
+ - 0.020s
135
137
  x-frame-options:
136
138
  - DENY
137
139
  x-ratelimit-burst-limit:
138
140
  - '1000'
139
141
  x-ratelimit-burst-remaining:
140
- - '980'
142
+ - '984'
141
143
  x-ratelimit-burst-reset:
142
- - '28'
144
+ - '35'
143
145
  x-ratelimit-daily-limit:
144
146
  - '2000000'
145
147
  x-ratelimit-daily-remaining:
146
- - '1999980'
148
+ - '1997188'
147
149
  x-ratelimit-daily-reset:
148
- - '86220'
150
+ - '2781'
149
151
  x-ratelimit-limit:
150
152
  - '1000'
151
153
  x-ratelimit-remaining:
152
- - '980'
154
+ - '984'
153
155
  x-ratelimit-reset:
154
- - '28'
156
+ - '35'
157
+ x-tango-api-version:
158
+ - 5.8.0
155
159
  status:
156
160
  code: 200
157
161
  message: OK