adcp 3.1.0__py3-none-any.whl → 3.2.0__py3-none-any.whl

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 (242) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +5 -5
  3. adcp/__main__.py +4 -4
  4. adcp/adagents.py +5 -9
  5. adcp/client.py +14 -12
  6. adcp/protocols/a2a.py +3 -3
  7. adcp/protocols/base.py +2 -2
  8. adcp/protocols/mcp.py +3 -3
  9. adcp/server/base.py +6 -10
  10. adcp/server/content_standards.py +17 -49
  11. adcp/server/governance.py +20 -59
  12. adcp/server/mcp_tools.py +8 -4
  13. adcp/server/proposal.py +1 -3
  14. adcp/server/sponsored_intelligence.py +10 -28
  15. adcp/simple.py +10 -10
  16. adcp/types/__init__.py +10 -6
  17. adcp/types/_generated.py +44 -27
  18. adcp/types/base.py +7 -7
  19. adcp/types/generated_poc/{protocols → a2ui}/__init__.py +1 -1
  20. adcp/types/generated_poc/a2ui/component.py +24 -0
  21. adcp/types/generated_poc/a2ui/surface.py +33 -0
  22. adcp/types/generated_poc/account/__init__.py +3 -0
  23. adcp/types/generated_poc/account/list_accounts_request.py +30 -0
  24. adcp/types/generated_poc/account/list_accounts_response.py +30 -0
  25. adcp/types/generated_poc/adagents.py +192 -195
  26. adcp/types/generated_poc/content_standards/artifact.py +69 -69
  27. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +13 -13
  28. adcp/types/generated_poc/content_standards/calibrate_content_request.py +2 -2
  29. adcp/types/generated_poc/content_standards/calibrate_content_response.py +17 -17
  30. adcp/types/generated_poc/content_standards/content_standards.py +8 -8
  31. adcp/types/generated_poc/content_standards/create_content_standards_request.py +13 -13
  32. adcp/types/generated_poc/content_standards/create_content_standards_response.py +6 -6
  33. adcp/types/generated_poc/content_standards/get_content_standards_request.py +1 -1
  34. adcp/types/generated_poc/content_standards/get_content_standards_response.py +4 -4
  35. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +14 -14
  36. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +30 -30
  37. adcp/types/generated_poc/content_standards/list_content_standards_request.py +4 -4
  38. adcp/types/generated_poc/content_standards/list_content_standards_response.py +5 -5
  39. adcp/types/generated_poc/content_standards/update_content_standards_request.py +14 -14
  40. adcp/types/generated_poc/content_standards/update_content_standards_response.py +4 -4
  41. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +13 -13
  42. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +16 -16
  43. adcp/types/generated_poc/core/account.py +54 -0
  44. adcp/types/generated_poc/core/activation_key.py +8 -8
  45. adcp/types/generated_poc/core/assets/audio_asset.py +37 -8
  46. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  47. adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
  48. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  49. adcp/types/generated_poc/core/assets/image_asset.py +6 -6
  50. adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
  51. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  52. adcp/types/generated_poc/core/assets/url_asset.py +3 -3
  53. adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
  54. adcp/types/generated_poc/core/assets/video_asset.py +126 -10
  55. adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
  56. adcp/types/generated_poc/core/async_response_data.py +2 -2
  57. adcp/types/generated_poc/core/brand_manifest.py +66 -66
  58. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  59. adcp/types/generated_poc/core/context.py +1 -1
  60. adcp/types/generated_poc/core/creative_asset.py +12 -12
  61. adcp/types/generated_poc/core/creative_assignment.py +3 -3
  62. adcp/types/generated_poc/core/creative_filters.py +23 -17
  63. adcp/types/generated_poc/core/creative_manifest.py +4 -4
  64. adcp/types/generated_poc/core/creative_policy.py +4 -4
  65. adcp/types/generated_poc/core/delivery_metrics.py +32 -32
  66. adcp/types/generated_poc/core/deployment.py +20 -20
  67. adcp/types/generated_poc/core/destination.py +11 -11
  68. adcp/types/generated_poc/core/error.py +6 -6
  69. adcp/types/generated_poc/core/ext.py +1 -1
  70. adcp/types/generated_poc/core/format.py +49 -124
  71. adcp/types/generated_poc/core/format_id.py +5 -5
  72. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  73. adcp/types/generated_poc/core/identifier.py +2 -2
  74. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  75. adcp/types/generated_poc/core/measurement.py +8 -8
  76. adcp/types/generated_poc/core/media_buy.py +12 -8
  77. adcp/types/generated_poc/core/media_buy_features.py +3 -3
  78. adcp/types/generated_poc/core/offering.py +9 -9
  79. adcp/types/generated_poc/core/package.py +8 -8
  80. adcp/types/generated_poc/core/performance_feedback.py +18 -18
  81. adcp/types/generated_poc/core/placement.py +4 -4
  82. adcp/types/generated_poc/core/pricing_option.py +1 -1
  83. adcp/types/generated_poc/core/product.py +27 -21
  84. adcp/types/generated_poc/core/product_allocation.py +5 -5
  85. adcp/types/generated_poc/core/product_filters.py +27 -27
  86. adcp/types/generated_poc/core/promoted_offerings.py +18 -18
  87. adcp/types/generated_poc/core/promoted_products.py +2 -2
  88. adcp/types/generated_poc/core/property.py +10 -10
  89. adcp/types/generated_poc/core/property_id.py +4 -4
  90. adcp/types/generated_poc/core/property_list_ref.py +4 -4
  91. adcp/types/generated_poc/core/property_tag.py +4 -4
  92. adcp/types/generated_poc/core/proposal.py +13 -13
  93. adcp/types/generated_poc/core/protocol_envelope.py +8 -8
  94. adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
  95. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  96. adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
  97. adcp/types/generated_poc/core/reporting_webhook.py +10 -10
  98. adcp/types/generated_poc/core/response.py +4 -4
  99. adcp/types/generated_poc/core/signal_filters.py +5 -5
  100. adcp/types/generated_poc/core/start_timing.py +3 -3
  101. adcp/types/generated_poc/core/sub_asset.py +14 -14
  102. adcp/types/generated_poc/core/targeting.py +17 -10
  103. adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
  104. adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
  105. adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
  106. adcp/types/generated_poc/creative/preview_creative_response.py +28 -28
  107. adcp/types/generated_poc/creative/preview_render.py +25 -25
  108. adcp/types/generated_poc/enums/adcp_domain.py +4 -4
  109. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  110. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  111. adcp/types/generated_poc/enums/available_metric.py +9 -9
  112. adcp/types/generated_poc/enums/channels.py +19 -19
  113. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  114. adcp/types/generated_poc/enums/creative_action.py +5 -5
  115. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  116. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  117. adcp/types/generated_poc/enums/creative_status.py +5 -5
  118. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  119. adcp/types/generated_poc/enums/daast_version.py +2 -2
  120. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  121. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  122. adcp/types/generated_poc/enums/feed_format.py +3 -3
  123. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  124. adcp/types/generated_poc/enums/format_category.py +7 -7
  125. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  126. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  127. adcp/types/generated_poc/enums/geo_level.py +4 -4
  128. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  129. adcp/types/generated_poc/enums/http_method.py +2 -2
  130. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  131. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  132. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  133. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  134. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  135. adcp/types/generated_poc/enums/metric_type.py +8 -8
  136. adcp/types/generated_poc/enums/metro_system.py +5 -5
  137. adcp/types/generated_poc/enums/notification_type.py +4 -4
  138. adcp/types/generated_poc/enums/pacing.py +3 -3
  139. adcp/types/generated_poc/enums/postal_system.py +9 -9
  140. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  141. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  142. adcp/types/generated_poc/enums/property_type.py +8 -8
  143. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  144. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  145. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  146. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  147. adcp/types/generated_poc/enums/task_status.py +9 -9
  148. adcp/types/generated_poc/enums/task_type.py +11 -12
  149. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  150. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  151. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  152. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  153. adcp/types/generated_poc/enums/vast_version.py +5 -5
  154. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  155. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  156. adcp/types/generated_poc/extensions/extension_meta.py +14 -14
  157. adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
  158. adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
  159. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
  160. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  161. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
  162. adcp/types/generated_poc/media_buy/create_media_buy_request.py +27 -21
  163. adcp/types/generated_poc/media_buy/create_media_buy_response.py +15 -8
  164. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
  165. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
  166. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
  167. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  168. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
  169. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  170. adcp/types/generated_poc/media_buy/get_products_response.py +5 -5
  171. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
  172. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
  173. adcp/types/generated_poc/media_buy/list_creatives_request.py +23 -23
  174. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -49
  175. adcp/types/generated_poc/media_buy/package_request.py +8 -8
  176. adcp/types/generated_poc/media_buy/package_update.py +16 -16
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
  178. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
  182. adcp/types/generated_poc/media_buy/sync_creatives_request.py +14 -8
  183. adcp/types/generated_poc/media_buy/sync_creatives_response.py +33 -29
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
  187. adcp/types/generated_poc/media_buy/update_media_buy_request.py +14 -14
  188. adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
  189. adcp/types/generated_poc/pricing_options/cpc_option.py +13 -26
  190. adcp/types/generated_poc/pricing_options/cpcv_option.py +13 -26
  191. adcp/types/generated_poc/pricing_options/cpm_option.py +13 -20
  192. adcp/types/generated_poc/pricing_options/cpp_option.py +19 -32
  193. adcp/types/generated_poc/pricing_options/cpv_option.py +19 -32
  194. adcp/types/generated_poc/pricing_options/flat_rate_option.py +23 -36
  195. adcp/types/generated_poc/pricing_options/price_guidance.py +26 -0
  196. adcp/types/generated_poc/pricing_options/vcpm_option.py +13 -26
  197. adcp/types/generated_poc/property/base_property_source.py +15 -15
  198. adcp/types/generated_poc/property/create_property_list_request.py +4 -4
  199. adcp/types/generated_poc/property/create_property_list_response.py +3 -3
  200. adcp/types/generated_poc/property/delete_property_list_request.py +2 -2
  201. adcp/types/generated_poc/property/delete_property_list_response.py +3 -3
  202. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  203. adcp/types/generated_poc/property/get_property_list_request.py +5 -5
  204. adcp/types/generated_poc/property/get_property_list_response.py +11 -11
  205. adcp/types/generated_poc/property/list_property_lists_request.py +5 -5
  206. adcp/types/generated_poc/property/list_property_lists_response.py +8 -8
  207. adcp/types/generated_poc/property/property_error.py +10 -10
  208. adcp/types/generated_poc/property/property_feature.py +4 -4
  209. adcp/types/generated_poc/property/property_feature_definition.py +18 -18
  210. adcp/types/generated_poc/property/property_list.py +11 -11
  211. adcp/types/generated_poc/property/property_list_changed_webhook.py +11 -11
  212. adcp/types/generated_poc/property/property_list_filters.py +7 -7
  213. adcp/types/generated_poc/property/update_property_list_request.py +8 -8
  214. adcp/types/generated_poc/property/update_property_list_response.py +2 -2
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +8 -6
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +59 -58
  217. adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
  218. adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
  219. adcp/types/generated_poc/signals/get_signals_request.py +8 -8
  220. adcp/types/generated_poc/signals/get_signals_response.py +15 -15
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +45 -30
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +4 -4
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +23 -23
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +16 -16
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +5 -5
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +7 -7
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +11 -11
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +37 -23
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +17 -17
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +15 -15
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +11 -11
  232. adcp/utils/format_assets.py +32 -32
  233. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/METADATA +10 -5
  234. adcp-3.2.0.dist-info/RECORD +268 -0
  235. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +0 -38
  236. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +0 -84
  237. adcp/types/generated_poc/protocols/adcp_extension.py +0 -50
  238. adcp-3.1.0.dist-info/RECORD +0 -264
  239. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
  240. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
  241. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
  242. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/format.json
3
- # timestamp: 2026-01-25T21:17:54+00:00
3
+ # timestamp: 2026-02-02T17:45:21+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -17,7 +17,7 @@ class Assets(AdCPBaseModel):
17
17
  asset_id: Annotated[
18
18
  str,
19
19
  Field(
20
- description='Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object.'
20
+ description="Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object."
21
21
  ),
22
22
  ]
23
23
  asset_role: Annotated[
@@ -26,42 +26,42 @@ class Assets(AdCPBaseModel):
26
26
  description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
27
27
  ),
28
28
  ] = None
29
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
29
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
30
30
  item_type: Annotated[
31
- Literal['individual'],
32
- Field(description='Discriminator indicating this is an individual asset'),
31
+ Literal["individual"],
32
+ Field(description="Discriminator indicating this is an individual asset"),
33
33
  ]
34
34
  required: Annotated[
35
35
  bool,
36
36
  Field(
37
- description='Whether this asset is required (true) or optional (false). Required assets must be provided for a valid creative. Optional assets enhance the creative but are not mandatory.'
37
+ description="Whether this asset is required (true) or optional (false). Required assets must be provided for a valid creative. Optional assets enhance the creative but are not mandatory."
38
38
  ),
39
39
  ]
40
40
  requirements: Annotated[
41
41
  dict[str, Any] | None,
42
42
  Field(
43
- description='Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
43
+ description="Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms)."
44
44
  ),
45
45
  ] = None
46
46
 
47
47
 
48
48
  class Asset(AdCPBaseModel):
49
- asset_id: Annotated[str, Field(description='Identifier for this asset within the group')]
49
+ asset_id: Annotated[str, Field(description="Identifier for this asset within the group")]
50
50
  asset_role: Annotated[
51
51
  str | None,
52
52
  Field(
53
53
  description="Optional descriptive label for this asset's purpose. Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
54
54
  ),
55
55
  ] = None
56
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
56
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
57
57
  required: Annotated[
58
58
  bool,
59
- Field(description='Whether this asset is required within each repetition of the group'),
59
+ Field(description="Whether this asset is required within each repetition of the group"),
60
60
  ]
61
61
  requirements: Annotated[
62
62
  dict[str, Any] | None,
63
63
  Field(
64
- description='Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
64
+ description="Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms)."
65
65
  ),
66
66
  ] = None
67
67
 
@@ -70,89 +70,27 @@ class Assets5(AdCPBaseModel):
70
70
  asset_group_id: Annotated[
71
71
  str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
72
72
  ]
73
- assets: Annotated[list[Asset], Field(description='Assets within each repetition of this group')]
73
+ assets: Annotated[list[Asset], Field(description="Assets within each repetition of this group")]
74
74
  item_type: Annotated[
75
- Literal['repeatable_group'],
76
- Field(description='Discriminator indicating this is a repeatable asset group'),
75
+ Literal["repeatable_group"],
76
+ Field(description="Discriminator indicating this is a repeatable asset group"),
77
77
  ]
78
- max_count: Annotated[int, Field(description='Maximum number of repetitions allowed', ge=1)]
78
+ max_count: Annotated[int, Field(description="Maximum number of repetitions allowed", ge=1)]
79
79
  min_count: Annotated[
80
80
  int,
81
81
  Field(
82
- description='Minimum number of repetitions required (if group is required) or allowed (if optional)',
82
+ description="Minimum number of repetitions required (if group is required) or allowed (if optional)",
83
83
  ge=0,
84
84
  ),
85
85
  ]
86
86
  required: Annotated[
87
87
  bool,
88
88
  Field(
89
- description='Whether this asset group is required. If true, at least min_count repetitions must be provided.'
89
+ description="Whether this asset group is required. If true, at least min_count repetitions must be provided."
90
90
  ),
91
91
  ]
92
92
 
93
93
 
94
- class AssetsRequired(AdCPBaseModel):
95
- asset_id: Annotated[
96
- str,
97
- Field(
98
- description='Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object.'
99
- ),
100
- ]
101
- asset_role: Annotated[
102
- str | None,
103
- Field(
104
- description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
105
- ),
106
- ] = None
107
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
108
- item_type: Annotated[
109
- Literal['individual'],
110
- Field(description='Discriminator indicating this is an individual asset requirement'),
111
- ]
112
- required: Annotated[bool | None, Field(description='Whether this asset is required')] = None
113
- requirements: Annotated[
114
- dict[str, Any] | None,
115
- Field(
116
- description='Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
117
- ),
118
- ] = None
119
-
120
-
121
- class Asset2(AdCPBaseModel):
122
- asset_id: Annotated[str, Field(description='Identifier for this asset within the group')]
123
- asset_role: Annotated[
124
- str | None,
125
- Field(
126
- description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
127
- ),
128
- ] = None
129
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
130
- required: Annotated[
131
- bool | None, Field(description='Whether this asset is required in each repetition')
132
- ] = None
133
- requirements: Annotated[
134
- dict[str, Any] | None,
135
- Field(
136
- description='Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
137
- ),
138
- ] = None
139
-
140
-
141
- class AssetsRequired1(AdCPBaseModel):
142
- asset_group_id: Annotated[
143
- str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
144
- ]
145
- assets: Annotated[
146
- list[Asset2], Field(description='Assets within each repetition of this group')
147
- ]
148
- item_type: Annotated[
149
- Literal['repeatable_group'],
150
- Field(description='Discriminator indicating this is a repeatable asset group'),
151
- ]
152
- max_count: Annotated[int, Field(description='Maximum number of repetitions allowed', ge=1)]
153
- min_count: Annotated[int, Field(description='Minimum number of repetitions required', ge=1)]
154
-
155
-
156
94
  class Responsive(AdCPBaseModel):
157
95
  height: bool
158
96
  width: bool
@@ -163,36 +101,36 @@ class Dimensions(AdCPBaseModel):
163
101
  str | None,
164
102
  Field(
165
103
  description="Fixed aspect ratio constraint (e.g., '16:9', '4:3', '1:1')",
166
- pattern='^\\d+:\\d+$',
104
+ pattern="^\\d+:\\d+$",
167
105
  ),
168
106
  ] = None
169
- height: Annotated[int | None, Field(description='Fixed height in pixels', ge=1)] = None
107
+ height: Annotated[int | None, Field(description="Fixed height in pixels", ge=1)] = None
170
108
  max_height: Annotated[
171
- int | None, Field(description='Maximum height in pixels for responsive renders', ge=1)
109
+ int | None, Field(description="Maximum height in pixels for responsive renders", ge=1)
172
110
  ] = None
173
111
  max_width: Annotated[
174
- int | None, Field(description='Maximum width in pixels for responsive renders', ge=1)
112
+ int | None, Field(description="Maximum width in pixels for responsive renders", ge=1)
175
113
  ] = None
176
114
  min_height: Annotated[
177
- int | None, Field(description='Minimum height in pixels for responsive renders', ge=1)
115
+ int | None, Field(description="Minimum height in pixels for responsive renders", ge=1)
178
116
  ] = None
179
117
  min_width: Annotated[
180
- int | None, Field(description='Minimum width in pixels for responsive renders', ge=1)
118
+ int | None, Field(description="Minimum width in pixels for responsive renders", ge=1)
181
119
  ] = None
182
120
  responsive: Annotated[
183
- Responsive | None, Field(description='Indicates which dimensions are responsive/fluid')
121
+ Responsive | None, Field(description="Indicates which dimensions are responsive/fluid")
184
122
  ] = None
185
- width: Annotated[int | None, Field(description='Fixed width in pixels', ge=1)] = None
123
+ width: Annotated[int | None, Field(description="Fixed width in pixels", ge=1)] = None
186
124
 
187
125
 
188
126
  class Renders(AdCPBaseModel):
189
127
  dimensions: Annotated[
190
- Dimensions, Field(description='Dimensions for this rendered piece (in pixels)')
128
+ Dimensions, Field(description="Dimensions for this rendered piece (in pixels)")
191
129
  ]
192
130
  parameters_from_format_id: Annotated[
193
131
  bool | None,
194
132
  Field(
195
- description='When true, parameters for this render (dimensions and/or duration) are specified in the format_id. Used for template formats that accept parameters. Mutually exclusive with specifying dimensions object explicitly.'
133
+ description="When true, parameters for this render (dimensions and/or duration) are specified in the format_id. Used for template formats that accept parameters. Mutually exclusive with specifying dimensions object explicitly."
196
134
  ),
197
135
  ] = None
198
136
  role: Annotated[
@@ -209,12 +147,12 @@ class Dimensions1(Dimensions):
209
147
 
210
148
  class Renders1(AdCPBaseModel):
211
149
  dimensions: Annotated[
212
- Dimensions1 | None, Field(description='Dimensions for this rendered piece (in pixels)')
150
+ Dimensions1 | None, Field(description="Dimensions for this rendered piece (in pixels)")
213
151
  ] = None
214
152
  parameters_from_format_id: Annotated[
215
153
  Literal[True],
216
154
  Field(
217
- description='When true, parameters for this render (dimensions and/or duration) are specified in the format_id. Used for template formats that accept parameters. Mutually exclusive with specifying dimensions object explicitly.'
155
+ description="When true, parameters for this render (dimensions and/or duration) are specified in the format_id. Used for template formats that accept parameters. Mutually exclusive with specifying dimensions object explicitly."
218
156
  ),
219
157
  ]
220
158
  role: Annotated[
@@ -227,122 +165,109 @@ class Renders1(AdCPBaseModel):
227
165
 
228
166
  class FormatCard(AdCPBaseModel):
229
167
  model_config = ConfigDict(
230
- extra='allow',
168
+ extra="allow",
231
169
  )
232
170
  format_id: Annotated[
233
171
  format_id_1.FormatId,
234
172
  Field(
235
- description='Creative format defining the card layout (typically format_card_standard)'
173
+ description="Creative format defining the card layout (typically format_card_standard)"
236
174
  ),
237
175
  ]
238
176
  manifest: Annotated[
239
177
  dict[str, Any],
240
- Field(description='Asset manifest for rendering the card, structure defined by the format'),
178
+ Field(description="Asset manifest for rendering the card, structure defined by the format"),
241
179
  ]
242
180
 
243
181
 
244
182
  class FormatCardDetailed(AdCPBaseModel):
245
183
  model_config = ConfigDict(
246
- extra='allow',
184
+ extra="allow",
247
185
  )
248
186
  format_id: Annotated[
249
187
  format_id_1.FormatId,
250
188
  Field(
251
- description='Creative format defining the detailed card layout (typically format_card_detailed)'
189
+ description="Creative format defining the detailed card layout (typically format_card_detailed)"
252
190
  ),
253
191
  ]
254
192
  manifest: Annotated[
255
193
  dict[str, Any],
256
194
  Field(
257
- description='Asset manifest for rendering the detailed card, structure defined by the format'
195
+ description="Asset manifest for rendering the detailed card, structure defined by the format"
258
196
  ),
259
197
  ]
260
198
 
261
199
 
262
200
  class Format(AdCPBaseModel):
263
201
  model_config = ConfigDict(
264
- extra='allow',
202
+ extra="allow",
265
203
  )
266
204
  accepts_parameters: Annotated[
267
205
  list[format_id_parameter.FormatIdParameter] | None,
268
206
  Field(
269
- description='List of parameters this format accepts in format_id. Template formats define which parameters (dimensions, duration, etc.) can be specified when instantiating the format. Empty or omitted means this is a concrete format with fixed parameters.'
207
+ description="List of parameters this format accepts in format_id. Template formats define which parameters (dimensions, duration, etc.) can be specified when instantiating the format. Empty or omitted means this is a concrete format with fixed parameters."
270
208
  ),
271
209
  ] = None
272
210
  assets: Annotated[
273
211
  list[Assets | Assets5] | None,
274
212
  Field(
275
- description="Array of all assets supported for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Use the 'required' boolean on each asset to indicate whether it's mandatory. This field replaces the deprecated 'assets_required' and enables full asset discovery for buyers and AI agents."
276
- ),
277
- ] = None
278
- assets_required: Annotated[
279
- list[AssetsRequired | AssetsRequired1] | None,
280
- Field(
281
- deprecated=True,
282
- description="DEPRECATED: Use 'assets' instead. Array of required assets or asset groups for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Can contain individual assets or repeatable asset sequences (e.g., carousel products, slideshow frames). This field is maintained for backward compatibility; new implementations should use 'assets' with the 'required' boolean on each asset.",
213
+ description="Array of all assets supported for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Use the 'required' boolean on each asset to indicate whether it's mandatory."
283
214
  ),
284
215
  ] = None
285
216
  delivery: Annotated[
286
217
  dict[str, Any] | None,
287
- Field(description='Delivery method specifications (e.g., hosted, VAST, third-party tags)'),
218
+ Field(description="Delivery method specifications (e.g., hosted, VAST, third-party tags)"),
288
219
  ] = None
289
220
  description: Annotated[
290
221
  str | None,
291
222
  Field(
292
- description='Plain text explanation of what this format does and what assets it requires'
223
+ description="Plain text explanation of what this format does and what assets it requires"
293
224
  ),
294
225
  ] = None
295
226
  example_url: Annotated[
296
227
  AnyUrl | None,
297
228
  Field(
298
- description='Optional URL to showcase page with examples and interactive demos of this format'
229
+ description="Optional URL to showcase page with examples and interactive demos of this format"
299
230
  ),
300
231
  ] = None
301
232
  format_card: Annotated[
302
233
  FormatCard | None,
303
234
  Field(
304
- description='Optional standard visual card (300x400px) for displaying this format in user interfaces. Can be rendered via preview_creative or pre-generated.'
235
+ description="Optional standard visual card (300x400px) for displaying this format in user interfaces. Can be rendered via preview_creative or pre-generated."
305
236
  ),
306
237
  ] = None
307
238
  format_card_detailed: Annotated[
308
239
  FormatCardDetailed | None,
309
240
  Field(
310
- description='Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages.'
241
+ description="Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages."
311
242
  ),
312
243
  ] = None
313
244
  format_id: Annotated[
314
245
  format_id_1.FormatId,
315
- Field(description='Structured format identifier with agent URL and format name'),
246
+ Field(description="Structured format identifier with agent URL and format name"),
316
247
  ]
317
- name: Annotated[str, Field(description='Human-readable format name')]
248
+ name: Annotated[str, Field(description="Human-readable format name")]
318
249
  output_format_ids: Annotated[
319
250
  list[format_id_1.FormatId] | None,
320
251
  Field(
321
- description='For generative formats: array of format IDs that this format can generate. When a format accepts inputs like brand_manifest and message, this specifies what concrete output formats can be produced (e.g., a generative banner format might output standard image banner formats).'
322
- ),
323
- ] = None
324
- preview_image: Annotated[
325
- AnyUrl | None,
326
- Field(
327
- description='DEPRECATED: Use format_card instead. Optional preview image URL for format browsing/discovery UI. Should be 400x300px (4:3 aspect ratio) PNG or JPG. Used as thumbnail/card image in format browsers. This field is maintained for backward compatibility but format_card provides a more flexible, structured approach.'
252
+ description="For generative formats: array of format IDs that this format can generate. When a format accepts inputs like brand_manifest and message, this specifies what concrete output formats can be produced (e.g., a generative banner format might output standard image banner formats)."
328
253
  ),
329
254
  ] = None
330
255
  renders: Annotated[
331
256
  list[Renders | Renders1] | None,
332
257
  Field(
333
- description='Specification of rendered pieces for this format. Most formats produce a single render. Companion ad formats (video + banner), adaptive formats, and multi-placement formats produce multiple renders. Each render specifies its role and dimensions.',
258
+ description="Specification of rendered pieces for this format. Most formats produce a single render. Companion ad formats (video + banner), adaptive formats, and multi-placement formats produce multiple renders. Each render specifies its role and dimensions.",
334
259
  min_length=1,
335
260
  ),
336
261
  ] = None
337
262
  supported_macros: Annotated[
338
263
  list[str] | None,
339
264
  Field(
340
- description='List of universal macros supported by this format (e.g., MEDIA_BUY_ID, CACHEBUSTER, DEVICE_ID). Used for validation and developer tooling.'
265
+ description="List of universal macros supported by this format (e.g., MEDIA_BUY_ID, CACHEBUSTER, DEVICE_ID). Used for validation and developer tooling."
341
266
  ),
342
267
  ] = None
343
268
  type: Annotated[
344
269
  format_category.FormatCategory,
345
270
  Field(
346
- description='Media type of this format - determines rendering method and asset requirements'
271
+ description="Media type of this format - determines rendering method and asset requirements"
347
272
  ),
348
273
  ]
@@ -12,7 +12,7 @@ from pydantic import AnyUrl, ConfigDict, Field
12
12
 
13
13
  class FormatId(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  agent_url: Annotated[
18
18
  AnyUrl,
@@ -23,14 +23,14 @@ class FormatId(AdCPBaseModel):
23
23
  duration_ms: Annotated[
24
24
  float | None,
25
25
  Field(
26
- description='Duration in milliseconds for time-based formats (video, audio). When specified, creates a parameterized format ID. Omit to reference a template format without parameters.',
26
+ description="Duration in milliseconds for time-based formats (video, audio). When specified, creates a parameterized format ID. Omit to reference a template format without parameters.",
27
27
  ge=1.0,
28
28
  ),
29
29
  ] = None
30
30
  height: Annotated[
31
31
  int | None,
32
32
  Field(
33
- description='Height in pixels for visual formats. When specified, width must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.',
33
+ description="Height in pixels for visual formats. When specified, width must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.",
34
34
  ge=1,
35
35
  ),
36
36
  ] = None
@@ -38,13 +38,13 @@ class FormatId(AdCPBaseModel):
38
38
  str,
39
39
  Field(
40
40
  description="Format identifier within the agent's namespace (e.g., 'display_static', 'video_hosted', 'audio_standard'). When used alone, references a template format. When combined with dimension/duration fields, creates a parameterized format ID for a specific variant.",
41
- pattern='^[a-zA-Z0-9_-]+$',
41
+ pattern="^[a-zA-Z0-9_-]+$",
42
42
  ),
43
43
  ]
44
44
  width: Annotated[
45
45
  int | None,
46
46
  Field(
47
- description='Width in pixels for visual formats. When specified, height must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.',
47
+ description="Width in pixels for visual formats. When specified, height must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.",
48
48
  ge=1,
49
49
  ),
50
50
  ] = None
@@ -12,8 +12,8 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class FrequencyCap(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  suppress_minutes: Annotated[
18
- float, Field(description='Minutes to suppress after impression', ge=0.0)
18
+ float, Field(description="Minutes to suppress after impression", ge=0.0)
19
19
  ]
@@ -14,10 +14,10 @@ from ..enums import identifier_types
14
14
 
15
15
  class Identifier(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='forbid',
17
+ extra="forbid",
18
18
  )
19
19
  type: Annotated[
20
- identifier_types.PropertyIdentifierTypes, Field(description='Type of identifier')
20
+ identifier_types.PropertyIdentifierTypes, Field(description="Type of identifier")
21
21
  ]
22
22
  value: Annotated[
23
23
  str,
@@ -16,56 +16,56 @@ from . import async_response_data
16
16
 
17
17
  class McpWebhookPayload(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra='allow',
19
+ extra="allow",
20
20
  )
21
21
  context_id: Annotated[
22
22
  str | None,
23
23
  Field(
24
- description='Session/conversation identifier. Use this to continue the conversation if input-required status needs clarification or additional parameters.'
24
+ description="Session/conversation identifier. Use this to continue the conversation if input-required status needs clarification or additional parameters."
25
25
  ),
26
26
  ] = None
27
27
  domain: Annotated[
28
28
  adcp_domain.AdcpDomain | None,
29
29
  Field(
30
- description='AdCP domain this task belongs to. Helps classify the operation type at a high level.'
30
+ description="AdCP domain this task belongs to. Helps classify the operation type at a high level."
31
31
  ),
32
32
  ] = None
33
33
  message: Annotated[
34
34
  str | None,
35
35
  Field(
36
- description='Human-readable summary of the current task state. Provides context about what happened and what action may be needed.'
36
+ description="Human-readable summary of the current task state. Provides context about what happened and what action may be needed."
37
37
  ),
38
38
  ] = None
39
39
  operation_id: Annotated[
40
40
  str | None,
41
41
  Field(
42
- description='Publisher-defined operation identifier correlating a sequence of task updates across webhooks.'
42
+ description="Publisher-defined operation identifier correlating a sequence of task updates across webhooks."
43
43
  ),
44
44
  ] = None
45
45
  result: Annotated[
46
46
  async_response_data.AdcpAsyncResponseData | None,
47
47
  Field(
48
- description='Task-specific payload matching the status. For completed/failed, contains the full task response. For working/input-required/submitted, contains status-specific data. This is the data layer that AdCP specs - same structure used in A2A status.message.parts[].data.'
48
+ description="Task-specific payload matching the status. For completed/failed, contains the full task response. For working/input-required/submitted, contains status-specific data. This is the data layer that AdCP specs - same structure used in A2A status.message.parts[].data."
49
49
  ),
50
50
  ] = None
51
51
  status: Annotated[
52
52
  task_status.TaskStatus,
53
53
  Field(
54
- description='Current task status. Webhooks are triggered for status changes after initial submission.'
54
+ description="Current task status. Webhooks are triggered for status changes after initial submission."
55
55
  ),
56
56
  ]
57
57
  task_id: Annotated[
58
58
  str,
59
59
  Field(
60
- description='Unique identifier for this task. Use this to correlate webhook notifications with the original task submission.'
60
+ description="Unique identifier for this task. Use this to correlate webhook notifications with the original task submission."
61
61
  ),
62
62
  ]
63
63
  task_type: Annotated[
64
64
  task_type_1.TaskType,
65
65
  Field(
66
- description='Type of AdCP operation that triggered this webhook. Enables webhook handlers to route to appropriate processing logic.'
66
+ description="Type of AdCP operation that triggered this webhook. Enables webhook handlers to route to appropriate processing logic."
67
67
  ),
68
68
  ]
69
69
  timestamp: Annotated[
70
- AwareDatetime, Field(description='ISO 8601 timestamp when this webhook was generated.')
70
+ AwareDatetime, Field(description="ISO 8601 timestamp when this webhook was generated.")
71
71
  ]
@@ -12,29 +12,29 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class Measurement(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  attribution: Annotated[
18
18
  str,
19
19
  Field(
20
- description='Attribution methodology',
21
- examples=['deterministic_purchase', 'probabilistic'],
20
+ description="Attribution methodology",
21
+ examples=["deterministic_purchase", "probabilistic"],
22
22
  ),
23
23
  ]
24
24
  reporting: Annotated[
25
25
  str,
26
26
  Field(
27
- description='Reporting frequency and format',
28
- examples=['weekly_dashboard', 'real_time_api'],
27
+ description="Reporting frequency and format",
28
+ examples=["weekly_dashboard", "real_time_api"],
29
29
  ),
30
30
  ]
31
31
  type: Annotated[
32
32
  str,
33
33
  Field(
34
- description='Type of measurement',
35
- examples=['incremental_sales_lift', 'brand_lift', 'foot_traffic'],
34
+ description="Type of measurement",
35
+ examples=["incremental_sales_lift", "brand_lift", "foot_traffic"],
36
36
  ),
37
37
  ]
38
38
  window: Annotated[
39
- str | None, Field(description='Attribution window', examples=['30_days', '7_days'])
39
+ str | None, Field(description="Attribution window", examples=["30_days", "7_days"])
40
40
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/media_buy.json
3
- # timestamp: 2026-01-25T21:17:54+00:00
3
+ # timestamp: 2026-02-02T17:45:21+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -10,31 +10,35 @@ from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import AwareDatetime, ConfigDict, Field
11
11
 
12
12
  from ..enums import media_buy_status
13
+ from . import account as account_1
13
14
  from . import ext as ext_1
14
15
  from . import package
15
16
 
16
17
 
17
18
  class MediaBuy(AdCPBaseModel):
18
19
  model_config = ConfigDict(
19
- extra='allow',
20
+ extra="allow",
20
21
  )
22
+ account: Annotated[
23
+ account_1.Account | None, Field(description="Account billed for this media buy")
24
+ ] = None
21
25
  buyer_ref: Annotated[
22
26
  str | None, Field(description="Buyer's reference identifier for this media buy")
23
27
  ] = None
24
- created_at: Annotated[AwareDatetime | None, Field(description='Creation timestamp')] = None
28
+ created_at: Annotated[AwareDatetime | None, Field(description="Creation timestamp")] = None
25
29
  creative_deadline: Annotated[
26
- AwareDatetime | None, Field(description='ISO 8601 timestamp for creative upload deadline')
30
+ AwareDatetime | None, Field(description="ISO 8601 timestamp for creative upload deadline")
27
31
  ] = None
28
32
  ext: ext_1.ExtensionObject | None = None
29
33
  media_buy_id: Annotated[
30
34
  str, Field(description="Publisher's unique identifier for the media buy")
31
35
  ]
32
36
  packages: Annotated[
33
- list[package.Package], Field(description='Array of packages within this media buy')
37
+ list[package.Package], Field(description="Array of packages within this media buy")
34
38
  ]
35
39
  promoted_offering: Annotated[
36
- str, Field(description='Description of advertiser and what is being promoted')
40
+ str, Field(description="Description of advertiser and what is being promoted")
37
41
  ]
38
42
  status: media_buy_status.MediaBuyStatus
39
- total_budget: Annotated[float, Field(description='Total budget amount', ge=0.0)]
40
- updated_at: Annotated[AwareDatetime | None, Field(description='Last update timestamp')] = None
43
+ total_budget: Annotated[float, Field(description="Total budget amount", ge=0.0)]
44
+ updated_at: Annotated[AwareDatetime | None, Field(description="Last update timestamp")] = None
@@ -14,16 +14,16 @@ class MediaBuyFeatures(AdCPBaseModel):
14
14
  content_standards: Annotated[
15
15
  bool | None,
16
16
  Field(
17
- description='Full support for content_standards configuration including sampling rates and category filtering'
17
+ description="Full support for content_standards configuration including sampling rates and category filtering"
18
18
  ),
19
19
  ] = None
20
20
  inline_creative_management: Annotated[
21
21
  bool | None,
22
- Field(description='Supports creatives provided inline in create_media_buy requests'),
22
+ Field(description="Supports creatives provided inline in create_media_buy requests"),
23
23
  ] = None
24
24
  property_list_filtering: Annotated[
25
25
  bool | None,
26
26
  Field(
27
- description='Honors property_list parameter in get_products to filter results to buyer-approved properties'
27
+ description="Honors property_list parameter in get_products to filter results to buyer-approved properties"
28
28
  ),
29
29
  ] = None