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/format.json
3
- # timestamp: 2025-12-18T20:00:24+00:00
3
+ # timestamp: 2026-01-14T17:08:13+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -13,11 +13,89 @@ from ..enums import asset_content_type, format_category, format_id_parameter
13
13
  from . import format_id as format_id_1
14
14
 
15
15
 
16
+ class Assets(AdCPBaseModel):
17
+ asset_id: Annotated[
18
+ str,
19
+ Field(
20
+ description="Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object."
21
+ ),
22
+ ]
23
+ asset_role: Annotated[
24
+ str | None,
25
+ Field(
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
+ ),
28
+ ] = None
29
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
30
+ item_type: Annotated[
31
+ Literal["individual"],
32
+ Field(description="Discriminator indicating this is an individual asset"),
33
+ ]
34
+ required: Annotated[
35
+ bool,
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."
38
+ ),
39
+ ]
40
+ requirements: Annotated[
41
+ dict[str, Any] | None,
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)."
44
+ ),
45
+ ] = None
46
+
47
+
48
+ class Asset(AdCPBaseModel):
49
+ asset_id: Annotated[str, Field(description="Identifier for this asset within the group")]
50
+ asset_role: Annotated[
51
+ str | None,
52
+ Field(
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
+ ),
55
+ ] = None
56
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
57
+ required: Annotated[
58
+ bool,
59
+ Field(description="Whether this asset is required within each repetition of the group"),
60
+ ]
61
+ requirements: Annotated[
62
+ dict[str, Any] | None,
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)."
65
+ ),
66
+ ] = None
67
+
68
+
69
+ class Assets1(AdCPBaseModel):
70
+ asset_group_id: Annotated[
71
+ str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
72
+ ]
73
+ assets: Annotated[list[Asset], Field(description="Assets within each repetition of this group")]
74
+ item_type: Annotated[
75
+ Literal["repeatable_group"],
76
+ Field(description="Discriminator indicating this is a repeatable asset group"),
77
+ ]
78
+ max_count: Annotated[int, Field(description="Maximum number of repetitions allowed", ge=1)]
79
+ min_count: Annotated[
80
+ int,
81
+ Field(
82
+ description="Minimum number of repetitions required (if group is required) or allowed (if optional)",
83
+ ge=0,
84
+ ),
85
+ ]
86
+ required: Annotated[
87
+ bool,
88
+ Field(
89
+ description="Whether this asset group is required. If true, at least min_count repetitions must be provided."
90
+ ),
91
+ ]
92
+
93
+
16
94
  class AssetsRequired(AdCPBaseModel):
17
95
  asset_id: Annotated[
18
96
  str,
19
97
  Field(
20
- 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."
21
99
  ),
22
100
  ]
23
101
  asset_role: Annotated[
@@ -26,36 +104,36 @@ class AssetsRequired(AdCPBaseModel):
26
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."
27
105
  ),
28
106
  ] = None
29
- 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")]
30
108
  item_type: Annotated[
31
- Literal['individual'],
32
- Field(description='Discriminator indicating this is an individual asset requirement'),
109
+ Literal["individual"],
110
+ Field(description="Discriminator indicating this is an individual asset requirement"),
33
111
  ]
34
- 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
35
113
  requirements: Annotated[
36
114
  dict[str, Any] | None,
37
115
  Field(
38
- 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)."
39
117
  ),
40
118
  ] = None
41
119
 
42
120
 
43
- class Asset(AdCPBaseModel):
44
- asset_id: Annotated[str, Field(description='Identifier for this asset within the group')]
121
+ class Asset2(AdCPBaseModel):
122
+ asset_id: Annotated[str, Field(description="Identifier for this asset within the group")]
45
123
  asset_role: Annotated[
46
124
  str | None,
47
125
  Field(
48
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."
49
127
  ),
50
128
  ] = None
51
- 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")]
52
130
  required: Annotated[
53
- 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")
54
132
  ] = None
55
133
  requirements: Annotated[
56
134
  dict[str, Any] | None,
57
135
  Field(
58
- 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)."
59
137
  ),
60
138
  ] = None
61
139
 
@@ -64,13 +142,15 @@ class AssetsRequired1(AdCPBaseModel):
64
142
  asset_group_id: Annotated[
65
143
  str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
66
144
  ]
67
- assets: Annotated[list[Asset], Field(description='Assets within each repetition of this group')]
145
+ assets: Annotated[
146
+ list[Asset2], Field(description="Assets within each repetition of this group")
147
+ ]
68
148
  item_type: Annotated[
69
- Literal['repeatable_group'],
70
- 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"),
71
151
  ]
72
- max_count: Annotated[int, Field(description='Maximum number of repetitions allowed', ge=1)]
73
- 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)]
74
154
 
75
155
 
76
156
  class Responsive(AdCPBaseModel):
@@ -83,36 +163,36 @@ class Dimensions(AdCPBaseModel):
83
163
  str | None,
84
164
  Field(
85
165
  description="Fixed aspect ratio constraint (e.g., '16:9', '4:3', '1:1')",
86
- pattern='^\\d+:\\d+$',
166
+ pattern="^\\d+:\\d+$",
87
167
  ),
88
168
  ] = None
89
- 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
90
170
  max_height: Annotated[
91
- 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)
92
172
  ] = None
93
173
  max_width: Annotated[
94
- 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)
95
175
  ] = None
96
176
  min_height: Annotated[
97
- 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)
98
178
  ] = None
99
179
  min_width: Annotated[
100
- 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)
101
181
  ] = None
102
182
  responsive: Annotated[
103
- Responsive | None, Field(description='Indicates which dimensions are responsive/fluid')
183
+ Responsive | None, Field(description="Indicates which dimensions are responsive/fluid")
104
184
  ] = None
105
- 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
106
186
 
107
187
 
108
188
  class Renders(AdCPBaseModel):
109
189
  dimensions: Annotated[
110
- Dimensions, Field(description='Dimensions for this rendered piece (in pixels)')
190
+ Dimensions, Field(description="Dimensions for this rendered piece (in pixels)")
111
191
  ]
112
192
  parameters_from_format_id: Annotated[
113
193
  bool | None,
114
194
  Field(
115
- 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."
116
196
  ),
117
197
  ] = None
118
198
  role: Annotated[
@@ -123,17 +203,18 @@ class Renders(AdCPBaseModel):
123
203
  ]
124
204
 
125
205
 
126
- Dimensions1 = Dimensions
206
+ class Dimensions1(Dimensions):
207
+ pass
127
208
 
128
209
 
129
210
  class Renders1(AdCPBaseModel):
130
211
  dimensions: Annotated[
131
- Dimensions1 | None, Field(description='Dimensions for this rendered piece (in pixels)')
212
+ Dimensions1 | None, Field(description="Dimensions for this rendered piece (in pixels)")
132
213
  ] = None
133
214
  parameters_from_format_id: Annotated[
134
215
  Literal[True],
135
216
  Field(
136
- 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."
137
218
  ),
138
219
  ]
139
220
  role: Annotated[
@@ -146,115 +227,122 @@ class Renders1(AdCPBaseModel):
146
227
 
147
228
  class FormatCard(AdCPBaseModel):
148
229
  model_config = ConfigDict(
149
- extra='forbid',
230
+ extra="allow",
150
231
  )
151
232
  format_id: Annotated[
152
233
  format_id_1.FormatId,
153
234
  Field(
154
- description='Creative format defining the card layout (typically format_card_standard)'
235
+ description="Creative format defining the card layout (typically format_card_standard)"
155
236
  ),
156
237
  ]
157
238
  manifest: Annotated[
158
239
  dict[str, Any],
159
- 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"),
160
241
  ]
161
242
 
162
243
 
163
244
  class FormatCardDetailed(AdCPBaseModel):
164
245
  model_config = ConfigDict(
165
- extra='forbid',
246
+ extra="allow",
166
247
  )
167
248
  format_id: Annotated[
168
249
  format_id_1.FormatId,
169
250
  Field(
170
- 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)"
171
252
  ),
172
253
  ]
173
254
  manifest: Annotated[
174
255
  dict[str, Any],
175
256
  Field(
176
- 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"
177
258
  ),
178
259
  ]
179
260
 
180
261
 
181
262
  class Format(AdCPBaseModel):
182
263
  model_config = ConfigDict(
183
- extra='forbid',
264
+ extra="allow",
184
265
  )
185
266
  accepts_parameters: Annotated[
186
267
  list[format_id_parameter.FormatIdParameter] | None,
187
268
  Field(
188
- 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
+ ),
271
+ ] = None
272
+ assets: Annotated[
273
+ list[Assets | Assets1] | None,
274
+ Field(
275
+ description="Array of all assets supported for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Use the 'required' boolean on each asset to indicate whether it's mandatory. This field replaces the deprecated 'assets_required' and enables full asset discovery for buyers and AI agents."
189
276
  ),
190
277
  ] = None
191
278
  assets_required: Annotated[
192
279
  list[AssetsRequired | AssetsRequired1] | None,
193
280
  Field(
194
- description='Array of required assets or asset groups for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Can contain individual assets or repeatable asset sequences (e.g., carousel products, slideshow frames).'
281
+ deprecated=True,
282
+ description="DEPRECATED: Use 'assets' instead. Array of required assets or asset groups for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Can contain individual assets or repeatable asset sequences (e.g., carousel products, slideshow frames). This field is maintained for backward compatibility; new implementations should use 'assets' with the 'required' boolean on each asset.",
195
283
  ),
196
284
  ] = None
197
285
  delivery: Annotated[
198
286
  dict[str, Any] | None,
199
- 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)"),
200
288
  ] = None
201
289
  description: Annotated[
202
290
  str | None,
203
291
  Field(
204
- 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"
205
293
  ),
206
294
  ] = None
207
295
  example_url: Annotated[
208
296
  AnyUrl | None,
209
297
  Field(
210
- 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"
211
299
  ),
212
300
  ] = None
213
301
  format_card: Annotated[
214
302
  FormatCard | None,
215
303
  Field(
216
- 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."
217
305
  ),
218
306
  ] = None
219
307
  format_card_detailed: Annotated[
220
308
  FormatCardDetailed | None,
221
309
  Field(
222
- 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."
223
311
  ),
224
312
  ] = None
225
313
  format_id: Annotated[
226
314
  format_id_1.FormatId,
227
- Field(description='Structured format identifier with agent URL and format name'),
315
+ Field(description="Structured format identifier with agent URL and format name"),
228
316
  ]
229
- name: Annotated[str, Field(description='Human-readable format name')]
317
+ name: Annotated[str, Field(description="Human-readable format name")]
230
318
  output_format_ids: Annotated[
231
319
  list[format_id_1.FormatId] | None,
232
320
  Field(
233
- 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)."
234
322
  ),
235
323
  ] = None
236
324
  preview_image: Annotated[
237
325
  AnyUrl | None,
238
326
  Field(
239
- 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."
240
328
  ),
241
329
  ] = None
242
330
  renders: Annotated[
243
331
  list[Renders | Renders1] | None,
244
332
  Field(
245
- 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.",
246
334
  min_length=1,
247
335
  ),
248
336
  ] = None
249
337
  supported_macros: Annotated[
250
338
  list[str] | None,
251
339
  Field(
252
- 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."
253
341
  ),
254
342
  ] = None
255
343
  type: Annotated[
256
344
  format_category.FormatCategory,
257
345
  Field(
258
- 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"
259
347
  ),
260
348
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/format_id.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,7 +12,7 @@ from pydantic import AnyUrl, ConfigDict, Field
12
12
 
13
13
  class FormatId(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
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: 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,8 +12,8 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class FrequencyCap(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
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
  ]
@@ -0,0 +1,27 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/identifier.json
3
+ # timestamp: 2026-01-14T17:08:13+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..enums import identifier_types
13
+
14
+
15
+ class Identifier(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra="forbid",
18
+ )
19
+ type: Annotated[
20
+ identifier_types.PropertyIdentifierTypes, Field(description="Type of identifier")
21
+ ]
22
+ value: Annotated[
23
+ str,
24
+ Field(
25
+ description="The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain"
26
+ ),
27
+ ]
@@ -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: 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,29 +12,29 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class Measurement(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
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: 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
 
@@ -16,25 +16,25 @@ from . import package
16
16
 
17
17
  class MediaBuy(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra='forbid',
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