adcp 2.18.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 (187) hide show
  1. adcp/__init__.py +1 -1
  2. adcp/protocols/mcp.py +3 -1
  3. adcp/types/_ergonomic.py +0 -4
  4. adcp/types/_generated.py +85 -4
  5. adcp/types/generated_poc/adagents.py +239 -149
  6. adcp/types/generated_poc/core/activation_key.py +8 -8
  7. adcp/types/generated_poc/core/assets/audio_asset.py +5 -5
  8. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  9. adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
  10. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  11. adcp/types/generated_poc/core/assets/image_asset.py +6 -6
  12. adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
  13. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  14. adcp/types/generated_poc/core/assets/url_asset.py +3 -3
  15. adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
  16. adcp/types/generated_poc/core/assets/video_asset.py +7 -7
  17. adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
  18. adcp/types/generated_poc/core/async_response_data.py +2 -2
  19. adcp/types/generated_poc/core/brand_manifest.py +55 -55
  20. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  21. adcp/types/generated_poc/core/context.py +1 -1
  22. adcp/types/generated_poc/core/creative_asset.py +13 -13
  23. adcp/types/generated_poc/core/creative_assignment.py +3 -3
  24. adcp/types/generated_poc/core/creative_filters.py +19 -19
  25. adcp/types/generated_poc/core/creative_manifest.py +2 -2
  26. adcp/types/generated_poc/core/creative_policy.py +4 -4
  27. adcp/types/generated_poc/core/delivery_metrics.py +32 -32
  28. adcp/types/generated_poc/core/deployment.py +20 -20
  29. adcp/types/generated_poc/core/destination.py +11 -11
  30. adcp/types/generated_poc/core/error.py +6 -6
  31. adcp/types/generated_poc/core/ext.py +1 -1
  32. adcp/types/generated_poc/core/format.py +67 -66
  33. adcp/types/generated_poc/core/format_id.py +5 -5
  34. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  35. adcp/types/generated_poc/core/identifier.py +27 -0
  36. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  37. adcp/types/generated_poc/core/measurement.py +8 -8
  38. adcp/types/generated_poc/core/media_buy.py +7 -7
  39. adcp/types/generated_poc/core/package.py +8 -8
  40. adcp/types/generated_poc/core/performance_feedback.py +18 -18
  41. adcp/types/generated_poc/core/placement.py +4 -4
  42. adcp/types/generated_poc/core/pricing_option.py +2 -2
  43. adcp/types/generated_poc/core/product.py +20 -20
  44. adcp/types/generated_poc/core/product_filters.py +18 -18
  45. adcp/types/generated_poc/core/promoted_offerings.py +20 -20
  46. adcp/types/generated_poc/core/promoted_products.py +2 -2
  47. adcp/types/generated_poc/core/property.py +9 -9
  48. adcp/types/generated_poc/core/property_id.py +4 -4
  49. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  50. adcp/types/generated_poc/core/property_tag.py +4 -4
  51. adcp/types/generated_poc/core/protocol_envelope.py +8 -8
  52. adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
  53. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  54. adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
  55. adcp/types/generated_poc/core/response.py +4 -4
  56. adcp/types/generated_poc/core/signal_filters.py +5 -5
  57. adcp/types/generated_poc/core/start_timing.py +5 -5
  58. adcp/types/generated_poc/core/sub_asset.py +14 -14
  59. adcp/types/generated_poc/core/targeting.py +8 -8
  60. adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
  61. adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
  62. adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
  63. adcp/types/generated_poc/creative/preview_creative_response.py +31 -30
  64. adcp/types/generated_poc/creative/preview_render.py +25 -25
  65. adcp/types/generated_poc/enums/adcp_domain.py +5 -3
  66. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  67. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  68. adcp/types/generated_poc/enums/available_metric.py +9 -9
  69. adcp/types/generated_poc/enums/channels.py +9 -9
  70. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  71. adcp/types/generated_poc/enums/creative_action.py +5 -5
  72. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  73. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  74. adcp/types/generated_poc/enums/creative_status.py +4 -4
  75. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  76. adcp/types/generated_poc/enums/daast_version.py +2 -2
  77. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  78. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  79. adcp/types/generated_poc/enums/feed_format.py +3 -3
  80. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  81. adcp/types/generated_poc/enums/format_category.py +7 -7
  82. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  83. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  84. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  85. adcp/types/generated_poc/enums/http_method.py +2 -2
  86. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  87. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  88. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  89. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  90. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  91. adcp/types/generated_poc/enums/metric_type.py +8 -8
  92. adcp/types/generated_poc/enums/notification_type.py +4 -4
  93. adcp/types/generated_poc/enums/pacing.py +3 -3
  94. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  95. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  96. adcp/types/generated_poc/enums/property_type.py +7 -7
  97. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  98. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  99. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  100. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  101. adcp/types/generated_poc/enums/standard_format_ids.py +35 -35
  102. adcp/types/generated_poc/enums/task_status.py +9 -9
  103. adcp/types/generated_poc/enums/task_type.py +12 -6
  104. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  105. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  106. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  107. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  108. adcp/types/generated_poc/enums/vast_version.py +5 -5
  109. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  110. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  111. adcp/types/generated_poc/extensions/__init__.py +3 -0
  112. adcp/types/generated_poc/extensions/extension_meta.py +50 -0
  113. adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
  114. adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
  115. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
  116. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  117. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
  118. adcp/types/generated_poc/media_buy/create_media_buy_request.py +25 -25
  119. adcp/types/generated_poc/media_buy/create_media_buy_response.py +7 -7
  120. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
  121. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
  122. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
  123. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  124. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
  125. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  126. adcp/types/generated_poc/media_buy/get_products_response.py +10 -4
  127. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +3 -3
  128. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +7 -7
  129. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
  130. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
  131. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  132. adcp/types/generated_poc/media_buy/list_creatives_response.py +52 -52
  133. adcp/types/generated_poc/media_buy/package_request.py +16 -7
  134. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
  135. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
  136. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
  137. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  138. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
  139. adcp/types/generated_poc/media_buy/sync_creatives_request.py +7 -7
  140. adcp/types/generated_poc/media_buy/sync_creatives_response.py +15 -15
  141. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
  142. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  143. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
  144. adcp/types/generated_poc/media_buy/update_media_buy_request.py +37 -29
  145. adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
  146. adcp/types/generated_poc/pricing_options/cpc_option.py +8 -8
  147. adcp/types/generated_poc/pricing_options/cpcv_option.py +8 -8
  148. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +13 -13
  149. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +8 -8
  150. adcp/types/generated_poc/pricing_options/cpp_option.py +13 -13
  151. adcp/types/generated_poc/pricing_options/cpv_option.py +12 -12
  152. adcp/types/generated_poc/pricing_options/flat_rate_option.py +15 -15
  153. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +13 -13
  154. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +8 -8
  155. adcp/types/generated_poc/property/__init__.py +3 -0
  156. adcp/types/generated_poc/property/base_property_source.py +86 -0
  157. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  158. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  159. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  160. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  161. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  162. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  163. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  164. adcp/types/generated_poc/property/list_property_features_request.py +25 -0
  165. adcp/types/generated_poc/property/list_property_features_response.py +24 -0
  166. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  167. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  168. adcp/types/generated_poc/property/property_error.py +33 -0
  169. adcp/types/generated_poc/property/property_feature.py +22 -0
  170. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  171. adcp/types/generated_poc/property/property_list.py +62 -0
  172. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  173. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  174. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  175. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  176. adcp/types/generated_poc/protocols/adcp_extension.py +26 -10
  177. adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
  178. adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
  179. adcp/types/generated_poc/signals/get_signals_request.py +8 -8
  180. adcp/types/generated_poc/signals/get_signals_response.py +15 -15
  181. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/METADATA +1 -1
  182. adcp-2.19.0.dist-info/RECORD +220 -0
  183. adcp-2.18.0.dist-info/RECORD +0 -195
  184. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/WHEEL +0 -0
  185. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/entry_points.txt +0 -0
  186. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/licenses/LICENSE +0 -0
  187. {adcp-2.18.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: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-14T17:08:13+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -17,7 +17,7 @@ class Assets(AdCPBaseModel):
17
17
  asset_id: Annotated[
18
18
  str,
19
19
  Field(
20
- description='Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object.'
20
+ description="Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object."
21
21
  ),
22
22
  ]
23
23
  asset_role: Annotated[
@@ -26,42 +26,42 @@ class Assets(AdCPBaseModel):
26
26
  description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
27
27
  ),
28
28
  ] = None
29
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
29
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
30
30
  item_type: Annotated[
31
- Literal['individual'],
32
- Field(description='Discriminator indicating this is an individual asset'),
31
+ Literal["individual"],
32
+ Field(description="Discriminator indicating this is an individual asset"),
33
33
  ]
34
34
  required: Annotated[
35
35
  bool,
36
36
  Field(
37
- description='Whether this asset is required (true) or optional (false). Required assets must be provided for a valid creative. Optional assets enhance the creative but are not mandatory.'
37
+ description="Whether this asset is required (true) or optional (false). Required assets must be provided for a valid creative. Optional assets enhance the creative but are not mandatory."
38
38
  ),
39
39
  ]
40
40
  requirements: Annotated[
41
41
  dict[str, Any] | None,
42
42
  Field(
43
- description='Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
43
+ description="Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms)."
44
44
  ),
45
45
  ] = None
46
46
 
47
47
 
48
48
  class Asset(AdCPBaseModel):
49
- asset_id: Annotated[str, Field(description='Identifier for this asset within the group')]
49
+ asset_id: Annotated[str, Field(description="Identifier for this asset within the group")]
50
50
  asset_role: Annotated[
51
51
  str | None,
52
52
  Field(
53
53
  description="Optional descriptive label for this asset's purpose. Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
54
54
  ),
55
55
  ] = None
56
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
56
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
57
57
  required: Annotated[
58
58
  bool,
59
- Field(description='Whether this asset is required within each repetition of the group'),
59
+ Field(description="Whether this asset is required within each repetition of the group"),
60
60
  ]
61
61
  requirements: Annotated[
62
62
  dict[str, Any] | None,
63
63
  Field(
64
- description='Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
64
+ description="Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms)."
65
65
  ),
66
66
  ] = None
67
67
 
@@ -70,23 +70,23 @@ class Assets1(AdCPBaseModel):
70
70
  asset_group_id: Annotated[
71
71
  str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
72
72
  ]
73
- assets: Annotated[list[Asset], Field(description='Assets within each repetition of this group')]
73
+ assets: Annotated[list[Asset], Field(description="Assets within each repetition of this group")]
74
74
  item_type: Annotated[
75
- Literal['repeatable_group'],
76
- Field(description='Discriminator indicating this is a repeatable asset group'),
75
+ Literal["repeatable_group"],
76
+ Field(description="Discriminator indicating this is a repeatable asset group"),
77
77
  ]
78
- max_count: Annotated[int, Field(description='Maximum number of repetitions allowed', ge=1)]
78
+ max_count: Annotated[int, Field(description="Maximum number of repetitions allowed", ge=1)]
79
79
  min_count: Annotated[
80
80
  int,
81
81
  Field(
82
- description='Minimum number of repetitions required (if group is required) or allowed (if optional)',
82
+ description="Minimum number of repetitions required (if group is required) or allowed (if optional)",
83
83
  ge=0,
84
84
  ),
85
85
  ]
86
86
  required: Annotated[
87
87
  bool,
88
88
  Field(
89
- description='Whether this asset group is required. If true, at least min_count repetitions must be provided.'
89
+ description="Whether this asset group is required. If true, at least min_count repetitions must be provided."
90
90
  ),
91
91
  ]
92
92
 
@@ -95,7 +95,7 @@ class AssetsRequired(AdCPBaseModel):
95
95
  asset_id: Annotated[
96
96
  str,
97
97
  Field(
98
- description='Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object.'
98
+ description="Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object."
99
99
  ),
100
100
  ]
101
101
  asset_role: Annotated[
@@ -104,36 +104,36 @@ class AssetsRequired(AdCPBaseModel):
104
104
  description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
105
105
  ),
106
106
  ] = None
107
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
107
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
108
108
  item_type: Annotated[
109
- Literal['individual'],
110
- Field(description='Discriminator indicating this is an individual asset requirement'),
109
+ Literal["individual"],
110
+ Field(description="Discriminator indicating this is an individual asset requirement"),
111
111
  ]
112
- required: Annotated[bool | None, Field(description='Whether this asset is required')] = None
112
+ required: Annotated[bool | None, Field(description="Whether this asset is required")] = None
113
113
  requirements: Annotated[
114
114
  dict[str, Any] | None,
115
115
  Field(
116
- description='Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
116
+ description="Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms)."
117
117
  ),
118
118
  ] = None
119
119
 
120
120
 
121
121
  class Asset2(AdCPBaseModel):
122
- asset_id: Annotated[str, Field(description='Identifier for this asset within the group')]
122
+ asset_id: Annotated[str, Field(description="Identifier for this asset within the group")]
123
123
  asset_role: Annotated[
124
124
  str | None,
125
125
  Field(
126
126
  description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
127
127
  ),
128
128
  ] = None
129
- asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
129
+ asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
130
130
  required: Annotated[
131
- bool | None, Field(description='Whether this asset is required in each repetition')
131
+ bool | None, Field(description="Whether this asset is required in each repetition")
132
132
  ] = None
133
133
  requirements: Annotated[
134
134
  dict[str, Any] | None,
135
135
  Field(
136
- description='Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
136
+ description="Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms)."
137
137
  ),
138
138
  ] = None
139
139
 
@@ -143,14 +143,14 @@ class AssetsRequired1(AdCPBaseModel):
143
143
  str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
144
144
  ]
145
145
  assets: Annotated[
146
- list[Asset2], Field(description='Assets within each repetition of this group')
146
+ list[Asset2], Field(description="Assets within each repetition of this group")
147
147
  ]
148
148
  item_type: Annotated[
149
- Literal['repeatable_group'],
150
- Field(description='Discriminator indicating this is a repeatable asset group'),
149
+ Literal["repeatable_group"],
150
+ Field(description="Discriminator indicating this is a repeatable asset group"),
151
151
  ]
152
- max_count: Annotated[int, Field(description='Maximum number of repetitions allowed', ge=1)]
153
- min_count: Annotated[int, Field(description='Minimum number of repetitions required', ge=1)]
152
+ max_count: Annotated[int, Field(description="Maximum number of repetitions allowed", ge=1)]
153
+ min_count: Annotated[int, Field(description="Minimum number of repetitions required", ge=1)]
154
154
 
155
155
 
156
156
  class Responsive(AdCPBaseModel):
@@ -163,36 +163,36 @@ class Dimensions(AdCPBaseModel):
163
163
  str | None,
164
164
  Field(
165
165
  description="Fixed aspect ratio constraint (e.g., '16:9', '4:3', '1:1')",
166
- pattern='^\\d+:\\d+$',
166
+ pattern="^\\d+:\\d+$",
167
167
  ),
168
168
  ] = None
169
- height: Annotated[int | None, Field(description='Fixed height in pixels', ge=1)] = None
169
+ height: Annotated[int | None, Field(description="Fixed height in pixels", ge=1)] = None
170
170
  max_height: Annotated[
171
- int | None, Field(description='Maximum height in pixels for responsive renders', ge=1)
171
+ int | None, Field(description="Maximum height in pixels for responsive renders", ge=1)
172
172
  ] = None
173
173
  max_width: Annotated[
174
- int | None, Field(description='Maximum width in pixels for responsive renders', ge=1)
174
+ int | None, Field(description="Maximum width in pixels for responsive renders", ge=1)
175
175
  ] = None
176
176
  min_height: Annotated[
177
- int | None, Field(description='Minimum height in pixels for responsive renders', ge=1)
177
+ int | None, Field(description="Minimum height in pixels for responsive renders", ge=1)
178
178
  ] = None
179
179
  min_width: Annotated[
180
- int | None, Field(description='Minimum width in pixels for responsive renders', ge=1)
180
+ int | None, Field(description="Minimum width in pixels for responsive renders", ge=1)
181
181
  ] = None
182
182
  responsive: Annotated[
183
- Responsive | None, Field(description='Indicates which dimensions are responsive/fluid')
183
+ Responsive | None, Field(description="Indicates which dimensions are responsive/fluid")
184
184
  ] = None
185
- width: Annotated[int | None, Field(description='Fixed width in pixels', ge=1)] = None
185
+ width: Annotated[int | None, Field(description="Fixed width in pixels", ge=1)] = None
186
186
 
187
187
 
188
188
  class Renders(AdCPBaseModel):
189
189
  dimensions: Annotated[
190
- Dimensions, Field(description='Dimensions for this rendered piece (in pixels)')
190
+ Dimensions, Field(description="Dimensions for this rendered piece (in pixels)")
191
191
  ]
192
192
  parameters_from_format_id: Annotated[
193
193
  bool | None,
194
194
  Field(
195
- description='When true, parameters for this render (dimensions and/or duration) are specified in the format_id. Used for template formats that accept parameters. Mutually exclusive with specifying dimensions object explicitly.'
195
+ description="When true, parameters for this render (dimensions and/or duration) are specified in the format_id. Used for template formats that accept parameters. Mutually exclusive with specifying dimensions object explicitly."
196
196
  ),
197
197
  ] = None
198
198
  role: Annotated[
@@ -203,17 +203,18 @@ class Renders(AdCPBaseModel):
203
203
  ]
204
204
 
205
205
 
206
- Dimensions1 = Dimensions
206
+ class Dimensions1(Dimensions):
207
+ pass
207
208
 
208
209
 
209
210
  class Renders1(AdCPBaseModel):
210
211
  dimensions: Annotated[
211
- Dimensions1 | None, Field(description='Dimensions for this rendered piece (in pixels)')
212
+ Dimensions1 | None, Field(description="Dimensions for this rendered piece (in pixels)")
212
213
  ] = None
213
214
  parameters_from_format_id: Annotated[
214
215
  Literal[True],
215
216
  Field(
216
- 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."
217
218
  ),
218
219
  ]
219
220
  role: Annotated[
@@ -226,46 +227,46 @@ class Renders1(AdCPBaseModel):
226
227
 
227
228
  class FormatCard(AdCPBaseModel):
228
229
  model_config = ConfigDict(
229
- extra='allow',
230
+ extra="allow",
230
231
  )
231
232
  format_id: Annotated[
232
233
  format_id_1.FormatId,
233
234
  Field(
234
- description='Creative format defining the card layout (typically format_card_standard)'
235
+ description="Creative format defining the card layout (typically format_card_standard)"
235
236
  ),
236
237
  ]
237
238
  manifest: Annotated[
238
239
  dict[str, Any],
239
- 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"),
240
241
  ]
241
242
 
242
243
 
243
244
  class FormatCardDetailed(AdCPBaseModel):
244
245
  model_config = ConfigDict(
245
- extra='allow',
246
+ extra="allow",
246
247
  )
247
248
  format_id: Annotated[
248
249
  format_id_1.FormatId,
249
250
  Field(
250
- 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)"
251
252
  ),
252
253
  ]
253
254
  manifest: Annotated[
254
255
  dict[str, Any],
255
256
  Field(
256
- 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"
257
258
  ),
258
259
  ]
259
260
 
260
261
 
261
262
  class Format(AdCPBaseModel):
262
263
  model_config = ConfigDict(
263
- extra='allow',
264
+ extra="allow",
264
265
  )
265
266
  accepts_parameters: Annotated[
266
267
  list[format_id_parameter.FormatIdParameter] | None,
267
268
  Field(
268
- 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."
269
270
  ),
270
271
  ] = None
271
272
  assets: Annotated[
@@ -278,70 +279,70 @@ class Format(AdCPBaseModel):
278
279
  list[AssetsRequired | AssetsRequired1] | None,
279
280
  Field(
280
281
  deprecated=True,
281
- 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."
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.",
282
283
  ),
283
284
  ] = None
284
285
  delivery: Annotated[
285
286
  dict[str, Any] | None,
286
- 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)"),
287
288
  ] = None
288
289
  description: Annotated[
289
290
  str | None,
290
291
  Field(
291
- 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"
292
293
  ),
293
294
  ] = None
294
295
  example_url: Annotated[
295
296
  AnyUrl | None,
296
297
  Field(
297
- 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"
298
299
  ),
299
300
  ] = None
300
301
  format_card: Annotated[
301
302
  FormatCard | None,
302
303
  Field(
303
- 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."
304
305
  ),
305
306
  ] = None
306
307
  format_card_detailed: Annotated[
307
308
  FormatCardDetailed | None,
308
309
  Field(
309
- 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."
310
311
  ),
311
312
  ] = None
312
313
  format_id: Annotated[
313
314
  format_id_1.FormatId,
314
- Field(description='Structured format identifier with agent URL and format name'),
315
+ Field(description="Structured format identifier with agent URL and format name"),
315
316
  ]
316
- name: Annotated[str, Field(description='Human-readable format name')]
317
+ name: Annotated[str, Field(description="Human-readable format name")]
317
318
  output_format_ids: Annotated[
318
319
  list[format_id_1.FormatId] | None,
319
320
  Field(
320
- 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)."
321
322
  ),
322
323
  ] = None
323
324
  preview_image: Annotated[
324
325
  AnyUrl | None,
325
326
  Field(
326
- 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."
327
328
  ),
328
329
  ] = None
329
330
  renders: Annotated[
330
331
  list[Renders | Renders1] | None,
331
332
  Field(
332
- 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.",
333
334
  min_length=1,
334
335
  ),
335
336
  ] = None
336
337
  supported_macros: Annotated[
337
338
  list[str] | None,
338
339
  Field(
339
- 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."
340
341
  ),
341
342
  ] = None
342
343
  type: Annotated[
343
344
  format_category.FormatCategory,
344
345
  Field(
345
- 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"
346
347
  ),
347
348
  ]
@@ -12,7 +12,7 @@ from pydantic import AnyUrl, ConfigDict, Field
12
12
 
13
13
  class FormatId(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  agent_url: Annotated[
18
18
  AnyUrl,
@@ -23,14 +23,14 @@ class FormatId(AdCPBaseModel):
23
23
  duration_ms: Annotated[
24
24
  float | None,
25
25
  Field(
26
- description='Duration in milliseconds for time-based formats (video, audio). When specified, creates a parameterized format ID. Omit to reference a template format without parameters.',
26
+ description="Duration in milliseconds for time-based formats (video, audio). When specified, creates a parameterized format ID. Omit to reference a template format without parameters.",
27
27
  ge=1.0,
28
28
  ),
29
29
  ] = None
30
30
  height: Annotated[
31
31
  int | None,
32
32
  Field(
33
- description='Height in pixels for visual formats. When specified, width must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.',
33
+ description="Height in pixels for visual formats. When specified, width must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.",
34
34
  ge=1,
35
35
  ),
36
36
  ] = None
@@ -38,13 +38,13 @@ class FormatId(AdCPBaseModel):
38
38
  str,
39
39
  Field(
40
40
  description="Format identifier within the agent's namespace (e.g., 'display_static', 'video_hosted', 'audio_standard'). When used alone, references a template format. When combined with dimension/duration fields, creates a parameterized format ID for a specific variant.",
41
- pattern='^[a-zA-Z0-9_-]+$',
41
+ pattern="^[a-zA-Z0-9_-]+$",
42
42
  ),
43
43
  ]
44
44
  width: Annotated[
45
45
  int | None,
46
46
  Field(
47
- description='Width in pixels for visual formats. When specified, height must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.',
47
+ description="Width in pixels for visual formats. When specified, height must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.",
48
48
  ge=1,
49
49
  ),
50
50
  ] = None
@@ -12,8 +12,8 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class FrequencyCap(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  suppress_minutes: Annotated[
18
- float, Field(description='Minutes to suppress after impression', ge=0.0)
18
+ float, Field(description="Minutes to suppress after impression", ge=0.0)
19
19
  ]
@@ -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
  ]
@@ -12,29 +12,29 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class Measurement(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  attribution: Annotated[
18
18
  str,
19
19
  Field(
20
- description='Attribution methodology',
21
- examples=['deterministic_purchase', 'probabilistic'],
20
+ description="Attribution methodology",
21
+ examples=["deterministic_purchase", "probabilistic"],
22
22
  ),
23
23
  ]
24
24
  reporting: Annotated[
25
25
  str,
26
26
  Field(
27
- description='Reporting frequency and format',
28
- examples=['weekly_dashboard', 'real_time_api'],
27
+ description="Reporting frequency and format",
28
+ examples=["weekly_dashboard", "real_time_api"],
29
29
  ),
30
30
  ]
31
31
  type: Annotated[
32
32
  str,
33
33
  Field(
34
- description='Type of measurement',
35
- examples=['incremental_sales_lift', 'brand_lift', 'foot_traffic'],
34
+ description="Type of measurement",
35
+ examples=["incremental_sales_lift", "brand_lift", "foot_traffic"],
36
36
  ),
37
37
  ]
38
38
  window: Annotated[
39
- str | None, Field(description='Attribution window', examples=['30_days', '7_days'])
39
+ str | None, Field(description="Attribution window", examples=["30_days", "7_days"])
40
40
  ] = None
@@ -16,25 +16,25 @@ from . import package
16
16
 
17
17
  class MediaBuy(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra='allow',
19
+ extra="allow",
20
20
  )
21
21
  buyer_ref: Annotated[
22
22
  str | None, Field(description="Buyer's reference identifier for this media buy")
23
23
  ] = None
24
- created_at: Annotated[AwareDatetime | None, Field(description='Creation timestamp')] = None
24
+ created_at: Annotated[AwareDatetime | None, Field(description="Creation timestamp")] = None
25
25
  creative_deadline: Annotated[
26
- AwareDatetime | None, Field(description='ISO 8601 timestamp for creative upload deadline')
26
+ AwareDatetime | None, Field(description="ISO 8601 timestamp for creative upload deadline")
27
27
  ] = None
28
28
  ext: ext_1.ExtensionObject | None = None
29
29
  media_buy_id: Annotated[
30
30
  str, Field(description="Publisher's unique identifier for the media buy")
31
31
  ]
32
32
  packages: Annotated[
33
- list[package.Package], Field(description='Array of packages within this media buy')
33
+ list[package.Package], Field(description="Array of packages within this media buy")
34
34
  ]
35
35
  promoted_offering: Annotated[
36
- str, Field(description='Description of advertiser and what is being promoted')
36
+ str, Field(description="Description of advertiser and what is being promoted")
37
37
  ]
38
38
  status: media_buy_status.MediaBuyStatus
39
- total_budget: Annotated[float, Field(description='Total budget amount', ge=0.0)]
40
- updated_at: Annotated[AwareDatetime | None, Field(description='Last update timestamp')] = None
39
+ total_budget: Annotated[float, Field(description="Total budget amount", ge=0.0)]
40
+ updated_at: Annotated[AwareDatetime | None, Field(description="Last update timestamp")] = None