adcp 2.17.0__py3-none-any.whl → 2.19.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 (192) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +22 -1
  3. adcp/__main__.py +72 -0
  4. adcp/protocols/mcp.py +3 -1
  5. adcp/types/_ergonomic.py +0 -4
  6. adcp/types/_generated.py +91 -4
  7. adcp/types/generated_poc/adagents.py +239 -149
  8. adcp/types/generated_poc/core/activation_key.py +9 -9
  9. adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  10. adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  11. adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
  12. adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  13. adcp/types/generated_poc/core/assets/image_asset.py +7 -7
  14. adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  15. adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  16. adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  17. adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
  18. adcp/types/generated_poc/core/assets/video_asset.py +8 -8
  19. adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  20. adcp/types/generated_poc/core/async_response_data.py +2 -2
  21. adcp/types/generated_poc/core/brand_manifest.py +56 -56
  22. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  23. adcp/types/generated_poc/core/context.py +2 -3
  24. adcp/types/generated_poc/core/creative_asset.py +14 -14
  25. adcp/types/generated_poc/core/creative_assignment.py +4 -4
  26. adcp/types/generated_poc/core/creative_filters.py +20 -20
  27. adcp/types/generated_poc/core/creative_manifest.py +3 -3
  28. adcp/types/generated_poc/core/creative_policy.py +5 -5
  29. adcp/types/generated_poc/core/delivery_metrics.py +33 -33
  30. adcp/types/generated_poc/core/deployment.py +21 -21
  31. adcp/types/generated_poc/core/destination.py +12 -12
  32. adcp/types/generated_poc/core/error.py +9 -9
  33. adcp/types/generated_poc/core/ext.py +2 -3
  34. adcp/types/generated_poc/core/format.py +139 -51
  35. adcp/types/generated_poc/core/format_id.py +6 -6
  36. adcp/types/generated_poc/core/frequency_cap.py +3 -3
  37. adcp/types/generated_poc/core/identifier.py +27 -0
  38. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  39. adcp/types/generated_poc/core/measurement.py +9 -9
  40. adcp/types/generated_poc/core/media_buy.py +8 -8
  41. adcp/types/generated_poc/core/package.py +9 -9
  42. adcp/types/generated_poc/core/performance_feedback.py +19 -19
  43. adcp/types/generated_poc/core/placement.py +5 -5
  44. adcp/types/generated_poc/core/pricing_option.py +2 -2
  45. adcp/types/generated_poc/core/product.py +21 -21
  46. adcp/types/generated_poc/core/product_filters.py +19 -19
  47. adcp/types/generated_poc/core/promoted_offerings.py +21 -21
  48. adcp/types/generated_poc/core/promoted_products.py +3 -3
  49. adcp/types/generated_poc/core/property.py +10 -10
  50. adcp/types/generated_poc/core/property_id.py +4 -4
  51. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  52. adcp/types/generated_poc/core/property_tag.py +4 -4
  53. adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  54. adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  55. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  56. adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  57. adcp/types/generated_poc/core/response.py +5 -5
  58. adcp/types/generated_poc/core/signal_filters.py +6 -6
  59. adcp/types/generated_poc/core/start_timing.py +5 -5
  60. adcp/types/generated_poc/core/sub_asset.py +15 -15
  61. adcp/types/generated_poc/core/targeting.py +9 -9
  62. adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  63. adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  64. adcp/types/generated_poc/creative/preview_creative_request.py +26 -26
  65. adcp/types/generated_poc/creative/preview_creative_response.py +31 -30
  66. adcp/types/generated_poc/creative/preview_render.py +26 -26
  67. adcp/types/generated_poc/enums/adcp_domain.py +5 -3
  68. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  69. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  70. adcp/types/generated_poc/enums/available_metric.py +9 -9
  71. adcp/types/generated_poc/enums/channels.py +9 -9
  72. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  73. adcp/types/generated_poc/enums/creative_action.py +5 -5
  74. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  75. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  76. adcp/types/generated_poc/enums/creative_status.py +4 -4
  77. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  78. adcp/types/generated_poc/enums/daast_version.py +2 -2
  79. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  80. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  81. adcp/types/generated_poc/enums/feed_format.py +3 -3
  82. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  83. adcp/types/generated_poc/enums/format_category.py +7 -7
  84. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  85. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  86. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  87. adcp/types/generated_poc/enums/http_method.py +2 -2
  88. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  89. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  90. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  91. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  92. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  93. adcp/types/generated_poc/enums/metric_type.py +8 -8
  94. adcp/types/generated_poc/enums/notification_type.py +4 -4
  95. adcp/types/generated_poc/enums/pacing.py +3 -3
  96. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  97. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  98. adcp/types/generated_poc/enums/property_type.py +7 -7
  99. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  100. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  101. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  102. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  103. adcp/types/generated_poc/enums/standard_format_ids.py +35 -35
  104. adcp/types/generated_poc/enums/task_status.py +9 -9
  105. adcp/types/generated_poc/enums/task_type.py +12 -6
  106. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  107. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  108. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  109. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  110. adcp/types/generated_poc/enums/vast_version.py +5 -5
  111. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  112. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  113. adcp/types/generated_poc/extensions/__init__.py +3 -0
  114. adcp/types/generated_poc/extensions/extension_meta.py +50 -0
  115. adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  116. adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  117. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  118. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  119. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  120. adcp/types/generated_poc/media_buy/create_media_buy_request.py +64 -23
  121. adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  122. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  123. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  124. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  125. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  126. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  127. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  128. adcp/types/generated_poc/media_buy/get_products_response.py +10 -4
  129. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  130. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +8 -8
  131. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  132. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  133. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  134. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -53
  135. adcp/types/generated_poc/media_buy/package_request.py +16 -7
  136. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  137. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  138. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  139. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  140. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  141. adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  142. adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  143. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  144. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  145. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  146. adcp/types/generated_poc/media_buy/update_media_buy_request.py +37 -29
  147. adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  148. adcp/types/generated_poc/pricing_options/cpc_option.py +9 -9
  149. adcp/types/generated_poc/pricing_options/cpcv_option.py +9 -9
  150. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +14 -14
  151. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +9 -9
  152. adcp/types/generated_poc/pricing_options/cpp_option.py +14 -14
  153. adcp/types/generated_poc/pricing_options/cpv_option.py +13 -13
  154. adcp/types/generated_poc/pricing_options/flat_rate_option.py +16 -16
  155. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +14 -14
  156. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +9 -9
  157. adcp/types/generated_poc/property/__init__.py +3 -0
  158. adcp/types/generated_poc/property/base_property_source.py +86 -0
  159. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  160. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  161. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  162. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  163. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  164. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  165. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  166. adcp/types/generated_poc/property/list_property_features_request.py +25 -0
  167. adcp/types/generated_poc/property/list_property_features_response.py +24 -0
  168. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  169. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  170. adcp/types/generated_poc/property/property_error.py +33 -0
  171. adcp/types/generated_poc/property/property_feature.py +22 -0
  172. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  173. adcp/types/generated_poc/property/property_list.py +62 -0
  174. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  175. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  176. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  177. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  178. adcp/types/generated_poc/protocols/adcp_extension.py +26 -10
  179. adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  180. adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  181. adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  182. adcp/types/generated_poc/signals/get_signals_response.py +16 -16
  183. adcp/utils/__init__.py +24 -1
  184. adcp/utils/format_assets.py +224 -0
  185. adcp/utils/preview_cache.py +29 -7
  186. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/METADATA +1 -1
  187. adcp-2.19.0.dist-info/RECORD +220 -0
  188. adcp-2.17.0.dist-info/RECORD +0 -194
  189. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/WHEEL +0 -0
  190. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/entry_points.txt +0 -0
  191. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/licenses/LICENSE +0 -0
  192. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/brand_manifest.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,61 +15,61 @@ from ..enums import asset_content_type
15
15
 
16
16
  class Asset(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='forbid',
18
+ extra="allow",
19
19
  )
20
- asset_id: Annotated[str, Field(description='Unique identifier for this asset')]
20
+ asset_id: Annotated[str, Field(description="Unique identifier for this asset")]
21
21
  asset_type: Annotated[
22
22
  asset_content_type.AssetContentType,
23
23
  Field(
24
- description='Type of asset. Note: Brand manifests typically contain basic media assets (image, video, audio, text). Code assets (html, javascript, css) and ad markup (vast, daast) are usually not part of brand asset libraries.'
24
+ description="Type of asset. Note: Brand manifests typically contain basic media assets (image, video, audio, text). Code assets (html, javascript, css) and ad markup (vast, daast) are usually not part of brand asset libraries."
25
25
  ),
26
26
  ]
27
- description: Annotated[str | None, Field(description='Asset description or usage notes')] = None
27
+ description: Annotated[str | None, Field(description="Asset description or usage notes")] = None
28
28
  duration_seconds: Annotated[
29
- float | None, Field(description='Video/audio duration in seconds')
29
+ float | None, Field(description="Video/audio duration in seconds")
30
30
  ] = None
31
- file_size_bytes: Annotated[int | None, Field(description='File size in bytes')] = None
31
+ file_size_bytes: Annotated[int | None, Field(description="File size in bytes")] = None
32
32
  format: Annotated[str | None, Field(description="File format (e.g., 'jpg', 'mp4', 'mp3')")] = (
33
33
  None
34
34
  )
35
- height: Annotated[int | None, Field(description='Image/video height in pixels')] = None
35
+ height: Annotated[int | None, Field(description="Image/video height in pixels")] = None
36
36
  metadata: Annotated[
37
- dict[str, Any] | None, Field(description='Additional asset-specific metadata')
37
+ dict[str, Any] | None, Field(description="Additional asset-specific metadata")
38
38
  ] = None
39
- name: Annotated[str | None, Field(description='Human-readable asset name')] = None
39
+ name: Annotated[str | None, Field(description="Human-readable asset name")] = None
40
40
  tags: Annotated[
41
41
  list[str] | None,
42
42
  Field(
43
43
  description="Tags for asset discovery (e.g., 'holiday', 'lifestyle', 'product_shot')"
44
44
  ),
45
45
  ] = None
46
- url: Annotated[AnyUrl, Field(description='URL to CDN-hosted asset file')]
47
- width: Annotated[int | None, Field(description='Image/video width in pixels')] = None
46
+ url: Annotated[AnyUrl, Field(description="URL to CDN-hosted asset file")]
47
+ width: Annotated[int | None, Field(description="Image/video width in pixels")] = None
48
48
 
49
49
 
50
50
  class Colors(AdCPBaseModel):
51
51
  accent: Annotated[
52
- str | None, Field(description='Accent color (hex format)', pattern='^#[0-9A-Fa-f]{6}$')
52
+ str | None, Field(description="Accent color (hex format)", pattern="^#[0-9A-Fa-f]{6}$")
53
53
  ] = None
54
54
  background: Annotated[
55
- str | None, Field(description='Background color (hex format)', pattern='^#[0-9A-Fa-f]{6}$')
55
+ str | None, Field(description="Background color (hex format)", pattern="^#[0-9A-Fa-f]{6}$")
56
56
  ] = None
57
57
  primary: Annotated[
58
58
  str | None,
59
- Field(description='Primary brand color (hex format)', pattern='^#[0-9A-Fa-f]{6}$'),
59
+ Field(description="Primary brand color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"),
60
60
  ] = None
61
61
  secondary: Annotated[
62
62
  str | None,
63
- Field(description='Secondary brand color (hex format)', pattern='^#[0-9A-Fa-f]{6}$'),
63
+ Field(description="Secondary brand color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"),
64
64
  ] = None
65
65
  text: Annotated[
66
- str | None, Field(description='Text color (hex format)', pattern='^#[0-9A-Fa-f]{6}$')
66
+ str | None, Field(description="Text color (hex format)", pattern="^#[0-9A-Fa-f]{6}$")
67
67
  ] = None
68
68
 
69
69
 
70
70
  class Contact(AdCPBaseModel):
71
- email: Annotated[EmailStr | None, Field(description='Contact email')] = None
72
- phone: Annotated[str | None, Field(description='Contact phone number')] = None
71
+ email: Annotated[EmailStr | None, Field(description="Contact email")] = None
72
+ phone: Annotated[str | None, Field(description="Contact phone number")] = None
73
73
 
74
74
 
75
75
  class Disclaimer(AdCPBaseModel):
@@ -79,92 +79,92 @@ class Disclaimer(AdCPBaseModel):
79
79
  description="When this disclaimer applies (e.g., 'financial_products', 'health_claims', 'all')"
80
80
  ),
81
81
  ] = None
82
- required: Annotated[bool | None, Field(description='Whether this disclaimer must appear')] = (
82
+ required: Annotated[bool | None, Field(description="Whether this disclaimer must appear")] = (
83
83
  True
84
84
  )
85
- text: Annotated[str, Field(description='Disclaimer text')]
85
+ text: Annotated[str, Field(description="Disclaimer text")]
86
86
 
87
87
 
88
88
  class Fonts(AdCPBaseModel):
89
89
  font_urls: Annotated[
90
- list[AnyUrl] | None, Field(description='URLs to web font files if using custom fonts')
90
+ list[AnyUrl] | None, Field(description="URLs to web font files if using custom fonts")
91
91
  ] = None
92
- primary: Annotated[str | None, Field(description='Primary font family name')] = None
93
- secondary: Annotated[str | None, Field(description='Secondary font family name')] = None
92
+ primary: Annotated[str | None, Field(description="Primary font family name")] = None
93
+ secondary: Annotated[str | None, Field(description="Secondary font family name")] = None
94
94
 
95
95
 
96
96
  class Logo(AdCPBaseModel):
97
- height: Annotated[int | None, Field(description='Logo height in pixels')] = None
97
+ height: Annotated[int | None, Field(description="Logo height in pixels")] = None
98
98
  tags: Annotated[
99
99
  list[str] | None,
100
100
  Field(
101
101
  description="Semantic tags describing the logo variant (e.g., 'dark', 'light', 'square', 'horizontal', 'icon')"
102
102
  ),
103
103
  ] = None
104
- url: Annotated[AnyUrl, Field(description='URL to the logo asset')]
105
- width: Annotated[int | None, Field(description='Logo width in pixels')] = None
104
+ url: Annotated[AnyUrl, Field(description="URL to the logo asset")]
105
+ width: Annotated[int | None, Field(description="Logo width in pixels")] = None
106
106
 
107
107
 
108
108
  class Metadata(AdCPBaseModel):
109
109
  created_date: Annotated[
110
- AwareDatetime | None, Field(description='When this brand manifest was created')
110
+ AwareDatetime | None, Field(description="When this brand manifest was created")
111
111
  ] = None
112
112
  updated_date: Annotated[
113
- AwareDatetime | None, Field(description='When this brand manifest was last updated')
113
+ AwareDatetime | None, Field(description="When this brand manifest was last updated")
114
114
  ] = None
115
- version: Annotated[str | None, Field(description='Brand card version number')] = None
115
+ version: Annotated[str | None, Field(description="Brand card version number")] = None
116
116
 
117
117
 
118
118
  class FeedFormat(Enum):
119
- google_merchant_center = 'google_merchant_center'
120
- facebook_catalog = 'facebook_catalog'
121
- custom = 'custom'
119
+ google_merchant_center = "google_merchant_center"
120
+ facebook_catalog = "facebook_catalog"
121
+ custom = "custom"
122
122
 
123
123
 
124
124
  class UpdateFrequency(Enum):
125
- realtime = 'realtime'
126
- hourly = 'hourly'
127
- daily = 'daily'
128
- weekly = 'weekly'
125
+ realtime = "realtime"
126
+ hourly = "hourly"
127
+ daily = "daily"
128
+ weekly = "weekly"
129
129
 
130
130
 
131
131
  class ProductCatalog(AdCPBaseModel):
132
132
  model_config = ConfigDict(
133
- extra='forbid',
133
+ extra="allow",
134
134
  )
135
135
  categories: Annotated[
136
136
  list[str] | None,
137
- Field(description='Product categories available in the catalog (for filtering)'),
137
+ Field(description="Product categories available in the catalog (for filtering)"),
138
138
  ] = None
139
- feed_format: Annotated[FeedFormat | None, Field(description='Format of the product feed')] = (
139
+ feed_format: Annotated[FeedFormat | None, Field(description="Format of the product feed")] = (
140
140
  FeedFormat.google_merchant_center
141
141
  )
142
- feed_url: Annotated[AnyUrl, Field(description='URL to product catalog feed')]
142
+ feed_url: Annotated[AnyUrl, Field(description="URL to product catalog feed")]
143
143
  last_updated: Annotated[
144
- AwareDatetime | None, Field(description='When the product catalog was last updated')
144
+ AwareDatetime | None, Field(description="When the product catalog was last updated")
145
145
  ] = None
146
146
  update_frequency: Annotated[
147
- UpdateFrequency | None, Field(description='How frequently the product catalog is updated')
147
+ UpdateFrequency | None, Field(description="How frequently the product catalog is updated")
148
148
  ] = None
149
149
 
150
150
 
151
151
  class BrandManifest(AdCPBaseModel):
152
152
  model_config = ConfigDict(
153
- extra='forbid',
153
+ extra="allow",
154
154
  )
155
155
  assets: Annotated[
156
156
  list[Asset] | None,
157
157
  Field(
158
- description='Brand asset library with explicit assets and tags. Assets are referenced inline with URLs pointing to CDN-hosted files.'
158
+ description="Brand asset library with explicit assets and tags. Assets are referenced inline with URLs pointing to CDN-hosted files."
159
159
  ),
160
160
  ] = None
161
- colors: Annotated[Colors | None, Field(description='Brand color palette')] = None
162
- contact: Annotated[Contact | None, Field(description='Brand contact information')] = None
161
+ colors: Annotated[Colors | None, Field(description="Brand color palette")] = None
162
+ contact: Annotated[Contact | None, Field(description="Brand contact information")] = None
163
163
  disclaimers: Annotated[
164
164
  list[Disclaimer] | None,
165
- Field(description='Legal disclaimers or required text that must appear in creatives'),
165
+ Field(description="Legal disclaimers or required text that must appear in creatives"),
166
166
  ] = None
167
- fonts: Annotated[Fonts | None, Field(description='Brand typography guidelines')] = None
167
+ fonts: Annotated[Fonts | None, Field(description="Brand typography guidelines")] = None
168
168
  industry: Annotated[
169
169
  str | None,
170
170
  Field(
@@ -173,19 +173,19 @@ class BrandManifest(AdCPBaseModel):
173
173
  ] = None
174
174
  logos: Annotated[
175
175
  list[Logo] | None,
176
- Field(description='Brand logo assets with semantic tags for different use cases'),
176
+ Field(description="Brand logo assets with semantic tags for different use cases"),
177
177
  ] = None
178
- metadata: Annotated[Metadata | None, Field(description='Additional brand metadata')] = None
179
- name: Annotated[str, Field(description='Brand or business name')]
178
+ metadata: Annotated[Metadata | None, Field(description="Additional brand metadata")] = None
179
+ name: Annotated[str, Field(description="Brand or business name")]
180
180
  product_catalog: Annotated[
181
181
  ProductCatalog | None,
182
182
  Field(
183
- description='Product catalog information for e-commerce advertisers. Enables SKU-level creative generation and product selection.'
183
+ description="Product catalog information for e-commerce advertisers. Enables SKU-level creative generation and product selection."
184
184
  ),
185
185
  ] = None
186
- tagline: Annotated[str | None, Field(description='Brand tagline or slogan')] = None
186
+ tagline: Annotated[str | None, Field(description="Brand tagline or slogan")] = None
187
187
  target_audience: Annotated[
188
- str | None, Field(description='Primary target audience description')
188
+ str | None, Field(description="Primary target audience description")
189
189
  ] = None
190
190
  tone: Annotated[
191
191
  str | None,
@@ -196,6 +196,6 @@ class BrandManifest(AdCPBaseModel):
196
196
  url: Annotated[
197
197
  AnyUrl | None,
198
198
  Field(
199
- description='Primary brand URL for context and asset discovery. Creative agents can infer brand information from this URL.'
199
+ description="Primary brand URL for context and asset discovery. Creative agents can infer brand information from this URL."
200
200
  ),
201
201
  ] = None
@@ -15,21 +15,21 @@ class BrandManifestReference(RootModel[brand_manifest.BrandManifest | AnyUrl]):
15
15
  root: Annotated[
16
16
  brand_manifest.BrandManifest | AnyUrl,
17
17
  Field(
18
- description='Brand manifest provided either as an inline object or a URL string pointing to a hosted manifest',
18
+ description="Brand manifest provided either as an inline object or a URL string pointing to a hosted manifest",
19
19
  examples=[
20
20
  {
21
- 'data': {
22
- 'colors': {'primary': '#FF6B35'},
23
- 'name': 'ACME Corporation',
24
- 'url': 'https://acmecorp.com',
21
+ "data": {
22
+ "colors": {"primary": "#FF6B35"},
23
+ "name": "ACME Corporation",
24
+ "url": "https://acmecorp.com",
25
25
  },
26
- 'description': 'Inline brand manifest',
26
+ "description": "Inline brand manifest",
27
27
  },
28
28
  {
29
- 'data': 'https://cdn.acmecorp.com/brand-manifest.json',
30
- 'description': 'URL string reference to hosted manifest',
29
+ "data": "https://cdn.acmecorp.com/brand-manifest.json",
30
+ "description": "URL string reference to hosted manifest",
31
31
  },
32
32
  ],
33
- title='Brand Manifest Reference',
33
+ title="Brand Manifest Reference",
34
34
  ),
35
35
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/context.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,7 +9,6 @@ from pydantic import ConfigDict
9
9
 
10
10
 
11
11
  class ContextObject(AdCPBaseModel):
12
- pass
13
12
  model_config = ConfigDict(
14
- extra='allow',
13
+ extra="allow",
15
14
  )
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_asset.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -27,26 +27,26 @@ from .assets import (
27
27
 
28
28
  class Input(AdCPBaseModel):
29
29
  model_config = ConfigDict(
30
- extra='forbid',
30
+ extra="allow",
31
31
  )
32
32
  context_description: Annotated[
33
33
  str | None,
34
- Field(description='Natural language description of the context for AI-generated content'),
34
+ Field(description="Natural language description of the context for AI-generated content"),
35
35
  ] = None
36
36
  macros: Annotated[
37
- dict[str, str] | None, Field(description='Macro values to apply for this preview')
37
+ dict[str, str] | None, Field(description="Macro values to apply for this preview")
38
38
  ] = None
39
- name: Annotated[str, Field(description='Human-readable name for this preview variant')]
39
+ name: Annotated[str, Field(description="Human-readable name for this preview variant")]
40
40
 
41
41
 
42
42
  class CreativeAsset(AdCPBaseModel):
43
43
  model_config = ConfigDict(
44
- extra='forbid',
44
+ extra="allow",
45
45
  )
46
46
  approved: Annotated[
47
47
  bool | None,
48
48
  Field(
49
- description='For generative creatives: set to true to approve and finalize, false to request regeneration with updated assets/message. Omit for non-generative creatives.'
49
+ description="For generative creatives: set to true to approve and finalize, false to request regeneration with updated assets/message. Omit for non-generative creatives."
50
50
  ),
51
51
  ] = None
52
52
  assets: Annotated[
@@ -64,22 +64,22 @@ class CreativeAsset(AdCPBaseModel):
64
64
  | promoted_offerings.PromotedOfferings
65
65
  | url_asset.UrlAsset,
66
66
  ],
67
- Field(description='Assets required by the format, keyed by asset_role'),
67
+ Field(description="Assets required by the format, keyed by asset_role"),
68
68
  ]
69
- creative_id: Annotated[str, Field(description='Unique identifier for the creative')]
69
+ creative_id: Annotated[str, Field(description="Unique identifier for the creative")]
70
70
  format_id: Annotated[
71
71
  format_id_1.FormatId,
72
72
  Field(
73
- description='Format identifier specifying which format this creative conforms to. Can be: (1) concrete format_id referencing a format with fixed dimensions, (2) template format_id referencing a template format, or (3) parameterized format_id with dimensions/duration parameters for template formats.'
73
+ description="Format identifier specifying which format this creative conforms to. Can be: (1) concrete format_id referencing a format with fixed dimensions, (2) template format_id referencing a template format, or (3) parameterized format_id with dimensions/duration parameters for template formats."
74
74
  ),
75
75
  ]
76
76
  inputs: Annotated[
77
77
  list[Input] | None,
78
78
  Field(
79
- description='Preview contexts for generative formats - defines what scenarios to generate previews for'
79
+ description="Preview contexts for generative formats - defines what scenarios to generate previews for"
80
80
  ),
81
81
  ] = None
82
- name: Annotated[str, Field(description='Human-readable creative name')]
82
+ name: Annotated[str, Field(description="Human-readable creative name")]
83
83
  placement_ids: Annotated[
84
84
  list[str] | None,
85
85
  Field(
@@ -88,12 +88,12 @@ class CreativeAsset(AdCPBaseModel):
88
88
  ),
89
89
  ] = None
90
90
  tags: Annotated[
91
- list[str] | None, Field(description='User-defined tags for organization and searchability')
91
+ list[str] | None, Field(description="User-defined tags for organization and searchability")
92
92
  ] = None
93
93
  weight: Annotated[
94
94
  float | None,
95
95
  Field(
96
- description='Optional delivery weight for creative rotation when uploading via create_media_buy or update_media_buy (0-100). If omitted, platform determines rotation. Only used during upload to media buy - not stored in creative library.',
96
+ description="Optional delivery weight for creative rotation when uploading via create_media_buy or update_media_buy (0-100). If omitted, platform determines rotation. Only used during upload to media buy - not stored in creative library.",
97
97
  ge=0.0,
98
98
  le=100.0,
99
99
  ),
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_assignment.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,9 +12,9 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class CreativeAssignment(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra="allow",
16
16
  )
17
- creative_id: Annotated[str, Field(description='Unique identifier for the creative')]
17
+ creative_id: Annotated[str, Field(description="Unique identifier for the creative")]
18
18
  placement_ids: Annotated[
19
19
  list[str] | None,
20
20
  Field(
@@ -23,5 +23,5 @@ class CreativeAssignment(AdCPBaseModel):
23
23
  ),
24
24
  ] = None
25
25
  weight: Annotated[
26
- float | None, Field(description='Delivery weight for this creative', ge=0.0, le=100.0)
26
+ float | None, Field(description="Delivery weight for this creative", ge=0.0, le=100.0)
27
27
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_filters.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,73 +14,73 @@ from ..enums import creative_status
14
14
 
15
15
  class CreativeFilters(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='forbid',
17
+ extra="allow",
18
18
  )
19
19
  assigned_to_package: Annotated[
20
- str | None, Field(description='Filter creatives assigned to this specific package')
20
+ str | None, Field(description="Filter creatives assigned to this specific package")
21
21
  ] = None
22
22
  assigned_to_packages: Annotated[
23
- list[str] | None, Field(description='Filter creatives assigned to any of these packages')
23
+ list[str] | None, Field(description="Filter creatives assigned to any of these packages")
24
24
  ] = None
25
25
  buyer_refs: Annotated[
26
26
  list[str] | None,
27
27
  Field(
28
- description='Filter creatives assigned to media buys with any of these buyer references'
28
+ description="Filter creatives assigned to media buys with any of these buyer references"
29
29
  ),
30
30
  ] = None
31
31
  created_after: Annotated[
32
32
  AwareDatetime | None,
33
- Field(description='Filter creatives created after this date (ISO 8601)'),
33
+ Field(description="Filter creatives created after this date (ISO 8601)"),
34
34
  ] = None
35
35
  created_before: Annotated[
36
36
  AwareDatetime | None,
37
- Field(description='Filter creatives created before this date (ISO 8601)'),
37
+ Field(description="Filter creatives created before this date (ISO 8601)"),
38
38
  ] = None
39
39
  creative_ids: Annotated[
40
- list[str] | None, Field(description='Filter by specific creative IDs', max_length=100)
40
+ list[str] | None, Field(description="Filter by specific creative IDs", max_length=100)
41
41
  ] = None
42
42
  format: Annotated[
43
43
  str | None,
44
- Field(description='Filter by creative format type (e.g., video, audio, display)'),
44
+ Field(description="Filter by creative format type (e.g., video, audio, display)"),
45
45
  ] = None
46
46
  formats: Annotated[
47
- list[str] | None, Field(description='Filter by multiple creative format types')
47
+ list[str] | None, Field(description="Filter by multiple creative format types")
48
48
  ] = None
49
49
  has_performance_data: Annotated[
50
- bool | None, Field(description='Filter creatives that have performance data when true')
50
+ bool | None, Field(description="Filter creatives that have performance data when true")
51
51
  ] = None
52
52
  media_buy_ids: Annotated[
53
- list[str] | None, Field(description='Filter creatives assigned to any of these media buys')
53
+ list[str] | None, Field(description="Filter creatives assigned to any of these media buys")
54
54
  ] = None
55
55
  name_contains: Annotated[
56
56
  str | None,
57
- Field(description='Filter by creative names containing this text (case-insensitive)'),
57
+ Field(description="Filter by creative names containing this text (case-insensitive)"),
58
58
  ] = None
59
59
  status: Annotated[
60
60
  creative_status.CreativeStatus | None,
61
- Field(description='Filter by creative approval status'),
61
+ Field(description="Filter by creative approval status"),
62
62
  ] = None
63
63
  statuses: Annotated[
64
64
  list[creative_status.CreativeStatus] | None,
65
- Field(description='Filter by multiple creative statuses'),
65
+ Field(description="Filter by multiple creative statuses"),
66
66
  ] = None
67
67
  tags: Annotated[
68
- list[str] | None, Field(description='Filter by creative tags (all tags must match)')
68
+ list[str] | None, Field(description="Filter by creative tags (all tags must match)")
69
69
  ] = None
70
70
  tags_any: Annotated[
71
- list[str] | None, Field(description='Filter by creative tags (any tag must match)')
71
+ list[str] | None, Field(description="Filter by creative tags (any tag must match)")
72
72
  ] = None
73
73
  unassigned: Annotated[
74
74
  bool | None,
75
75
  Field(
76
- description='Filter for unassigned creatives when true, assigned creatives when false'
76
+ description="Filter for unassigned creatives when true, assigned creatives when false"
77
77
  ),
78
78
  ] = None
79
79
  updated_after: Annotated[
80
80
  AwareDatetime | None,
81
- Field(description='Filter creatives last updated after this date (ISO 8601)'),
81
+ Field(description="Filter creatives last updated after this date (ISO 8601)"),
82
82
  ] = None
83
83
  updated_before: Annotated[
84
84
  AwareDatetime | None,
85
- Field(description='Filter creatives last updated before this date (ISO 8601)'),
85
+ Field(description="Filter creatives last updated before this date (ISO 8601)"),
86
86
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_manifest.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -29,7 +29,7 @@ from .assets import (
29
29
 
30
30
  class CreativeManifest(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra='forbid',
32
+ extra="allow",
33
33
  )
34
34
  assets: Annotated[
35
35
  dict[
@@ -61,6 +61,6 @@ class CreativeManifest(AdCPBaseModel):
61
61
  promoted_offering: Annotated[
62
62
  str | None,
63
63
  Field(
64
- description='Product name or offering being advertised. Maps to promoted_offerings in create_media_buy request to associate creative with the product being promoted.'
64
+ description="Product name or offering being advertised. Maps to promoted_offerings in create_media_buy request to associate creative with the product being promoted."
65
65
  ),
66
66
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_policy.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,15 +14,15 @@ from ..enums import co_branding_requirement, landing_page_requirement
14
14
 
15
15
  class CreativePolicy(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='forbid',
17
+ extra="allow",
18
18
  )
19
19
  co_branding: Annotated[
20
- co_branding_requirement.CoBrandingRequirement, Field(description='Co-branding requirement')
20
+ co_branding_requirement.CoBrandingRequirement, Field(description="Co-branding requirement")
21
21
  ]
22
22
  landing_page: Annotated[
23
23
  landing_page_requirement.LandingPageRequirement,
24
- Field(description='Landing page requirements'),
24
+ Field(description="Landing page requirements"),
25
25
  ]
26
26
  templates_available: Annotated[
27
- bool, Field(description='Whether creative templates are provided')
27
+ bool, Field(description="Whether creative templates are provided")
28
28
  ]