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/get_products_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
 
@@ -17,16 +17,19 @@ from ..core import product_filters, property_list_ref
17
17
 
18
18
  class GetProductsRequest(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="allow",
20
+ extra='allow',
21
21
  )
22
22
  brand_manifest: Annotated[
23
23
  brand_manifest_ref.BrandManifestReference | None,
24
24
  Field(
25
- description="Brand information manifest providing brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest."
25
+ description='Brand information manifest providing brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest.'
26
26
  ),
27
27
  ] = None
28
28
  brief: Annotated[
29
- str | None, Field(description="Natural language description of campaign requirements")
29
+ str | None,
30
+ Field(
31
+ description="Natural language description of campaign requirements. When refining a proposal, can include instructions like 'focus more on German speakers' or 'increase mobile allocation'."
32
+ ),
30
33
  ] = None
31
34
  context: context_1.ContextObject | None = None
32
35
  ext: ext_1.ExtensionObject | None = None
@@ -34,6 +37,12 @@ class GetProductsRequest(AdCPBaseModel):
34
37
  property_list: Annotated[
35
38
  property_list_ref.PropertyListReference | None,
36
39
  Field(
37
- description="[AdCP 3.0] Reference to an externally managed property list. When provided, the sales agent should filter products to only those available on properties in the list."
40
+ description='[AdCP 3.0] Reference to an externally managed property list. When provided, the sales agent should filter products to only those available on properties in the list.'
41
+ ),
42
+ ] = None
43
+ proposal_id: Annotated[
44
+ str | None,
45
+ Field(
46
+ description='Optional proposal ID to refine. When provided with a brief, the publisher will use the brief as refinement instructions for the specified proposal and return an updated version.'
38
47
  ),
39
48
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_products_response.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
 
@@ -12,23 +12,29 @@ from pydantic import ConfigDict, Field
12
12
  from ..core import context as context_1
13
13
  from ..core import error
14
14
  from ..core import ext as ext_1
15
- from ..core import product
15
+ from ..core import product, proposal
16
16
 
17
17
 
18
18
  class GetProductsResponse(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="allow",
20
+ extra='allow',
21
21
  )
22
22
  context: context_1.ContextObject | None = None
23
23
  errors: Annotated[
24
24
  list[error.Error] | None,
25
- Field(description="Task-specific errors and warnings (e.g., product filtering issues)"),
25
+ Field(description='Task-specific errors and warnings (e.g., product filtering issues)'),
26
26
  ] = None
27
27
  ext: ext_1.ExtensionObject | None = None
28
- products: Annotated[list[product.Product], Field(description="Array of matching products")]
28
+ products: Annotated[list[product.Product], Field(description='Array of matching products')]
29
29
  property_list_applied: Annotated[
30
30
  bool | None,
31
31
  Field(
32
- description="[AdCP 3.0] Indicates whether property_list filtering was applied. True if the agent filtered products based on the provided property_list. Absent or false if property_list was not provided or not supported by this agent."
32
+ description='[AdCP 3.0] Indicates whether property_list filtering was applied. True if the agent filtered products based on the provided property_list. Absent or false if property_list was not provided or not supported by this agent.'
33
+ ),
34
+ ] = None
35
+ proposals: Annotated[
36
+ list[proposal.Proposal] | None,
37
+ Field(
38
+ description='Optional array of proposed media plans with budget allocations across products. Publishers include proposals when they can provide strategic guidance based on the brief. Proposals are actionable - buyers can refine them via subsequent get_products calls or execute them directly via create_media_buy.'
33
39
  ),
34
40
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_authorized_properties_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,21 +18,21 @@ class PublisherDomain(RootModel[str]):
18
18
  str,
19
19
  Field(
20
20
  description="Publisher domain to filter by (e.g., 'cnn.com', 'espn.com')",
21
- pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
21
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
22
22
  ),
23
23
  ]
24
24
 
25
25
 
26
26
  class ListAuthorizedPropertiesRequest(AdCPBaseModel):
27
27
  model_config = ConfigDict(
28
- extra="allow",
28
+ extra='allow',
29
29
  )
30
30
  context: context_1.ContextObject | None = None
31
31
  ext: ext_1.ExtensionObject | None = None
32
32
  publisher_domains: Annotated[
33
33
  list[PublisherDomain] | None,
34
34
  Field(
35
- description="Filter to specific publisher domains (optional). If omitted, returns all publishers this agent represents.",
35
+ description='Filter to specific publisher domains (optional). If omitted, returns all publishers this agent represents.',
36
36
  min_length=1,
37
37
  ),
38
38
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_authorized_properties_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,7 +16,7 @@ from ..enums import channels
16
16
 
17
17
 
18
18
  class PrimaryCountry(RootModel[str]):
19
- root: Annotated[str, Field(pattern="^[A-Z]{2}$")]
19
+ root: Annotated[str, Field(pattern='^[A-Z]{2}$')]
20
20
 
21
21
 
22
22
  class PublisherDomain(RootModel[str]):
@@ -24,14 +24,14 @@ class PublisherDomain(RootModel[str]):
24
24
  str,
25
25
  Field(
26
26
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
27
- pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
27
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
28
28
  ),
29
29
  ]
30
30
 
31
31
 
32
32
  class ListAuthorizedPropertiesResponse(AdCPBaseModel):
33
33
  model_config = ConfigDict(
34
- extra="allow",
34
+ extra='allow',
35
35
  )
36
36
  advertising_policies: Annotated[
37
37
  str | None,
@@ -44,7 +44,7 @@ class ListAuthorizedPropertiesResponse(AdCPBaseModel):
44
44
  context: context_1.ContextObject | None = None
45
45
  errors: Annotated[
46
46
  list[error.Error] | None,
47
- Field(description="Task-specific errors and warnings (e.g., property availability issues)"),
47
+ Field(description='Task-specific errors and warnings (e.g., property availability issues)'),
48
48
  ] = None
49
49
  ext: ext_1.ExtensionObject | None = None
50
50
  last_updated: Annotated[
@@ -56,22 +56,22 @@ class ListAuthorizedPropertiesResponse(AdCPBaseModel):
56
56
  portfolio_description: Annotated[
57
57
  str | None,
58
58
  Field(
59
- description="Markdown-formatted description of the property portfolio, including inventory types, audience characteristics, and special features.",
59
+ description='Markdown-formatted description of the property portfolio, including inventory types, audience characteristics, and special features.',
60
60
  max_length=5000,
61
61
  min_length=1,
62
62
  ),
63
63
  ] = None
64
64
  primary_channels: Annotated[
65
- list[channels.AdvertisingChannels] | None,
65
+ list[channels.MediaChannel] | None,
66
66
  Field(
67
- description="Primary advertising channels represented in this property portfolio. Helps buying agents quickly filter relevance.",
67
+ description='Primary advertising channels represented in this property portfolio. Helps buying agents quickly filter relevance.',
68
68
  min_length=1,
69
69
  ),
70
70
  ] = None
71
71
  primary_countries: Annotated[
72
72
  list[PrimaryCountry] | None,
73
73
  Field(
74
- description="Primary countries (ISO 3166-1 alpha-2 codes) where properties are concentrated. Helps buying agents quickly filter relevance.",
74
+ description='Primary countries (ISO 3166-1 alpha-2 codes) where properties are concentrated. Helps buying agents quickly filter relevance.',
75
75
  min_length=1,
76
76
  ),
77
77
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_creative_formats_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,7 +17,7 @@ from ..enums import asset_content_type, format_category
17
17
 
18
18
  class ListCreativeFormatsRequest(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="allow",
20
+ extra='allow',
21
21
  )
22
22
  asset_types: Annotated[
23
23
  list[asset_content_type.AssetContentType] | None,
@@ -30,45 +30,45 @@ class ListCreativeFormatsRequest(AdCPBaseModel):
30
30
  format_ids: Annotated[
31
31
  list[format_id.FormatId] | None,
32
32
  Field(
33
- description="Return only these specific format IDs (e.g., from get_products response)"
33
+ description='Return only these specific format IDs (e.g., from get_products response)'
34
34
  ),
35
35
  ] = None
36
36
  is_responsive: Annotated[
37
37
  bool | None,
38
38
  Field(
39
- description="Filter for responsive formats that adapt to container size. When true, returns formats without fixed dimensions."
39
+ description='Filter for responsive formats that adapt to container size. When true, returns formats without fixed dimensions.'
40
40
  ),
41
41
  ] = None
42
42
  max_height: Annotated[
43
43
  int | None,
44
44
  Field(
45
- description="Maximum height in pixels (inclusive). Returns formats where ANY render has height <= this value. For multi-render formats, matches if at least one render fits."
45
+ description='Maximum height in pixels (inclusive). Returns formats where ANY render has height <= this value. For multi-render formats, matches if at least one render fits.'
46
46
  ),
47
47
  ] = None
48
48
  max_width: Annotated[
49
49
  int | None,
50
50
  Field(
51
- description="Maximum width in pixels (inclusive). Returns formats where ANY render has width <= this value. For multi-render formats, matches if at least one render fits."
51
+ description='Maximum width in pixels (inclusive). Returns formats where ANY render has width <= this value. For multi-render formats, matches if at least one render fits.'
52
52
  ),
53
53
  ] = None
54
54
  min_height: Annotated[
55
55
  int | None,
56
56
  Field(
57
- description="Minimum height in pixels (inclusive). Returns formats where ANY render has height >= this value."
57
+ description='Minimum height in pixels (inclusive). Returns formats where ANY render has height >= this value.'
58
58
  ),
59
59
  ] = None
60
60
  min_width: Annotated[
61
61
  int | None,
62
62
  Field(
63
- description="Minimum width in pixels (inclusive). Returns formats where ANY render has width >= this value."
63
+ description='Minimum width in pixels (inclusive). Returns formats where ANY render has width >= this value.'
64
64
  ),
65
65
  ] = None
66
66
  name_search: Annotated[
67
- str | None, Field(description="Search for formats by name (case-insensitive partial match)")
67
+ str | None, Field(description='Search for formats by name (case-insensitive partial match)')
68
68
  ] = None
69
69
  type: Annotated[
70
70
  format_category.FormatCategory | None,
71
71
  Field(
72
- description="Filter by format type (technical categories with distinct requirements)"
72
+ description='Filter by format type (technical categories with distinct requirements)'
73
73
  ),
74
74
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_creative_formats_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
 
@@ -18,7 +18,7 @@ from ..enums import creative_agent_capability
18
18
 
19
19
  class CreativeAgent(AdCPBaseModel):
20
20
  agent_name: Annotated[
21
- str | None, Field(description="Human-readable name for the creative agent")
21
+ str | None, Field(description='Human-readable name for the creative agent')
22
22
  ] = None
23
23
  agent_url: Annotated[
24
24
  AnyUrl,
@@ -28,24 +28,24 @@ class CreativeAgent(AdCPBaseModel):
28
28
  ]
29
29
  capabilities: Annotated[
30
30
  list[creative_agent_capability.CreativeAgentCapability] | None,
31
- Field(description="Capabilities this creative agent provides"),
31
+ Field(description='Capabilities this creative agent provides'),
32
32
  ] = None
33
33
 
34
34
 
35
35
  class ListCreativeFormatsResponse(AdCPBaseModel):
36
36
  model_config = ConfigDict(
37
- extra="allow",
37
+ extra='allow',
38
38
  )
39
39
  context: context_1.ContextObject | None = None
40
40
  creative_agents: Annotated[
41
41
  list[CreativeAgent] | None,
42
42
  Field(
43
- description="Optional: Creative agents that provide additional formats. Buyers can recursively query these agents to discover more formats. No authentication required for list_creative_formats."
43
+ description='Optional: Creative agents that provide additional formats. Buyers can recursively query these agents to discover more formats. No authentication required for list_creative_formats.'
44
44
  ),
45
45
  ] = None
46
46
  errors: Annotated[
47
47
  list[error.Error] | None,
48
- Field(description="Task-specific errors and warnings (e.g., format availability issues)"),
48
+ Field(description='Task-specific errors and warnings (e.g., format availability issues)'),
49
49
  ] = None
50
50
  ext: ext_1.ExtensionObject | None = None
51
51
  formats: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_creatives_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
 
@@ -17,60 +17,60 @@ from ..enums import creative_sort_field, sort_direction
17
17
 
18
18
 
19
19
  class FieldModel(Enum):
20
- creative_id = "creative_id"
21
- name = "name"
22
- format = "format"
23
- status = "status"
24
- created_date = "created_date"
25
- updated_date = "updated_date"
26
- tags = "tags"
27
- assignments = "assignments"
28
- performance = "performance"
29
- sub_assets = "sub_assets"
20
+ creative_id = 'creative_id'
21
+ name = 'name'
22
+ format_ = 'format'
23
+ status = 'status'
24
+ created_date = 'created_date'
25
+ updated_date = 'updated_date'
26
+ tags = 'tags'
27
+ assignments = 'assignments'
28
+ performance = 'performance'
29
+ sub_assets = 'sub_assets'
30
30
 
31
31
 
32
32
  class Pagination(AdCPBaseModel):
33
33
  model_config = ConfigDict(
34
- extra="allow",
34
+ extra='allow',
35
35
  )
36
36
  limit: Annotated[
37
- int | None, Field(description="Maximum number of creatives to return", ge=1, le=100)
37
+ int | None, Field(description='Maximum number of creatives to return', ge=1, le=100)
38
38
  ] = 50
39
- offset: Annotated[int | None, Field(description="Number of creatives to skip", ge=0)] = 0
39
+ offset: Annotated[int | None, Field(description='Number of creatives to skip', ge=0)] = 0
40
40
 
41
41
 
42
42
  class Sort(AdCPBaseModel):
43
43
  model_config = ConfigDict(
44
- extra="allow",
44
+ extra='allow',
45
45
  )
46
46
  direction: Annotated[
47
- sort_direction.SortDirection | None, Field(description="Sort direction")
47
+ sort_direction.SortDirection | None, Field(description='Sort direction')
48
48
  ] = sort_direction.SortDirection.desc
49
49
  field: Annotated[
50
- creative_sort_field.CreativeSortField | None, Field(description="Field to sort by")
50
+ creative_sort_field.CreativeSortField | None, Field(description='Field to sort by')
51
51
  ] = creative_sort_field.CreativeSortField.created_date
52
52
 
53
53
 
54
54
  class ListCreativesRequest(AdCPBaseModel):
55
55
  model_config = ConfigDict(
56
- extra="allow",
56
+ extra='allow',
57
57
  )
58
58
  context: context_1.ContextObject | None = None
59
59
  ext: ext_1.ExtensionObject | None = None
60
60
  fields: Annotated[
61
61
  list[FieldModel] | None,
62
- Field(description="Specific fields to include in response (omit for all fields)"),
62
+ Field(description='Specific fields to include in response (omit for all fields)'),
63
63
  ] = None
64
64
  filters: creative_filters.CreativeFilters | None = None
65
65
  include_assignments: Annotated[
66
- bool | None, Field(description="Include package assignment information in response")
66
+ bool | None, Field(description='Include package assignment information in response')
67
67
  ] = True
68
68
  include_performance: Annotated[
69
- bool | None, Field(description="Include aggregated performance metrics in response")
69
+ bool | None, Field(description='Include aggregated performance metrics in response')
70
70
  ] = False
71
71
  include_sub_assets: Annotated[
72
72
  bool | None,
73
- Field(description="Include sub-assets (for carousel/native formats) in response"),
73
+ Field(description='Include sub-assets (for carousel/native formats) in response'),
74
74
  ] = False
75
- pagination: Annotated[Pagination | None, Field(description="Pagination parameters")] = None
76
- sort: Annotated[Sort | None, Field(description="Sorting parameters")] = None
75
+ pagination: Annotated[Pagination | None, Field(description='Pagination parameters')] = None
76
+ sort: Annotated[Sort | None, Field(description='Sorting parameters')] = None
@@ -1,10 +1,9 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_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
 
7
- from enum import Enum
8
7
  from typing import Annotated
9
8
 
10
9
  from adcp.types.base import AdCPBaseModel
@@ -29,84 +28,82 @@ from ..core.assets import (
29
28
  from ..enums import creative_status, sort_direction
30
29
 
31
30
 
32
- class Status(Enum):
33
- active = "active"
34
- paused = "paused"
35
- ended = "ended"
36
-
37
-
38
31
  class AssignedPackage(AdCPBaseModel):
39
32
  model_config = ConfigDict(
40
- extra="allow",
33
+ extra='allow',
41
34
  )
42
- assigned_date: Annotated[AwareDatetime, Field(description="When this assignment was created")]
43
- package_id: Annotated[str, Field(description="Package identifier")]
44
- package_name: Annotated[str | None, Field(description="Human-readable package name")] = None
45
- status: Annotated[Status, Field(description="Status of this specific assignment")]
35
+ assigned_date: Annotated[AwareDatetime, Field(description='When this assignment was created')]
36
+ buyer_ref: Annotated[
37
+ str | None, Field(description="Buyer's reference identifier for this package")
38
+ ] = None
39
+ package_id: Annotated[str, Field(description='Package identifier')]
46
40
 
47
41
 
48
42
  class Assignments(AdCPBaseModel):
49
43
  model_config = ConfigDict(
50
- extra="allow",
44
+ extra='allow',
51
45
  )
52
46
  assigned_packages: Annotated[
53
47
  list[AssignedPackage] | None,
54
- Field(description="List of packages this creative is assigned to"),
48
+ Field(description='List of packages this creative is assigned to'),
55
49
  ] = None
56
50
  assignment_count: Annotated[
57
- int, Field(description="Total number of active package assignments", ge=0)
51
+ int, Field(description='Total number of active package assignments', ge=0)
58
52
  ]
59
53
 
60
54
 
61
55
  class Performance(AdCPBaseModel):
62
56
  model_config = ConfigDict(
63
- extra="allow",
57
+ extra='allow',
64
58
  )
65
59
  clicks: Annotated[
66
- int | None, Field(description="Total clicks across all assignments", ge=0)
60
+ int | None, Field(description='Total clicks across all assignments', ge=0)
67
61
  ] = None
68
62
  conversion_rate: Annotated[
69
- float | None, Field(description="Conversion rate across all assignments", ge=0.0, le=1.0)
63
+ float | None, Field(description='Conversion rate across all assignments', ge=0.0, le=1.0)
70
64
  ] = None
71
65
  ctr: Annotated[
72
- float | None, Field(description="Click-through rate (clicks/impressions)", ge=0.0, le=1.0)
66
+ float | None, Field(description='Click-through rate (clicks/impressions)', ge=0.0, le=1.0)
73
67
  ] = None
74
68
  impressions: Annotated[
75
- int | None, Field(description="Total impressions across all assignments", ge=0)
69
+ int | None, Field(description='Total impressions across all assignments', ge=0)
76
70
  ] = None
77
71
  last_updated: Annotated[
78
- AwareDatetime, Field(description="When performance data was last updated")
72
+ AwareDatetime, Field(description='When performance data was last updated')
79
73
  ]
80
74
  performance_score: Annotated[
81
- float | None, Field(description="Aggregated performance score (0-100)", ge=0.0, le=100.0)
75
+ float | None, Field(description='Aggregated performance score (0-100)', ge=0.0, le=100.0)
82
76
  ] = None
83
77
 
84
78
 
85
79
  class Pagination(AdCPBaseModel):
86
80
  model_config = ConfigDict(
87
- extra="allow",
81
+ extra='allow',
88
82
  )
89
83
  current_page: Annotated[
90
- int | None, Field(description="Current page number (1-based)", ge=1)
84
+ int | None, Field(description='Current page number (1-based)', ge=1)
91
85
  ] = None
92
- has_more: Annotated[bool, Field(description="Whether more results are available")]
93
- limit: Annotated[int, Field(description="Maximum number of results requested", ge=1)]
94
- offset: Annotated[int, Field(description="Number of results skipped", ge=0)]
86
+ has_more: Annotated[bool, Field(description='Whether more results are available')]
87
+ limit: Annotated[int, Field(description='Maximum number of results requested', ge=1)]
88
+ offset: Annotated[int, Field(description='Number of results skipped', ge=0)]
95
89
  total_pages: Annotated[
96
- int | None, Field(description="Total number of pages available", ge=0)
90
+ int | None, Field(description='Total number of pages available', ge=0)
97
91
  ] = None
98
92
 
99
93
 
100
94
  class StatusSummary(AdCPBaseModel):
101
95
  model_config = ConfigDict(
102
- extra="allow",
96
+ extra='allow',
103
97
  )
104
- approved: Annotated[int | None, Field(description="Number of approved creatives", ge=0)] = None
105
- archived: Annotated[int | None, Field(description="Number of archived creatives", ge=0)] = None
98
+ approved: Annotated[int | None, Field(description='Number of approved creatives', ge=0)] = None
99
+ archived: Annotated[int | None, Field(description='Number of archived creatives', ge=0)] = None
106
100
  pending_review: Annotated[
107
- int | None, Field(description="Number of creatives pending review", ge=0)
101
+ int | None, Field(description='Number of creatives pending review', ge=0)
102
+ ] = None
103
+ processing: Annotated[
104
+ int | None, Field(description='Number of creatives being processed', ge=0)
108
105
  ] = None
109
- rejected: Annotated[int | None, Field(description="Number of rejected creatives", ge=0)] = None
106
+ rejected: Annotated[int | None, Field(description='Number of rejected creatives', ge=0)] = None
110
107
 
111
108
 
112
109
  class SortApplied(AdCPBaseModel):
@@ -116,26 +113,26 @@ class SortApplied(AdCPBaseModel):
116
113
 
117
114
  class QuerySummary(AdCPBaseModel):
118
115
  model_config = ConfigDict(
119
- extra="allow",
116
+ extra='allow',
120
117
  )
121
118
  filters_applied: Annotated[
122
- list[str] | None, Field(description="List of filters that were applied to the query")
119
+ list[str] | None, Field(description='List of filters that were applied to the query')
123
120
  ] = None
124
121
  returned: Annotated[
125
- int, Field(description="Number of creatives returned in this response", ge=0)
122
+ int, Field(description='Number of creatives returned in this response', ge=0)
126
123
  ]
127
124
  sort_applied: Annotated[
128
- SortApplied | None, Field(description="Sort order that was applied")
125
+ SortApplied | None, Field(description='Sort order that was applied')
129
126
  ] = None
130
127
  total_matching: Annotated[
131
128
  int,
132
- Field(description="Total number of creatives matching filters (across all pages)", ge=0),
129
+ Field(description='Total number of creatives matching filters (across all pages)', ge=0),
133
130
  ]
134
131
 
135
132
 
136
133
  class Creative(AdCPBaseModel):
137
134
  model_config = ConfigDict(
138
- extra="allow",
135
+ extra='allow',
139
136
  )
140
137
  assets: Annotated[
141
138
  dict[
@@ -153,60 +150,60 @@ class Creative(AdCPBaseModel):
153
150
  | url_asset.UrlAsset,
154
151
  ]
155
152
  | None,
156
- Field(description="Assets for this creative, keyed by asset_role"),
153
+ Field(description='Assets for this creative, keyed by asset_role'),
157
154
  ] = None
158
155
  assignments: Annotated[
159
156
  Assignments | None,
160
- Field(description="Current package assignments (included when include_assignments=true)"),
157
+ Field(description='Current package assignments (included when include_assignments=true)'),
161
158
  ] = None
162
159
  created_date: Annotated[
163
- AwareDatetime, Field(description="When the creative was uploaded to the library")
160
+ AwareDatetime, Field(description='When the creative was uploaded to the library')
164
161
  ]
165
- creative_id: Annotated[str, Field(description="Unique identifier for the creative")]
162
+ creative_id: Annotated[str, Field(description='Unique identifier for the creative')]
166
163
  format_id: Annotated[
167
164
  format_id_1.FormatId,
168
- Field(description="Format identifier specifying which format this creative conforms to"),
165
+ Field(description='Format identifier specifying which format this creative conforms to'),
169
166
  ]
170
- name: Annotated[str, Field(description="Human-readable creative name")]
167
+ name: Annotated[str, Field(description='Human-readable creative name')]
171
168
  performance: Annotated[
172
169
  Performance | None,
173
170
  Field(
174
- description="Aggregated performance metrics (included when include_performance=true)"
171
+ description='Aggregated performance metrics (included when include_performance=true)'
175
172
  ),
176
173
  ] = None
177
174
  status: Annotated[
178
- creative_status.CreativeStatus, Field(description="Current approval status of the creative")
175
+ creative_status.CreativeStatus, Field(description='Current approval status of the creative')
179
176
  ]
180
177
  sub_assets: Annotated[
181
178
  list[sub_asset.SubAsset] | None,
182
179
  Field(
183
- description="Sub-assets for multi-asset formats (included when include_sub_assets=true)"
180
+ description='Sub-assets for multi-asset formats (included when include_sub_assets=true)'
184
181
  ),
185
182
  ] = None
186
183
  tags: Annotated[
187
- list[str] | None, Field(description="User-defined tags for organization and searchability")
184
+ list[str] | None, Field(description='User-defined tags for organization and searchability')
188
185
  ] = None
189
- updated_date: Annotated[AwareDatetime, Field(description="When the creative was last modified")]
186
+ updated_date: Annotated[AwareDatetime, Field(description='When the creative was last modified')]
190
187
 
191
188
 
192
189
  class ListCreativesResponse(AdCPBaseModel):
193
190
  model_config = ConfigDict(
194
- extra="allow",
191
+ extra='allow',
195
192
  )
196
193
  context: context_1.ContextObject | None = None
197
194
  creatives: Annotated[
198
- list[Creative], Field(description="Array of creative assets matching the query")
195
+ list[Creative], Field(description='Array of creative assets matching the query')
199
196
  ]
200
197
  ext: ext_1.ExtensionObject | None = None
201
198
  format_summary: Annotated[
202
- dict[str, int] | None, Field(description="Breakdown of creatives by format type")
199
+ dict[str, int] | None, Field(description='Breakdown of creatives by format type')
203
200
  ] = None
204
201
  pagination: Annotated[
205
- Pagination, Field(description="Pagination information for navigating results")
202
+ Pagination, Field(description='Pagination information for navigating results')
206
203
  ]
207
204
  query_summary: Annotated[
208
- QuerySummary, Field(description="Summary of the query that was executed")
205
+ QuerySummary, Field(description='Summary of the query that was executed')
209
206
  ]
210
207
  status_summary: Annotated[
211
- StatusSummary | None, Field(description="Breakdown of creatives by status")
208
+ StatusSummary | None, Field(description='Breakdown of creatives by status')
212
209
  ] = None