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: core/format.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
 
@@ -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,67 +26,67 @@ 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
 
68
68
 
69
- class Assets1(AdCPBaseModel):
69
+ 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
 
@@ -95,7 +95,7 @@ class AssetsRequired(AdCPBaseModel):
95
95
  asset_id: Annotated[
96
96
  str,
97
97
  Field(
98
- description="Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object."
98
+ description='Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object.'
99
99
  ),
100
100
  ]
101
101
  asset_role: Annotated[
@@ -104,36 +104,36 @@ class AssetsRequired(AdCPBaseModel):
104
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
105
  ),
106
106
  ] = None
107
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
107
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
108
108
  item_type: Annotated[
109
- Literal["individual"],
110
- Field(description="Discriminator indicating this is an individual asset requirement"),
109
+ Literal['individual'],
110
+ Field(description='Discriminator indicating this is an individual asset requirement'),
111
111
  ]
112
- required: Annotated[bool | None, Field(description="Whether this asset is required")] = None
112
+ required: Annotated[bool | None, Field(description='Whether this asset is required')] = None
113
113
  requirements: Annotated[
114
114
  dict[str, Any] | None,
115
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)."
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
117
  ),
118
118
  ] = None
119
119
 
120
120
 
121
121
  class Asset2(AdCPBaseModel):
122
- asset_id: Annotated[str, Field(description="Identifier for this asset within the group")]
122
+ asset_id: Annotated[str, Field(description='Identifier for this asset within the group')]
123
123
  asset_role: Annotated[
124
124
  str | None,
125
125
  Field(
126
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
127
  ),
128
128
  ] = None
129
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
129
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
130
130
  required: Annotated[
131
- bool | None, Field(description="Whether this asset is required in each repetition")
131
+ bool | None, Field(description='Whether this asset is required in each repetition')
132
132
  ] = None
133
133
  requirements: Annotated[
134
134
  dict[str, Any] | None,
135
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)."
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
137
  ),
138
138
  ] = None
139
139
 
@@ -143,14 +143,14 @@ class AssetsRequired1(AdCPBaseModel):
143
143
  str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
144
144
  ]
145
145
  assets: Annotated[
146
- list[Asset2], Field(description="Assets within each repetition of this group")
146
+ list[Asset2], Field(description='Assets within each repetition of this group')
147
147
  ]
148
148
  item_type: Annotated[
149
- Literal["repeatable_group"],
150
- Field(description="Discriminator indicating this is a repeatable asset group"),
149
+ Literal['repeatable_group'],
150
+ Field(description='Discriminator indicating this is a repeatable asset group'),
151
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)]
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
154
 
155
155
 
156
156
  class Responsive(AdCPBaseModel):
@@ -163,36 +163,36 @@ class Dimensions(AdCPBaseModel):
163
163
  str | None,
164
164
  Field(
165
165
  description="Fixed aspect ratio constraint (e.g., '16:9', '4:3', '1:1')",
166
- pattern="^\\d+:\\d+$",
166
+ pattern='^\\d+:\\d+$',
167
167
  ),
168
168
  ] = None
169
- height: Annotated[int | None, Field(description="Fixed height in pixels", ge=1)] = None
169
+ height: Annotated[int | None, Field(description='Fixed height in pixels', ge=1)] = None
170
170
  max_height: Annotated[
171
- int | None, Field(description="Maximum height in pixels for responsive renders", ge=1)
171
+ int | None, Field(description='Maximum height in pixels for responsive renders', ge=1)
172
172
  ] = None
173
173
  max_width: Annotated[
174
- int | None, Field(description="Maximum width in pixels for responsive renders", ge=1)
174
+ int | None, Field(description='Maximum width in pixels for responsive renders', ge=1)
175
175
  ] = None
176
176
  min_height: Annotated[
177
- int | None, Field(description="Minimum height in pixels for responsive renders", ge=1)
177
+ int | None, Field(description='Minimum height in pixels for responsive renders', ge=1)
178
178
  ] = None
179
179
  min_width: Annotated[
180
- int | None, Field(description="Minimum width in pixels for responsive renders", ge=1)
180
+ int | None, Field(description='Minimum width in pixels for responsive renders', ge=1)
181
181
  ] = None
182
182
  responsive: Annotated[
183
- Responsive | None, Field(description="Indicates which dimensions are responsive/fluid")
183
+ Responsive | None, Field(description='Indicates which dimensions are responsive/fluid')
184
184
  ] = None
185
- width: Annotated[int | None, Field(description="Fixed width in pixels", ge=1)] = None
185
+ width: Annotated[int | None, Field(description='Fixed width in pixels', ge=1)] = None
186
186
 
187
187
 
188
188
  class Renders(AdCPBaseModel):
189
189
  dimensions: Annotated[
190
- Dimensions, Field(description="Dimensions for this rendered piece (in pixels)")
190
+ Dimensions, Field(description='Dimensions for this rendered piece (in pixels)')
191
191
  ]
192
192
  parameters_from_format_id: Annotated[
193
193
  bool | None,
194
194
  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."
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.'
196
196
  ),
197
197
  ] = None
198
198
  role: Annotated[
@@ -209,12 +209,12 @@ class Dimensions1(Dimensions):
209
209
 
210
210
  class Renders1(AdCPBaseModel):
211
211
  dimensions: Annotated[
212
- Dimensions1 | None, Field(description="Dimensions for this rendered piece (in pixels)")
212
+ Dimensions1 | None, Field(description='Dimensions for this rendered piece (in pixels)')
213
213
  ] = None
214
214
  parameters_from_format_id: Annotated[
215
215
  Literal[True],
216
216
  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."
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.'
218
218
  ),
219
219
  ]
220
220
  role: Annotated[
@@ -227,50 +227,50 @@ class Renders1(AdCPBaseModel):
227
227
 
228
228
  class FormatCard(AdCPBaseModel):
229
229
  model_config = ConfigDict(
230
- extra="allow",
230
+ extra='allow',
231
231
  )
232
232
  format_id: Annotated[
233
233
  format_id_1.FormatId,
234
234
  Field(
235
- description="Creative format defining the card layout (typically format_card_standard)"
235
+ description='Creative format defining the card layout (typically format_card_standard)'
236
236
  ),
237
237
  ]
238
238
  manifest: Annotated[
239
239
  dict[str, Any],
240
- Field(description="Asset manifest for rendering the card, structure defined by the format"),
240
+ Field(description='Asset manifest for rendering the card, structure defined by the format'),
241
241
  ]
242
242
 
243
243
 
244
244
  class FormatCardDetailed(AdCPBaseModel):
245
245
  model_config = ConfigDict(
246
- extra="allow",
246
+ extra='allow',
247
247
  )
248
248
  format_id: Annotated[
249
249
  format_id_1.FormatId,
250
250
  Field(
251
- description="Creative format defining the detailed card layout (typically format_card_detailed)"
251
+ description='Creative format defining the detailed card layout (typically format_card_detailed)'
252
252
  ),
253
253
  ]
254
254
  manifest: Annotated[
255
255
  dict[str, Any],
256
256
  Field(
257
- description="Asset manifest for rendering the detailed card, structure defined by the format"
257
+ description='Asset manifest for rendering the detailed card, structure defined by the format'
258
258
  ),
259
259
  ]
260
260
 
261
261
 
262
262
  class Format(AdCPBaseModel):
263
263
  model_config = ConfigDict(
264
- extra="allow",
264
+ extra='allow',
265
265
  )
266
266
  accepts_parameters: Annotated[
267
267
  list[format_id_parameter.FormatIdParameter] | None,
268
268
  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."
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.'
270
270
  ),
271
271
  ] = None
272
272
  assets: Annotated[
273
- list[Assets | Assets1] | None,
273
+ list[Assets | Assets5] | None,
274
274
  Field(
275
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
276
  ),
@@ -284,65 +284,65 @@ class Format(AdCPBaseModel):
284
284
  ] = None
285
285
  delivery: Annotated[
286
286
  dict[str, Any] | None,
287
- Field(description="Delivery method specifications (e.g., hosted, VAST, third-party tags)"),
287
+ Field(description='Delivery method specifications (e.g., hosted, VAST, third-party tags)'),
288
288
  ] = None
289
289
  description: Annotated[
290
290
  str | None,
291
291
  Field(
292
- description="Plain text explanation of what this format does and what assets it requires"
292
+ description='Plain text explanation of what this format does and what assets it requires'
293
293
  ),
294
294
  ] = None
295
295
  example_url: Annotated[
296
296
  AnyUrl | None,
297
297
  Field(
298
- description="Optional URL to showcase page with examples and interactive demos of this format"
298
+ description='Optional URL to showcase page with examples and interactive demos of this format'
299
299
  ),
300
300
  ] = None
301
301
  format_card: Annotated[
302
302
  FormatCard | None,
303
303
  Field(
304
- description="Optional standard visual card (300x400px) for displaying this format in user interfaces. Can be rendered via preview_creative or pre-generated."
304
+ description='Optional standard visual card (300x400px) for displaying this format in user interfaces. Can be rendered via preview_creative or pre-generated.'
305
305
  ),
306
306
  ] = None
307
307
  format_card_detailed: Annotated[
308
308
  FormatCardDetailed | None,
309
309
  Field(
310
- description="Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages."
310
+ description='Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages.'
311
311
  ),
312
312
  ] = None
313
313
  format_id: Annotated[
314
314
  format_id_1.FormatId,
315
- Field(description="Structured format identifier with agent URL and format name"),
315
+ Field(description='Structured format identifier with agent URL and format name'),
316
316
  ]
317
- name: Annotated[str, Field(description="Human-readable format name")]
317
+ name: Annotated[str, Field(description='Human-readable format name')]
318
318
  output_format_ids: Annotated[
319
319
  list[format_id_1.FormatId] | None,
320
320
  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)."
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
322
  ),
323
323
  ] = None
324
324
  preview_image: Annotated[
325
325
  AnyUrl | None,
326
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."
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.'
328
328
  ),
329
329
  ] = None
330
330
  renders: Annotated[
331
331
  list[Renders | Renders1] | None,
332
332
  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.",
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.',
334
334
  min_length=1,
335
335
  ),
336
336
  ] = None
337
337
  supported_macros: Annotated[
338
338
  list[str] | None,
339
339
  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."
340
+ description='List of universal macros supported by this format (e.g., MEDIA_BUY_ID, CACHEBUSTER, DEVICE_ID). Used for validation and developer tooling.'
341
341
  ),
342
342
  ] = None
343
343
  type: Annotated[
344
344
  format_category.FormatCategory,
345
345
  Field(
346
- description="Media type of this format - determines rendering method and asset requirements"
346
+ description='Media type of this format - determines rendering method and asset requirements'
347
347
  ),
348
348
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/format_id.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
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/frequency_cap.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
 
@@ -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
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/identifier.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
 
@@ -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,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/mcp_webhook_payload.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -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
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/measurement.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
 
@@ -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-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 . import package
16
16
 
17
17
  class MediaBuy(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra="allow",
19
+ extra='allow',
20
20
  )
21
21
  buyer_ref: Annotated[
22
22
  str | None, Field(description="Buyer's reference identifier for this media buy")
23
23
  ] = None
24
- created_at: Annotated[AwareDatetime | None, Field(description="Creation timestamp")] = None
24
+ created_at: Annotated[AwareDatetime | None, Field(description='Creation timestamp')] = None
25
25
  creative_deadline: Annotated[
26
- AwareDatetime | None, Field(description="ISO 8601 timestamp for creative upload deadline")
26
+ AwareDatetime | None, Field(description='ISO 8601 timestamp for creative upload deadline')
27
27
  ] = None
28
28
  ext: ext_1.ExtensionObject | None = None
29
29
  media_buy_id: Annotated[
30
30
  str, Field(description="Publisher's unique identifier for the media buy")
31
31
  ]
32
32
  packages: Annotated[
33
- list[package.Package], Field(description="Array of packages within this media buy")
33
+ list[package.Package], Field(description='Array of packages within this media buy')
34
34
  ]
35
35
  promoted_offering: Annotated[
36
- str, Field(description="Description of advertiser and what is being promoted")
36
+ str, Field(description='Description of advertiser and what is being promoted')
37
37
  ]
38
38
  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
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