adcp 2.19.0__py3-none-any.whl → 3.0.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 (247) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +6 -14
  3. adcp/__main__.py +94 -51
  4. adcp/adagents.py +91 -19
  5. adcp/client.py +865 -0
  6. adcp/protocols/a2a.py +84 -0
  7. adcp/protocols/base.py +101 -0
  8. adcp/protocols/mcp.py +84 -0
  9. adcp/server/__init__.py +49 -0
  10. adcp/server/base.py +368 -0
  11. adcp/server/content_standards.py +561 -0
  12. adcp/server/governance.py +491 -0
  13. adcp/server/mcp_tools.py +471 -0
  14. adcp/server/proposal.py +334 -0
  15. adcp/server/sponsored_intelligence.py +444 -0
  16. adcp/types/__init__.py +111 -23
  17. adcp/types/_ergonomic.py +35 -14
  18. adcp/types/_generated.py +346 -52
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +196 -189
  22. adcp/types/generated_poc/content_standards/__init__.py +3 -0
  23. adcp/types/generated_poc/content_standards/artifact.py +208 -0
  24. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  25. adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  26. adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  27. adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  28. adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  29. adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  30. adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  31. adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  32. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  33. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  34. adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  35. adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  36. adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  37. adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  38. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  39. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  40. adcp/types/generated_poc/core/activation_key.py +9 -9
  41. adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  42. adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  43. adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
  44. adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  45. adcp/types/generated_poc/core/assets/image_asset.py +7 -7
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  47. adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  48. adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  49. adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
  50. adcp/types/generated_poc/core/assets/video_asset.py +8 -8
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  52. adcp/types/generated_poc/core/async_response_data.py +3 -3
  53. adcp/types/generated_poc/core/brand_manifest.py +122 -59
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +10 -10
  55. adcp/types/generated_poc/core/context.py +2 -2
  56. adcp/types/generated_poc/core/creative_asset.py +20 -19
  57. adcp/types/generated_poc/core/creative_assignment.py +4 -4
  58. adcp/types/generated_poc/core/creative_filters.py +18 -28
  59. adcp/types/generated_poc/core/creative_manifest.py +3 -3
  60. adcp/types/generated_poc/core/creative_policy.py +5 -5
  61. adcp/types/generated_poc/core/delivery_metrics.py +33 -33
  62. adcp/types/generated_poc/core/deployment.py +21 -21
  63. adcp/types/generated_poc/core/destination.py +12 -12
  64. adcp/types/generated_poc/core/error.py +7 -7
  65. adcp/types/generated_poc/core/ext.py +2 -2
  66. adcp/types/generated_poc/core/format.py +66 -66
  67. adcp/types/generated_poc/core/format_id.py +6 -6
  68. adcp/types/generated_poc/core/frequency_cap.py +3 -3
  69. adcp/types/generated_poc/core/identifier.py +3 -3
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
  71. adcp/types/generated_poc/core/measurement.py +9 -9
  72. adcp/types/generated_poc/core/media_buy.py +8 -8
  73. adcp/types/generated_poc/core/media_buy_features.py +29 -0
  74. adcp/types/generated_poc/core/offering.py +80 -0
  75. adcp/types/generated_poc/core/package.py +9 -9
  76. adcp/types/generated_poc/core/performance_feedback.py +19 -19
  77. adcp/types/generated_poc/core/placement.py +5 -5
  78. adcp/types/generated_poc/core/pricing_option.py +9 -15
  79. adcp/types/generated_poc/core/product.py +21 -21
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +89 -24
  82. adcp/types/generated_poc/core/promoted_offerings.py +29 -38
  83. adcp/types/generated_poc/core/promoted_products.py +3 -3
  84. adcp/types/generated_poc/core/property.py +10 -10
  85. adcp/types/generated_poc/core/property_id.py +5 -5
  86. adcp/types/generated_poc/core/property_list_ref.py +5 -5
  87. adcp/types/generated_poc/core/property_tag.py +5 -5
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  90. adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  91. adcp/types/generated_poc/core/push_notification_config.py +6 -6
  92. adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +5 -5
  95. adcp/types/generated_poc/core/signal_filters.py +6 -6
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +15 -15
  98. adcp/types/generated_poc/core/targeting.py +59 -18
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  101. adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
  102. adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
  103. adcp/types/generated_poc/creative/preview_render.py +26 -26
  104. adcp/types/generated_poc/enums/adcp_domain.py +5 -5
  105. adcp/types/generated_poc/enums/asset_content_type.py +14 -14
  106. adcp/types/generated_poc/enums/auth_scheme.py +3 -3
  107. adcp/types/generated_poc/enums/available_metric.py +10 -10
  108. adcp/types/generated_poc/enums/channels.py +21 -11
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
  110. adcp/types/generated_poc/enums/creative_action.py +6 -6
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
  112. adcp/types/generated_poc/enums/creative_sort_field.py +7 -7
  113. adcp/types/generated_poc/enums/creative_status.py +6 -5
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +12 -12
  115. adcp/types/generated_poc/enums/daast_version.py +3 -3
  116. adcp/types/generated_poc/enums/delivery_type.py +3 -3
  117. adcp/types/generated_poc/enums/dimension_unit.py +5 -5
  118. adcp/types/generated_poc/enums/feed_format.py +4 -4
  119. adcp/types/generated_poc/enums/feedback_source.py +5 -5
  120. adcp/types/generated_poc/enums/format_category.py +8 -8
  121. adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +3 -3
  125. adcp/types/generated_poc/enums/http_method.py +3 -3
  126. adcp/types/generated_poc/enums/identifier_types.py +20 -20
  127. adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
  129. adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
  130. adcp/types/generated_poc/enums/media_buy_status.py +5 -5
  131. adcp/types/generated_poc/enums/metric_type.py +9 -9
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +5 -5
  134. adcp/types/generated_poc/enums/pacing.py +4 -4
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +3 -3
  137. adcp/types/generated_poc/enums/pricing_model.py +8 -8
  138. adcp/types/generated_poc/enums/property_type.py +9 -8
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
  140. adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
  142. adcp/types/generated_poc/enums/sort_direction.py +3 -3
  143. adcp/types/generated_poc/enums/task_status.py +10 -10
  144. adcp/types/generated_poc/enums/task_type.py +12 -12
  145. adcp/types/generated_poc/enums/update_frequency.py +5 -5
  146. adcp/types/generated_poc/enums/url_asset_type.py +4 -4
  147. adcp/types/generated_poc/enums/validation_mode.py +3 -3
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +17 -17
  149. adcp/types/generated_poc/enums/vast_version.py +6 -6
  150. adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
  151. adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
  152. adcp/types/generated_poc/extensions/extension_meta.py +20 -12
  153. adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  154. adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  155. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  158. adcp/types/generated_poc/media_buy/create_media_buy_request.py +65 -37
  159. adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  160. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  162. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  163. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  164. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  165. adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
  166. adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
  167. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
  169. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  170. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  171. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  172. adcp/types/generated_poc/media_buy/list_creatives_response.py +54 -57
  173. adcp/types/generated_poc/media_buy/package_request.py +12 -12
  174. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  175. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  177. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  180. adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  181. adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  182. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  185. adcp/types/generated_poc/media_buy/update_media_buy_request.py +28 -124
  186. adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  187. adcp/types/generated_poc/pricing_options/cpc_option.py +40 -15
  188. adcp/types/generated_poc/pricing_options/cpcv_option.py +41 -16
  189. adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
  190. adcp/types/generated_poc/pricing_options/cpp_option.py +46 -23
  191. adcp/types/generated_poc/pricing_options/cpv_option.py +45 -26
  192. adcp/types/generated_poc/pricing_options/flat_rate_option.py +53 -47
  193. adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
  194. adcp/types/generated_poc/property/base_property_source.py +16 -16
  195. adcp/types/generated_poc/property/create_property_list_request.py +5 -5
  196. adcp/types/generated_poc/property/create_property_list_response.py +4 -4
  197. adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
  198. adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
  199. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  200. adcp/types/generated_poc/property/get_property_list_request.py +6 -6
  201. adcp/types/generated_poc/property/get_property_list_response.py +12 -12
  202. adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
  203. adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
  204. adcp/types/generated_poc/property/property_error.py +11 -11
  205. adcp/types/generated_poc/property/property_feature.py +5 -5
  206. adcp/types/generated_poc/property/property_feature_definition.py +19 -19
  207. adcp/types/generated_poc/property/property_list.py +12 -12
  208. adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
  209. adcp/types/generated_poc/property/property_list_filters.py +9 -9
  210. adcp/types/generated_poc/property/update_property_list_request.py +9 -9
  211. adcp/types/generated_poc/property/update_property_list_response.py +3 -3
  212. adcp/types/generated_poc/protocol/__init__.py +3 -0
  213. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  214. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  215. adcp/types/generated_poc/protocols/adcp_extension.py +14 -17
  216. adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  217. adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  218. adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  219. adcp/types/generated_poc/signals/get_signals_response.py +16 -16
  220. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  232. adcp/utils/format_assets.py +5 -5
  233. adcp/utils/preview_cache.py +2 -2
  234. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  235. adcp-3.0.0.dist-info/RECORD +264 -0
  236. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  237. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  238. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
  239. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  240. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp/types/generated_poc/property/list_property_features_request.py +0 -25
  243. adcp/types/generated_poc/property/list_property_features_response.py +0 -24
  244. adcp-2.19.0.dist-info/RECORD +0 -220
  245. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  246. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  247. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/package_request.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,7 +9,7 @@ from typing import Annotated
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import ConfigDict, Field
11
11
 
12
- from ..core import creative_asset
12
+ from ..core import creative_asset, creative_assignment
13
13
  from ..core import ext as ext_1
14
14
  from ..core import format_id, targeting
15
15
  from ..enums import pacing as pacing_1
@@ -17,12 +17,12 @@ from ..enums import pacing as pacing_1
17
17
 
18
18
  class PackageRequest(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="allow",
20
+ extra='allow',
21
21
  )
22
22
  bid_price: Annotated[
23
23
  float | None,
24
24
  Field(
25
- description="Bid price for auction-based CPM pricing (required if using cpm-auction-option)",
25
+ description='Bid price for auction-based CPM pricing (required if using cpm-auction-option)',
26
26
  ge=0.0,
27
27
  ),
28
28
  ] = None
@@ -31,16 +31,16 @@ class PackageRequest(AdCPBaseModel):
31
31
  Field(description="Budget allocation for this package in the media buy's currency", ge=0.0),
32
32
  ]
33
33
  buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for this package")]
34
- creative_ids: Annotated[
35
- list[str] | None,
34
+ creative_assignments: Annotated[
35
+ list[creative_assignment.CreativeAssignment] | None,
36
36
  Field(
37
- description="Creative IDs to assign to this package at creation time (references existing library creatives)"
37
+ description='Assign existing library creatives to this package with optional weights and placement targeting'
38
38
  ),
39
39
  ] = None
40
40
  creatives: Annotated[
41
41
  list[creative_asset.CreativeAsset] | None,
42
42
  Field(
43
- description="Full creative objects to upload and assign to this package at creation time (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.",
43
+ description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
44
44
  max_length=100,
45
45
  ),
46
46
  ] = None
@@ -48,18 +48,18 @@ class PackageRequest(AdCPBaseModel):
48
48
  format_ids: Annotated[
49
49
  list[format_id.FormatId] | None,
50
50
  Field(
51
- description="Array of format IDs that will be used for this package - must be supported by the product. If omitted, defaults to all formats supported by the product.",
51
+ description='Array of format IDs that will be used for this package - must be supported by the product. If omitted, defaults to all formats supported by the product.',
52
52
  min_length=1,
53
53
  ),
54
54
  ] = None
55
55
  impressions: Annotated[
56
- float | None, Field(description="Impression goal for this package", ge=0.0)
56
+ float | None, Field(description='Impression goal for this package', ge=0.0)
57
57
  ] = None
58
58
  pacing: pacing_1.Pacing | None = None
59
59
  paused: Annotated[
60
60
  bool | None,
61
61
  Field(
62
- description="Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false."
62
+ description='Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false.'
63
63
  ),
64
64
  ] = False
65
65
  pricing_option_id: Annotated[
@@ -68,5 +68,5 @@ class PackageRequest(AdCPBaseModel):
68
68
  description="ID of the selected pricing option from the product's pricing_options array"
69
69
  ),
70
70
  ]
71
- product_id: Annotated[str, Field(description="Product ID for this package")]
71
+ product_id: Annotated[str, Field(description='Product ID for this package')]
72
72
  targeting_overlay: targeting.TargetingOverlay | None = None
@@ -0,0 +1,119 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/package_update.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field, RootModel
11
+
12
+ from ..core import creative_asset, creative_assignment
13
+ from ..core import ext as ext_1
14
+ from ..core import targeting
15
+ from ..enums import pacing as pacing_1
16
+
17
+
18
+ class PackageUpdate1(AdCPBaseModel):
19
+ model_config = ConfigDict(
20
+ extra='allow',
21
+ )
22
+ bid_price: Annotated[
23
+ float | None,
24
+ Field(
25
+ description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
26
+ ge=0.0,
27
+ ),
28
+ ] = None
29
+ budget: Annotated[
30
+ float | None,
31
+ Field(
32
+ description='Updated budget allocation for this package in the currency specified by the pricing option',
33
+ ge=0.0,
34
+ ),
35
+ ] = None
36
+ buyer_ref: Annotated[
37
+ str | None, Field(description="Buyer's reference for the package to update")
38
+ ] = None
39
+ creative_assignments: Annotated[
40
+ list[creative_assignment.CreativeAssignment] | None,
41
+ Field(
42
+ description='Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.'
43
+ ),
44
+ ] = None
45
+ creatives: Annotated[
46
+ list[creative_asset.CreativeAsset] | None,
47
+ Field(
48
+ description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
49
+ max_length=100,
50
+ ),
51
+ ] = None
52
+ ext: ext_1.ExtensionObject | None = None
53
+ impressions: Annotated[
54
+ float | None, Field(description='Updated impression goal for this package', ge=0.0)
55
+ ] = None
56
+ pacing: pacing_1.Pacing | None = None
57
+ package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
58
+ paused: Annotated[
59
+ bool | None,
60
+ Field(description='Pause/resume specific package (true = paused, false = active)'),
61
+ ] = None
62
+ targeting_overlay: targeting.TargetingOverlay | None = None
63
+
64
+
65
+ class PackageUpdate2(AdCPBaseModel):
66
+ model_config = ConfigDict(
67
+ extra='allow',
68
+ )
69
+ bid_price: Annotated[
70
+ float | None,
71
+ Field(
72
+ description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
73
+ ge=0.0,
74
+ ),
75
+ ] = None
76
+ budget: Annotated[
77
+ float | None,
78
+ Field(
79
+ description='Updated budget allocation for this package in the currency specified by the pricing option',
80
+ ge=0.0,
81
+ ),
82
+ ] = None
83
+ buyer_ref: Annotated[str, Field(description="Buyer's reference for the package to update")]
84
+ creative_assignments: Annotated[
85
+ list[creative_assignment.CreativeAssignment] | None,
86
+ Field(
87
+ description='Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.'
88
+ ),
89
+ ] = None
90
+ creatives: Annotated[
91
+ list[creative_asset.CreativeAsset] | None,
92
+ Field(
93
+ description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
94
+ max_length=100,
95
+ ),
96
+ ] = None
97
+ ext: ext_1.ExtensionObject | None = None
98
+ impressions: Annotated[
99
+ float | None, Field(description='Updated impression goal for this package', ge=0.0)
100
+ ] = None
101
+ pacing: pacing_1.Pacing | None = None
102
+ package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
103
+ None
104
+ )
105
+ paused: Annotated[
106
+ bool | None,
107
+ Field(description='Pause/resume specific package (true = paused, false = active)'),
108
+ ] = None
109
+ targeting_overlay: targeting.TargetingOverlay | None = None
110
+
111
+
112
+ class PackageUpdate(RootModel[PackageUpdate1 | PackageUpdate2]):
113
+ root: Annotated[
114
+ PackageUpdate1 | PackageUpdate2,
115
+ Field(
116
+ description='Package update configuration for update_media_buy. Identifies package by package_id or buyer_ref and specifies fields to modify. Fields not present are left unchanged. Note: product_id, format_ids, and pricing_option_id cannot be changed after creation.',
117
+ title='Package Update',
118
+ ),
119
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/provide_performance_feedback_request.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -17,19 +17,19 @@ from ..enums import metric_type as metric_type_1
17
17
 
18
18
  class MeasurementPeriod(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="allow",
20
+ extra='allow',
21
21
  )
22
22
  end: Annotated[
23
- AwareDatetime, Field(description="ISO 8601 end timestamp for measurement period")
23
+ AwareDatetime, Field(description='ISO 8601 end timestamp for measurement period')
24
24
  ]
25
25
  start: Annotated[
26
- AwareDatetime, Field(description="ISO 8601 start timestamp for measurement period")
26
+ AwareDatetime, Field(description='ISO 8601 start timestamp for measurement period')
27
27
  ]
28
28
 
29
29
 
30
30
  class ProvidePerformanceFeedbackRequest1(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra="allow",
32
+ extra='allow',
33
33
  )
34
34
  buyer_ref: Annotated[
35
35
  str | None, Field(description="Buyer's reference for the media buy", min_length=1)
@@ -38,33 +38,33 @@ class ProvidePerformanceFeedbackRequest1(AdCPBaseModel):
38
38
  creative_id: Annotated[
39
39
  str | None,
40
40
  Field(
41
- description="Specific creative asset (if feedback is creative-specific)", min_length=1
41
+ description='Specific creative asset (if feedback is creative-specific)', min_length=1
42
42
  ),
43
43
  ] = None
44
44
  ext: ext_1.ExtensionObject | None = None
45
45
  feedback_source: Annotated[
46
- feedback_source_1.FeedbackSource | None, Field(description="Source of the performance data")
46
+ feedback_source_1.FeedbackSource | None, Field(description='Source of the performance data')
47
47
  ] = feedback_source_1.FeedbackSource.buyer_attribution
48
48
  measurement_period: Annotated[
49
- MeasurementPeriod, Field(description="Time period for performance measurement")
49
+ MeasurementPeriod, Field(description='Time period for performance measurement')
50
50
  ]
51
51
  media_buy_id: Annotated[
52
52
  str, Field(description="Publisher's media buy identifier", min_length=1)
53
53
  ]
54
54
  metric_type: Annotated[
55
- metric_type_1.MetricType | None, Field(description="The business metric being measured")
55
+ metric_type_1.MetricType | None, Field(description='The business metric being measured')
56
56
  ] = metric_type_1.MetricType.overall_performance
57
57
  package_id: Annotated[
58
58
  str | None,
59
59
  Field(
60
- description="Specific package within the media buy (if feedback is package-specific)",
60
+ description='Specific package within the media buy (if feedback is package-specific)',
61
61
  min_length=1,
62
62
  ),
63
63
  ] = None
64
64
  performance_index: Annotated[
65
65
  float,
66
66
  Field(
67
- description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)",
67
+ description='Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)',
68
68
  ge=0.0,
69
69
  ),
70
70
  ]
@@ -72,7 +72,7 @@ class ProvidePerformanceFeedbackRequest1(AdCPBaseModel):
72
72
 
73
73
  class ProvidePerformanceFeedbackRequest2(AdCPBaseModel):
74
74
  model_config = ConfigDict(
75
- extra="allow",
75
+ extra='allow',
76
76
  )
77
77
  buyer_ref: Annotated[
78
78
  str, Field(description="Buyer's reference for the media buy", min_length=1)
@@ -81,33 +81,33 @@ class ProvidePerformanceFeedbackRequest2(AdCPBaseModel):
81
81
  creative_id: Annotated[
82
82
  str | None,
83
83
  Field(
84
- description="Specific creative asset (if feedback is creative-specific)", min_length=1
84
+ description='Specific creative asset (if feedback is creative-specific)', min_length=1
85
85
  ),
86
86
  ] = None
87
87
  ext: ext_1.ExtensionObject | None = None
88
88
  feedback_source: Annotated[
89
- feedback_source_1.FeedbackSource | None, Field(description="Source of the performance data")
89
+ feedback_source_1.FeedbackSource | None, Field(description='Source of the performance data')
90
90
  ] = feedback_source_1.FeedbackSource.buyer_attribution
91
91
  measurement_period: Annotated[
92
- MeasurementPeriod, Field(description="Time period for performance measurement")
92
+ MeasurementPeriod, Field(description='Time period for performance measurement')
93
93
  ]
94
94
  media_buy_id: Annotated[
95
95
  str | None, Field(description="Publisher's media buy identifier", min_length=1)
96
96
  ] = None
97
97
  metric_type: Annotated[
98
- metric_type_1.MetricType | None, Field(description="The business metric being measured")
98
+ metric_type_1.MetricType | None, Field(description='The business metric being measured')
99
99
  ] = metric_type_1.MetricType.overall_performance
100
100
  package_id: Annotated[
101
101
  str | None,
102
102
  Field(
103
- description="Specific package within the media buy (if feedback is package-specific)",
103
+ description='Specific package within the media buy (if feedback is package-specific)',
104
104
  min_length=1,
105
105
  ),
106
106
  ] = None
107
107
  performance_index: Annotated[
108
108
  float,
109
109
  Field(
110
- description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)",
110
+ description='Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)',
111
111
  ge=0.0,
112
112
  ),
113
113
  ]
@@ -119,7 +119,7 @@ class ProvidePerformanceFeedbackRequest(
119
119
  root: Annotated[
120
120
  ProvidePerformanceFeedbackRequest1 | ProvidePerformanceFeedbackRequest2,
121
121
  Field(
122
- description="Request payload for provide_performance_feedback task",
123
- title="Provide Performance Feedback Request",
122
+ description='Request payload for provide_performance_feedback task',
123
+ title='Provide Performance Feedback Request',
124
124
  ),
125
125
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/provide_performance_feedback_response.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -16,25 +16,25 @@ from ..core import ext as ext_1
16
16
 
17
17
  class ProvidePerformanceFeedbackResponse1(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra="allow",
19
+ extra='allow',
20
20
  )
21
21
  context: context_1.ContextObject | None = None
22
22
  ext: ext_1.ExtensionObject | None = None
23
23
  success: Annotated[
24
24
  Literal[True],
25
- Field(description="Whether the performance feedback was successfully received"),
25
+ Field(description='Whether the performance feedback was successfully received'),
26
26
  ]
27
27
 
28
28
 
29
29
  class ProvidePerformanceFeedbackResponse2(AdCPBaseModel):
30
30
  model_config = ConfigDict(
31
- extra="allow",
31
+ extra='allow',
32
32
  )
33
33
  context: context_1.ContextObject | None = None
34
34
  errors: Annotated[
35
35
  list[error.Error],
36
36
  Field(
37
- description="Array of errors explaining why feedback was rejected (e.g., invalid measurement period, missing campaign data)",
37
+ description='Array of errors explaining why feedback was rejected (e.g., invalid measurement period, missing campaign data)',
38
38
  min_length=1,
39
39
  ),
40
40
  ]
@@ -47,7 +47,7 @@ class ProvidePerformanceFeedbackResponse(
47
47
  root: Annotated[
48
48
  ProvidePerformanceFeedbackResponse1 | ProvidePerformanceFeedbackResponse2,
49
49
  Field(
50
- description="Response payload for provide_performance_feedback task. Returns either success confirmation OR error information, never both.",
51
- title="Provide Performance Feedback Response",
50
+ description='Response payload for provide_performance_feedback task. Returns either success confirmation OR error information, never both.',
51
+ title='Provide Performance Feedback Response',
52
52
  ),
53
53
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_async_response_input_required.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,17 +15,17 @@ from ..core import ext as ext_1
15
15
 
16
16
 
17
17
  class Reason(Enum):
18
- APPROVAL_REQUIRED = "APPROVAL_REQUIRED"
19
- ASSET_CONFIRMATION = "ASSET_CONFIRMATION"
20
- FORMAT_CLARIFICATION = "FORMAT_CLARIFICATION"
18
+ APPROVAL_REQUIRED = 'APPROVAL_REQUIRED'
19
+ ASSET_CONFIRMATION = 'ASSET_CONFIRMATION'
20
+ FORMAT_CLARIFICATION = 'FORMAT_CLARIFICATION'
21
21
 
22
22
 
23
23
  class SyncCreativesInputRequired(AdCPBaseModel):
24
24
  model_config = ConfigDict(
25
- extra="allow",
25
+ extra='allow',
26
26
  )
27
27
  context: context_1.ContextObject | None = None
28
28
  ext: ext_1.ExtensionObject | None = None
29
29
  reason: Annotated[
30
- Reason | None, Field(description="Reason code indicating why buyer input is needed")
30
+ Reason | None, Field(description='Reason code indicating why buyer input is needed')
31
31
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_async_response_submitted.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -13,7 +13,7 @@ from ..core import ext as ext_1
13
13
 
14
14
  class SyncCreativesSubmitted(AdCPBaseModel):
15
15
  model_config = ConfigDict(
16
- extra="allow",
16
+ extra='allow',
17
17
  )
18
18
  context: context_1.ContextObject | None = None
19
19
  ext: ext_1.ExtensionObject | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_async_response_working.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,23 +15,23 @@ from ..core import ext as ext_1
15
15
 
16
16
  class SyncCreativesWorking(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra="allow",
18
+ extra='allow',
19
19
  )
20
20
  context: context_1.ContextObject | None = None
21
21
  creatives_processed: Annotated[
22
- int | None, Field(description="Number of creatives processed so far", ge=0)
22
+ int | None, Field(description='Number of creatives processed so far', ge=0)
23
23
  ] = None
24
24
  creatives_total: Annotated[
25
- int | None, Field(description="Total number of creatives to process", ge=0)
25
+ int | None, Field(description='Total number of creatives to process', ge=0)
26
26
  ] = None
27
27
  current_step: Annotated[
28
- str | None, Field(description="Current step or phase of the operation")
28
+ str | None, Field(description='Current step or phase of the operation')
29
29
  ] = None
30
30
  ext: ext_1.ExtensionObject | None = None
31
31
  percentage: Annotated[
32
- float | None, Field(description="Completion percentage (0-100)", ge=0.0, le=100.0)
32
+ float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
33
33
  ] = None
34
- step_number: Annotated[int | None, Field(description="Current step number", ge=1)] = None
34
+ step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
35
35
  total_steps: Annotated[
36
- int | None, Field(description="Total number of steps in the operation", ge=1)
36
+ int | None, Field(description='Total number of steps in the operation', ge=1)
37
37
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_request.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -18,41 +18,41 @@ from ..enums import validation_mode as validation_mode_1
18
18
 
19
19
  class SyncCreativesRequest(AdCPBaseModel):
20
20
  model_config = ConfigDict(
21
- extra="allow",
21
+ extra='allow',
22
22
  )
23
23
  assignments: Annotated[
24
24
  dict[str, list[str]] | None,
25
- Field(description="Optional bulk assignment of creatives to packages"),
25
+ Field(description='Optional bulk assignment of creatives to packages'),
26
26
  ] = None
27
27
  context: context_1.ContextObject | None = None
28
28
  creative_ids: Annotated[
29
29
  list[str] | None,
30
30
  Field(
31
- description="Optional filter to limit sync scope to specific creative IDs. When provided, only these creatives will be created/updated. Other creatives in the library are unaffected. Useful for partial updates and error recovery.",
31
+ description='Optional filter to limit sync scope to specific creative IDs. When provided, only these creatives will be created/updated. Other creatives in the library are unaffected. Useful for partial updates and error recovery.',
32
32
  max_length=100,
33
33
  ),
34
34
  ] = None
35
35
  creatives: Annotated[
36
36
  list[creative_asset.CreativeAsset],
37
- Field(description="Array of creative assets to sync (create or update)", max_length=100),
37
+ Field(description='Array of creative assets to sync (create or update)', max_length=100),
38
38
  ]
39
39
  delete_missing: Annotated[
40
40
  bool | None,
41
41
  Field(
42
- description="When true, creatives not included in this sync will be archived. Use with caution for full library replacement."
42
+ description='When true, creatives not included in this sync will be archived. Use with caution for full library replacement.'
43
43
  ),
44
44
  ] = False
45
45
  dry_run: Annotated[
46
46
  bool | None,
47
47
  Field(
48
- description="When true, preview changes without applying them. Returns what would be created/updated/deleted."
48
+ description='When true, preview changes without applying them. Returns what would be created/updated/deleted.'
49
49
  ),
50
50
  ] = False
51
51
  ext: ext_1.ExtensionObject | None = None
52
52
  push_notification_config: Annotated[
53
53
  push_notification_config_1.PushNotificationConfig | None,
54
54
  Field(
55
- description="Optional webhook configuration for async sync notifications. Publisher will send webhook when sync completes if operation takes longer than immediate response time (typically for large bulk operations or manual approval/HITL)."
55
+ description='Optional webhook configuration for async sync notifications. Publisher will send webhook when sync completes if operation takes longer than immediate response time (typically for large bulk operations or manual approval/HITL).'
56
56
  ),
57
57
  ] = None
58
58
  validation_mode: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_response.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -17,28 +17,28 @@ from ..enums import creative_action
17
17
 
18
18
  class Creative(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="allow",
20
+ extra='allow',
21
21
  )
22
22
  action: Annotated[
23
- creative_action.CreativeAction, Field(description="Action taken for this creative")
23
+ creative_action.CreativeAction, Field(description='Action taken for this creative')
24
24
  ]
25
25
  assigned_to: Annotated[
26
26
  list[str] | None,
27
27
  Field(
28
- description="Package IDs this creative was successfully assigned to (only present when assignments were requested)"
28
+ description='Package IDs this creative was successfully assigned to (only present when assignments were requested)'
29
29
  ),
30
30
  ] = None
31
31
  assignment_errors: Annotated[
32
32
  dict[str, str] | None,
33
33
  Field(
34
- description="Assignment errors by package ID (only present when assignment failures occurred)"
34
+ description='Assignment errors by package ID (only present when assignment failures occurred)'
35
35
  ),
36
36
  ] = None
37
37
  changes: Annotated[
38
38
  list[str] | None,
39
39
  Field(description="Field names that were modified (only present when action='updated')"),
40
40
  ] = None
41
- creative_id: Annotated[str, Field(description="Creative ID from the request")]
41
+ creative_id: Annotated[str, Field(description='Creative ID from the request')]
42
42
  errors: Annotated[
43
43
  list[str] | None,
44
44
  Field(description="Validation or processing errors (only present when action='failed')"),
@@ -46,26 +46,26 @@ class Creative(AdCPBaseModel):
46
46
  expires_at: Annotated[
47
47
  AwareDatetime | None,
48
48
  Field(
49
- description="ISO 8601 timestamp when preview link expires (only present when preview_url exists)"
49
+ description='ISO 8601 timestamp when preview link expires (only present when preview_url exists)'
50
50
  ),
51
51
  ] = None
52
52
  platform_id: Annotated[
53
- str | None, Field(description="Platform-specific ID assigned to the creative")
53
+ str | None, Field(description='Platform-specific ID assigned to the creative')
54
54
  ] = None
55
55
  preview_url: Annotated[
56
56
  AnyUrl | None,
57
57
  Field(
58
- description="Preview URL for generative creatives (only present for generative formats)"
58
+ description='Preview URL for generative creatives (only present for generative formats)'
59
59
  ),
60
60
  ] = None
61
61
  warnings: Annotated[
62
- list[str] | None, Field(description="Non-fatal warnings about this creative")
62
+ list[str] | None, Field(description='Non-fatal warnings about this creative')
63
63
  ] = None
64
64
 
65
65
 
66
66
  class SyncCreativesResponse1(AdCPBaseModel):
67
67
  model_config = ConfigDict(
68
- extra="allow",
68
+ extra='allow',
69
69
  )
70
70
  context: context_1.ContextObject | None = None
71
71
  creatives: Annotated[
@@ -75,20 +75,20 @@ class SyncCreativesResponse1(AdCPBaseModel):
75
75
  ),
76
76
  ]
77
77
  dry_run: Annotated[
78
- bool | None, Field(description="Whether this was a dry run (no actual changes made)")
78
+ bool | None, Field(description='Whether this was a dry run (no actual changes made)')
79
79
  ] = None
80
80
  ext: ext_1.ExtensionObject | None = None
81
81
 
82
82
 
83
83
  class SyncCreativesResponse2(AdCPBaseModel):
84
84
  model_config = ConfigDict(
85
- extra="allow",
85
+ extra='allow',
86
86
  )
87
87
  context: context_1.ContextObject | None = None
88
88
  errors: Annotated[
89
89
  list[error.Error],
90
90
  Field(
91
- description="Operation-level errors that prevented processing any creatives (e.g., authentication failure, service unavailable, invalid request format)",
91
+ description='Operation-level errors that prevented processing any creatives (e.g., authentication failure, service unavailable, invalid request format)',
92
92
  min_length=1,
93
93
  ),
94
94
  ]
@@ -99,7 +99,7 @@ class SyncCreativesResponse(RootModel[SyncCreativesResponse1 | SyncCreativesResp
99
99
  root: Annotated[
100
100
  SyncCreativesResponse1 | SyncCreativesResponse2,
101
101
  Field(
102
- description="Response from creative sync operation. Returns either per-creative results (best-effort processing) OR operation-level errors (complete failure). This enforces atomic semantics at the operation level while allowing per-item failures within successful operations.",
103
- title="Sync Creatives Response",
102
+ description='Response from creative sync operation. Returns either per-creative results (best-effort processing) OR operation-level errors (complete failure). This enforces atomic semantics at the operation level while allowing per-item failures within successful operations.',
103
+ title='Sync Creatives Response',
104
104
  ),
105
105
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_async_response_input_required.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,16 +15,16 @@ from ..core import ext as ext_1
15
15
 
16
16
 
17
17
  class Reason(Enum):
18
- APPROVAL_REQUIRED = "APPROVAL_REQUIRED"
19
- CHANGE_CONFIRMATION = "CHANGE_CONFIRMATION"
18
+ APPROVAL_REQUIRED = 'APPROVAL_REQUIRED'
19
+ CHANGE_CONFIRMATION = 'CHANGE_CONFIRMATION'
20
20
 
21
21
 
22
22
  class UpdateMediaBuyInputRequired(AdCPBaseModel):
23
23
  model_config = ConfigDict(
24
- extra="allow",
24
+ extra='allow',
25
25
  )
26
26
  context: context_1.ContextObject | None = None
27
27
  ext: ext_1.ExtensionObject | None = None
28
28
  reason: Annotated[
29
- Reason | None, Field(description="Reason code indicating why input is needed")
29
+ Reason | None, Field(description='Reason code indicating why input is needed')
30
30
  ] = None