adcp 2.11.1__py3-none-any.whl → 2.12.1__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 (170) hide show
  1. adcp/ADCP_VERSION +1 -0
  2. adcp/__init__.py +24 -3
  3. adcp/__main__.py +31 -3
  4. adcp/client.py +16 -0
  5. adcp/protocols/a2a.py +178 -25
  6. adcp/protocols/base.py +23 -4
  7. adcp/protocols/mcp.py +44 -0
  8. adcp/types/__init__.py +2 -26
  9. adcp/types/_generated.py +179 -158
  10. adcp/types/generated_poc/adagents.py +221 -25
  11. adcp/types/generated_poc/core/__init__.py +3 -0
  12. adcp/types/generated_poc/{activation_key.py → core/activation_key.py} +2 -2
  13. adcp/types/generated_poc/core/assets/__init__.py +3 -0
  14. adcp/types/generated_poc/{audio_asset.py → core/assets/audio_asset.py} +2 -2
  15. adcp/types/generated_poc/{css_asset.py → core/assets/css_asset.py} +2 -2
  16. adcp/types/generated_poc/{daast_asset.py → core/assets/daast_asset.py} +4 -4
  17. adcp/types/generated_poc/{html_asset.py → core/assets/html_asset.py} +2 -2
  18. adcp/types/generated_poc/core/assets/image_asset.py +19 -0
  19. adcp/types/generated_poc/{javascript_asset.py → core/assets/javascript_asset.py} +3 -3
  20. adcp/types/generated_poc/{text_asset.py → core/assets/text_asset.py} +2 -2
  21. adcp/types/generated_poc/{url_asset.py → core/assets/url_asset.py} +3 -3
  22. adcp/types/generated_poc/{vast_asset.py → core/assets/vast_asset.py} +4 -4
  23. adcp/types/generated_poc/{video_asset.py → core/assets/video_asset.py} +7 -11
  24. adcp/types/generated_poc/{webhook_asset.py → core/assets/webhook_asset.py} +3 -3
  25. adcp/types/generated_poc/{brand_manifest.py → core/brand_manifest.py} +3 -3
  26. adcp/types/generated_poc/core/context.py +15 -0
  27. adcp/types/generated_poc/{creative_asset.py → core/creative_asset.py} +25 -6
  28. adcp/types/generated_poc/{creative_assignment.py → core/creative_assignment.py} +2 -2
  29. adcp/types/generated_poc/{creative_filters.py → core/creative_filters.py} +12 -3
  30. adcp/types/generated_poc/{creative_manifest.py → core/creative_manifest.py} +13 -6
  31. adcp/types/generated_poc/{creative_policy.py → core/creative_policy.py} +3 -3
  32. adcp/types/generated_poc/{delivery_metrics.py → core/delivery_metrics.py} +2 -2
  33. adcp/types/generated_poc/{deployment.py → core/deployment.py} +2 -2
  34. adcp/types/generated_poc/{destination.py → core/destination.py} +2 -2
  35. adcp/types/generated_poc/core/dimensions.py +18 -0
  36. adcp/types/generated_poc/{error.py → core/error.py} +2 -2
  37. adcp/types/generated_poc/core/ext.py +15 -0
  38. adcp/types/generated_poc/{format.py → core/format.py} +85 -54
  39. adcp/types/generated_poc/core/format_id.py +50 -0
  40. adcp/types/generated_poc/{frequency_cap.py → core/frequency_cap.py} +2 -2
  41. adcp/types/generated_poc/{measurement.py → core/measurement.py} +2 -2
  42. adcp/types/generated_poc/{media_buy.py → core/media_buy.py} +6 -3
  43. adcp/types/generated_poc/{package.py → core/package.py} +13 -6
  44. adcp/types/generated_poc/{performance_feedback.py → core/performance_feedback.py} +4 -4
  45. adcp/types/generated_poc/{placement.py → core/placement.py} +3 -3
  46. adcp/types/generated_poc/{product.py → core/product.py} +16 -6
  47. adcp/types/generated_poc/core/product_filters.py +97 -0
  48. adcp/types/generated_poc/{promoted_offerings.py → core/promoted_offerings.py} +2 -2
  49. adcp/types/generated_poc/{promoted_products.py → core/promoted_products.py} +2 -2
  50. adcp/types/generated_poc/{property.py → core/property.py} +5 -4
  51. adcp/types/generated_poc/{property_id.py → core/property_id.py} +2 -2
  52. adcp/types/generated_poc/{property_tag.py → core/property_tag.py} +2 -2
  53. adcp/types/generated_poc/{protocol_envelope.py → core/protocol_envelope.py} +3 -3
  54. adcp/types/generated_poc/{publisher_property_selector.py → core/publisher_property_selector.py} +2 -2
  55. adcp/types/generated_poc/{push_notification_config.py → core/push_notification_config.py} +3 -3
  56. adcp/types/generated_poc/{reporting_capabilities.py → core/reporting_capabilities.py} +3 -3
  57. adcp/types/generated_poc/{response.py → core/response.py} +2 -2
  58. adcp/types/generated_poc/{signal_filters.py → core/signal_filters.py} +3 -3
  59. adcp/types/generated_poc/{sub_asset.py → core/sub_asset.py} +2 -2
  60. adcp/types/generated_poc/{targeting.py → core/targeting.py} +2 -2
  61. adcp/types/generated_poc/{webhook_payload.py → core/webhook_payload.py} +4 -4
  62. adcp/types/generated_poc/creative/__init__.py +3 -0
  63. adcp/types/generated_poc/creative/list_creative_formats_request.py +88 -0
  64. adcp/types/generated_poc/creative/list_creative_formats_response.py +55 -0
  65. adcp/types/generated_poc/{preview_creative_request.py → creative/preview_creative_request.py} +13 -18
  66. adcp/types/generated_poc/{preview_creative_response.py → creative/preview_creative_response.py} +8 -14
  67. adcp/types/generated_poc/{preview_render.py → creative/preview_render.py} +2 -2
  68. adcp/types/generated_poc/enums/__init__.py +3 -0
  69. adcp/types/generated_poc/{adcp_domain.py → enums/adcp_domain.py} +2 -2
  70. adcp/types/generated_poc/{asset_content_type.py → enums/asset_content_type.py} +2 -2
  71. adcp/types/generated_poc/{auth_scheme.py → enums/auth_scheme.py} +2 -2
  72. adcp/types/generated_poc/{available_metric.py → enums/available_metric.py} +2 -2
  73. adcp/types/generated_poc/{channels.py → enums/channels.py} +2 -2
  74. adcp/types/generated_poc/{co_branding_requirement.py → enums/co_branding_requirement.py} +2 -2
  75. adcp/types/generated_poc/{creative_action.py → enums/creative_action.py} +2 -2
  76. adcp/types/generated_poc/{creative_agent_capability.py → enums/creative_agent_capability.py} +2 -2
  77. adcp/types/generated_poc/{creative_sort_field.py → enums/creative_sort_field.py} +2 -2
  78. adcp/types/generated_poc/{creative_status.py → enums/creative_status.py} +2 -2
  79. adcp/types/generated_poc/{daast_tracking_event.py → enums/daast_tracking_event.py} +2 -2
  80. adcp/types/generated_poc/{daast_version.py → enums/daast_version.py} +2 -2
  81. adcp/types/generated_poc/{delivery_type.py → enums/delivery_type.py} +2 -2
  82. adcp/types/generated_poc/{dimension_unit.py → enums/dimension_unit.py} +2 -2
  83. adcp/types/generated_poc/{feed_format.py → enums/feed_format.py} +2 -2
  84. adcp/types/generated_poc/{feedback_source.py → enums/feedback_source.py} +2 -2
  85. adcp/types/generated_poc/{format_category.py → enums/format_category.py} +2 -2
  86. adcp/types/generated_poc/enums/format_id_parameter.py +12 -0
  87. adcp/types/generated_poc/{frequency_cap_scope.py → enums/frequency_cap_scope.py} +2 -2
  88. adcp/types/generated_poc/{history_entry_type.py → enums/history_entry_type.py} +2 -2
  89. adcp/types/generated_poc/{http_method.py → enums/http_method.py} +2 -2
  90. adcp/types/generated_poc/{identifier_types.py → enums/identifier_types.py} +2 -2
  91. adcp/types/generated_poc/{javascript_module_type.py → enums/javascript_module_type.py} +2 -2
  92. adcp/types/generated_poc/{landing_page_requirement.py → enums/landing_page_requirement.py} +2 -2
  93. adcp/types/generated_poc/{markdown_flavor.py → enums/markdown_flavor.py} +2 -2
  94. adcp/types/generated_poc/{media_buy_status.py → enums/media_buy_status.py} +2 -2
  95. adcp/types/generated_poc/{metric_type.py → enums/metric_type.py} +2 -2
  96. adcp/types/generated_poc/{notification_type.py → enums/notification_type.py} +2 -2
  97. adcp/types/generated_poc/{pacing.py → enums/pacing.py} +2 -2
  98. adcp/types/generated_poc/{preview_output_format.py → enums/preview_output_format.py} +2 -2
  99. adcp/types/generated_poc/{pricing_model.py → enums/pricing_model.py} +2 -2
  100. adcp/types/generated_poc/{property_type.py → enums/property_type.py} +2 -2
  101. adcp/types/generated_poc/{publisher_identifier_types.py → enums/publisher_identifier_types.py} +2 -2
  102. adcp/types/generated_poc/{reporting_frequency.py → enums/reporting_frequency.py} +2 -2
  103. adcp/types/generated_poc/{signal_catalog_type.py → enums/signal_catalog_type.py} +2 -2
  104. adcp/types/generated_poc/{sort_direction.py → enums/sort_direction.py} +2 -2
  105. adcp/types/generated_poc/{standard_format_ids.py → enums/standard_format_ids.py} +2 -2
  106. adcp/types/generated_poc/{task_status.py → enums/task_status.py} +2 -2
  107. adcp/types/generated_poc/{task_type.py → enums/task_type.py} +2 -2
  108. adcp/types/generated_poc/{update_frequency.py → enums/update_frequency.py} +2 -2
  109. adcp/types/generated_poc/{url_asset_type.py → enums/url_asset_type.py} +2 -2
  110. adcp/types/generated_poc/{validation_mode.py → enums/validation_mode.py} +2 -2
  111. adcp/types/generated_poc/{vast_tracking_event.py → enums/vast_tracking_event.py} +2 -2
  112. adcp/types/generated_poc/{vast_version.py → enums/vast_version.py} +2 -2
  113. adcp/types/generated_poc/{webhook_response_type.py → enums/webhook_response_type.py} +2 -2
  114. adcp/types/generated_poc/{webhook_security_method.py → enums/webhook_security_method.py} +2 -2
  115. adcp/types/generated_poc/media_buy/__init__.py +3 -0
  116. adcp/types/generated_poc/{build_creative_request.py → media_buy/build_creative_request.py} +9 -11
  117. adcp/types/generated_poc/{build_creative_response.py → media_buy/build_creative_response.py} +11 -17
  118. adcp/types/generated_poc/{create_media_buy_request.py → media_buy/create_media_buy_request.py} +9 -11
  119. adcp/types/generated_poc/{create_media_buy_response.py → media_buy/create_media_buy_response.py} +11 -16
  120. adcp/types/generated_poc/{get_media_buy_delivery_request.py → media_buy/get_media_buy_delivery_request.py} +8 -10
  121. adcp/types/generated_poc/{get_media_buy_delivery_response.py → media_buy/get_media_buy_delivery_response.py} +27 -12
  122. adcp/types/generated_poc/{get_products_request.py → media_buy/get_products_request.py} +9 -11
  123. adcp/types/generated_poc/{get_products_response.py → media_buy/get_products_response.py} +9 -10
  124. adcp/types/generated_poc/{list_authorized_properties_request.py → media_buy/list_authorized_properties_request.py} +8 -9
  125. adcp/types/generated_poc/{list_authorized_properties_response.py → media_buy/list_authorized_properties_response.py} +9 -10
  126. adcp/types/generated_poc/{list_creative_formats_request.py → media_buy/list_creative_formats_request.py} +9 -10
  127. adcp/types/generated_poc/{list_creative_formats_response.py → media_buy/list_creative_formats_response.py} +10 -10
  128. adcp/types/generated_poc/{list_creatives_request.py → media_buy/list_creatives_request.py} +9 -10
  129. adcp/types/generated_poc/{list_creatives_response.py → media_buy/list_creatives_response.py} +14 -15
  130. adcp/types/generated_poc/{package_request.py → media_buy/package_request.py} +7 -5
  131. adcp/types/generated_poc/{provide_performance_feedback_request.py → media_buy/provide_performance_feedback_request.py} +11 -17
  132. adcp/types/generated_poc/{provide_performance_feedback_response.py → media_buy/provide_performance_feedback_response.py} +10 -16
  133. adcp/types/generated_poc/{sync_creatives_request.py → media_buy/sync_creatives_request.py} +14 -15
  134. adcp/types/generated_poc/{sync_creatives_response.py → media_buy/sync_creatives_response.py} +11 -16
  135. adcp/types/generated_poc/{update_media_buy_request.py → media_buy/update_media_buy_request.py} +63 -28
  136. adcp/types/generated_poc/{update_media_buy_response.py → media_buy/update_media_buy_response.py} +11 -16
  137. adcp/types/generated_poc/pricing_options/__init__.py +3 -0
  138. adcp/types/generated_poc/{cpc_option.py → pricing_options/cpc_option.py} +2 -2
  139. adcp/types/generated_poc/{cpcv_option.py → pricing_options/cpcv_option.py} +2 -2
  140. adcp/types/generated_poc/{cpm_auction_option.py → pricing_options/cpm_auction_option.py} +2 -2
  141. adcp/types/generated_poc/{cpm_fixed_option.py → pricing_options/cpm_fixed_option.py} +2 -2
  142. adcp/types/generated_poc/{cpp_option.py → pricing_options/cpp_option.py} +2 -2
  143. adcp/types/generated_poc/{cpv_option.py → pricing_options/cpv_option.py} +2 -2
  144. adcp/types/generated_poc/{flat_rate_option.py → pricing_options/flat_rate_option.py} +2 -2
  145. adcp/types/generated_poc/{vcpm_auction_option.py → pricing_options/vcpm_auction_option.py} +2 -2
  146. adcp/types/generated_poc/{vcpm_fixed_option.py → pricing_options/vcpm_fixed_option.py} +2 -2
  147. adcp/types/generated_poc/protocols/__init__.py +3 -0
  148. adcp/types/generated_poc/protocols/adcp_extension.py +37 -0
  149. adcp/types/generated_poc/signals/__init__.py +3 -0
  150. adcp/types/generated_poc/{activate_signal_request.py → signals/activate_signal_request.py} +8 -10
  151. adcp/types/generated_poc/{activate_signal_response.py → signals/activate_signal_response.py} +10 -16
  152. adcp/types/generated_poc/{get_signals_request.py → signals/get_signals_request.py} +9 -10
  153. adcp/types/generated_poc/{get_signals_response.py → signals/get_signals_response.py} +9 -10
  154. adcp/utils/preview_cache.py +15 -3
  155. {adcp-2.11.1.dist-info → adcp-2.12.1.dist-info}/METADATA +1 -1
  156. adcp-2.12.1.dist-info/RECORD +176 -0
  157. adcp/types/generated_poc/format_id.py +0 -29
  158. adcp/types/generated_poc/image_asset.py +0 -23
  159. adcp/types/generated_poc/markdown_asset.py +0 -39
  160. adcp/types/generated_poc/package_status.py +0 -14
  161. adcp/types/generated_poc/product_filters.py +0 -36
  162. adcp/types/generated_poc/tasks_get_request.py +0 -29
  163. adcp/types/generated_poc/tasks_get_response.py +0 -112
  164. adcp/types/generated_poc/tasks_list_request.py +0 -115
  165. adcp/types/generated_poc/tasks_list_response.py +0 -122
  166. adcp-2.11.1.dist-info/RECORD +0 -166
  167. {adcp-2.11.1.dist-info → adcp-2.12.1.dist-info}/WHEEL +0 -0
  168. {adcp-2.11.1.dist-info → adcp-2.12.1.dist-info}/entry_points.txt +0 -0
  169. {adcp-2.11.1.dist-info → adcp-2.12.1.dist-info}/licenses/LICENSE +0 -0
  170. {adcp-2.11.1.dist-info → adcp-2.12.1.dist-info}/top_level.txt +0 -0
@@ -1,15 +1,35 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: adagents.json
3
- # timestamp: 2025-11-21T20:45:16+00:00
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
7
  from typing import Annotated, Literal
8
8
 
9
9
  from adcp.types.base import AdCPBaseModel
10
- from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field
10
+ from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field, RootModel
11
11
 
12
- from . import property, property_id, property_tag, publisher_property_selector
12
+ from .core import property, property_id, property_tag, publisher_property_selector
13
+
14
+
15
+ class AuthorizedSalesAgents1(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='forbid',
18
+ )
19
+ field_schema: Annotated[
20
+ str | None,
21
+ Field(alias='$schema', description='JSON Schema identifier for this adagents.json file'),
22
+ ] = 'https://adcontextprotocol.org/schemas/adagents.json'
23
+ authoritative_location: Annotated[
24
+ AnyUrl,
25
+ Field(
26
+ description='HTTPS URL of the authoritative adagents.json file. When present, this file is a reference and the authoritative location contains the actual agent authorization data.'
27
+ ),
28
+ ]
29
+ last_updated: Annotated[
30
+ AwareDatetime | None,
31
+ Field(description='ISO 8601 timestamp indicating when this reference was last updated'),
32
+ ] = None
13
33
 
14
34
 
15
35
  class Contact(AdCPBaseModel):
@@ -117,13 +137,15 @@ class AuthorizedAgents1(AdCPBaseModel):
117
137
  url: Annotated[AnyUrl, Field(description="The authorized agent's API endpoint URL")]
118
138
 
119
139
 
120
- class AuthorizedAgents2(AdCPBaseModel):
140
+ class AuthorizedAgents3(AdCPBaseModel):
121
141
  model_config = ConfigDict(
122
142
  extra='forbid',
123
143
  )
124
144
  authorization_type: Annotated[
125
- Literal['inline_properties'],
126
- Field(description='Discriminator indicating authorization by inline property definitions'),
145
+ Literal['publisher_properties'],
146
+ Field(
147
+ description='Discriminator indicating authorization for properties from other publisher domains'
148
+ ),
127
149
  ]
128
150
  authorized_for: Annotated[
129
151
  str,
@@ -133,25 +155,27 @@ class AuthorizedAgents2(AdCPBaseModel):
133
155
  min_length=1,
134
156
  ),
135
157
  ]
136
- properties: Annotated[
137
- list[property.Property],
158
+ publisher_properties: Annotated[
159
+ list[
160
+ publisher_property_selector.PublisherPropertySelector1
161
+ | publisher_property_selector.PublisherPropertySelector2
162
+ | publisher_property_selector.PublisherPropertySelector3
163
+ ],
138
164
  Field(
139
- description='Specific properties this agent is authorized for (alternative to property_ids/property_tags)',
165
+ description='Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell',
140
166
  min_length=1,
141
167
  ),
142
168
  ]
143
169
  url: Annotated[AnyUrl, Field(description="The authorized agent's API endpoint URL")]
144
170
 
145
171
 
146
- class AuthorizedAgents3(AdCPBaseModel):
172
+ class AuthorizedAgents2(AdCPBaseModel):
147
173
  model_config = ConfigDict(
148
174
  extra='forbid',
149
175
  )
150
176
  authorization_type: Annotated[
151
- Literal['publisher_properties'],
152
- Field(
153
- description='Discriminator indicating authorization for properties from other publisher domains'
154
- ),
177
+ Literal['inline_properties'],
178
+ Field(description='Discriminator indicating authorization by inline property definitions'),
155
179
  ]
156
180
  authorized_for: Annotated[
157
181
  str,
@@ -161,28 +185,24 @@ class AuthorizedAgents3(AdCPBaseModel):
161
185
  min_length=1,
162
186
  ),
163
187
  ]
164
- publisher_properties: Annotated[
165
- list[
166
- publisher_property_selector.PublisherPropertySelector1
167
- | publisher_property_selector.PublisherPropertySelector2
168
- | publisher_property_selector.PublisherPropertySelector3
169
- ],
188
+ properties: Annotated[
189
+ list[property.Property],
170
190
  Field(
171
- description='Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell',
191
+ description='Specific properties this agent is authorized for (alternative to property_ids/property_tags)',
172
192
  min_length=1,
173
193
  ),
174
194
  ]
175
195
  url: Annotated[AnyUrl, Field(description="The authorized agent's API endpoint URL")]
176
196
 
177
197
 
178
- class AuthorizedSalesAgents(AdCPBaseModel):
198
+ class AuthorizedSalesAgents2(AdCPBaseModel):
179
199
  model_config = ConfigDict(
180
200
  extra='forbid',
181
201
  )
182
202
  field_schema: Annotated[
183
203
  str | None,
184
204
  Field(alias='$schema', description='JSON Schema identifier for this adagents.json file'),
185
- ] = 'https://adcontextprotocol.org/schemas/v1/adagents.json'
205
+ ] = 'https://adcontextprotocol.org/schemas/adagents.json'
186
206
  authorized_agents: Annotated[
187
207
  list[AuthorizedAgents | AuthorizedAgents1 | AuthorizedAgents2 | AuthorizedAgents3],
188
208
  Field(
@@ -203,13 +223,189 @@ class AuthorizedSalesAgents(AdCPBaseModel):
203
223
  properties: Annotated[
204
224
  list[property.Property] | None,
205
225
  Field(
206
- description='Array of all properties covered by this adagents.json file. Same structure as list_authorized_properties response.',
226
+ description='Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.',
207
227
  min_length=1,
208
228
  ),
209
229
  ] = None
210
230
  tags: Annotated[
211
231
  dict[str, Tags] | None,
212
232
  Field(
213
- description='Metadata for each tag referenced by properties. Same structure as list_authorized_properties response.'
233
+ description='Metadata for each tag referenced by properties. Provides human-readable context for property tag values.'
214
234
  ),
215
235
  ] = None
236
+
237
+
238
+ class AuthorizedSalesAgents(RootModel[AuthorizedSalesAgents1 | AuthorizedSalesAgents2]):
239
+ root: Annotated[
240
+ AuthorizedSalesAgents1 | AuthorizedSalesAgents2,
241
+ Field(
242
+ description='Declaration of authorized sales agents for advertising inventory. Hosted at /.well-known/adagents.json on publisher domains. Can either contain the full structure inline or reference an authoritative URL.',
243
+ examples=[
244
+ {
245
+ '$schema': 'https://adcontextprotocol.org/schemas/adagents.json',
246
+ 'authoritative_location': 'https://cdn.example.com/adagents/v2/adagents.json',
247
+ 'last_updated': '2025-01-15T10:00:00Z',
248
+ },
249
+ {
250
+ '$schema': 'https://adcontextprotocol.org/schemas/adagents.json',
251
+ 'authorized_agents': [
252
+ {
253
+ 'authorization_type': 'property_tags',
254
+ 'authorized_for': 'Official sales agent',
255
+ 'property_tags': ['all'],
256
+ 'url': 'https://agent.example.com',
257
+ }
258
+ ],
259
+ 'last_updated': '2025-01-10T12:00:00Z',
260
+ 'properties': [
261
+ {
262
+ 'identifiers': [{'type': 'domain', 'value': 'example.com'}],
263
+ 'name': 'Example Site',
264
+ 'property_type': 'website',
265
+ 'publisher_domain': 'example.com',
266
+ }
267
+ ],
268
+ 'tags': {
269
+ 'all': {
270
+ 'description': 'All properties in this file',
271
+ 'name': 'All Properties',
272
+ }
273
+ },
274
+ },
275
+ {
276
+ '$schema': 'https://adcontextprotocol.org/schemas/adagents.json',
277
+ 'authorized_agents': [
278
+ {
279
+ 'authorization_type': 'property_tags',
280
+ 'authorized_for': 'All Meta properties',
281
+ 'property_tags': ['meta_network'],
282
+ 'url': 'https://meta-ads.com',
283
+ }
284
+ ],
285
+ 'contact': {
286
+ 'domain': 'meta.com',
287
+ 'email': 'adops@meta.com',
288
+ 'name': 'Meta Advertising Operations',
289
+ 'seller_id': 'pub-meta-12345',
290
+ 'tag_id': '12345',
291
+ },
292
+ 'last_updated': '2025-01-10T15:30:00Z',
293
+ 'properties': [
294
+ {
295
+ 'identifiers': [
296
+ {'type': 'ios_bundle', 'value': 'com.burbn.instagram'},
297
+ {'type': 'android_package', 'value': 'com.instagram.android'},
298
+ ],
299
+ 'name': 'Instagram',
300
+ 'property_type': 'mobile_app',
301
+ 'publisher_domain': 'instagram.com',
302
+ 'tags': ['meta_network', 'social_media'],
303
+ },
304
+ {
305
+ 'identifiers': [
306
+ {'type': 'ios_bundle', 'value': 'com.facebook.Facebook'},
307
+ {'type': 'android_package', 'value': 'com.facebook.katana'},
308
+ ],
309
+ 'name': 'Facebook',
310
+ 'property_type': 'mobile_app',
311
+ 'publisher_domain': 'facebook.com',
312
+ 'tags': ['meta_network', 'social_media'],
313
+ },
314
+ {
315
+ 'identifiers': [
316
+ {'type': 'ios_bundle', 'value': 'net.whatsapp.WhatsApp'},
317
+ {'type': 'android_package', 'value': 'com.whatsapp'},
318
+ ],
319
+ 'name': 'WhatsApp',
320
+ 'property_type': 'mobile_app',
321
+ 'publisher_domain': 'whatsapp.com',
322
+ 'tags': ['meta_network', 'messaging'],
323
+ },
324
+ ],
325
+ 'tags': {
326
+ 'messaging': {
327
+ 'description': 'Messaging and communication apps',
328
+ 'name': 'Messaging Apps',
329
+ },
330
+ 'meta_network': {
331
+ 'description': 'All Meta-owned properties',
332
+ 'name': 'Meta Network',
333
+ },
334
+ 'social_media': {
335
+ 'description': 'Social networking applications',
336
+ 'name': 'Social Media Apps',
337
+ },
338
+ },
339
+ },
340
+ {
341
+ '$schema': 'https://adcontextprotocol.org/schemas/adagents.json',
342
+ 'authorized_agents': [
343
+ {
344
+ 'authorization_type': 'property_tags',
345
+ 'authorized_for': 'Tumblr corporate properties only',
346
+ 'property_tags': ['corporate'],
347
+ 'url': 'https://tumblr-sales.com',
348
+ }
349
+ ],
350
+ 'contact': {'name': 'Tumblr Advertising'},
351
+ 'last_updated': '2025-01-10T16:00:00Z',
352
+ 'properties': [
353
+ {
354
+ 'identifiers': [{'type': 'domain', 'value': 'tumblr.com'}],
355
+ 'name': 'Tumblr Corporate',
356
+ 'property_type': 'website',
357
+ 'publisher_domain': 'tumblr.com',
358
+ 'tags': ['corporate'],
359
+ }
360
+ ],
361
+ 'tags': {
362
+ 'corporate': {
363
+ 'description': 'Tumblr-owned corporate properties (not user blogs)',
364
+ 'name': 'Corporate Properties',
365
+ }
366
+ },
367
+ },
368
+ {
369
+ '$schema': 'https://adcontextprotocol.org/schemas/adagents.json',
370
+ 'authorized_agents': [
371
+ {
372
+ 'authorization_type': 'publisher_properties',
373
+ 'authorized_for': 'CNN CTV properties via publisher authorization',
374
+ 'publisher_properties': [
375
+ {
376
+ 'property_ids': ['cnn_ctv_app'],
377
+ 'publisher_domain': 'cnn.com',
378
+ 'selection_type': 'by_id',
379
+ }
380
+ ],
381
+ 'url': 'https://agent.example/api',
382
+ },
383
+ {
384
+ 'authorization_type': 'publisher_properties',
385
+ 'authorized_for': 'All CTV properties from multiple publishers',
386
+ 'publisher_properties': [
387
+ {
388
+ 'property_tags': ['ctv'],
389
+ 'publisher_domain': 'cnn.com',
390
+ 'selection_type': 'by_tag',
391
+ },
392
+ {
393
+ 'property_tags': ['ctv'],
394
+ 'publisher_domain': 'espn.com',
395
+ 'selection_type': 'by_tag',
396
+ },
397
+ ],
398
+ 'url': 'https://agent.example/api',
399
+ },
400
+ ],
401
+ 'contact': {
402
+ 'domain': 'agent.example',
403
+ 'email': 'sales@agent.example',
404
+ 'name': 'Example Third-Party Sales Agent',
405
+ },
406
+ 'last_updated': '2025-01-10T17:00:00Z',
407
+ },
408
+ ],
409
+ title='Authorized Sales Agents',
410
+ ),
411
+ ]
@@ -0,0 +1,3 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: .schema_temp
3
+ # timestamp: 2025-11-22T15:23:24+00:00
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: activation-key.json
3
- # timestamp: 2025-11-18T03:35:10+00:00
2
+ # filename: core/activation_key.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -0,0 +1,3 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: .schema_temp
3
+ # timestamp: 2025-11-22T15:23:24+00:00
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: audio-asset.json
3
- # timestamp: 2025-11-18T03:35:10+00:00
2
+ # filename: core/assets/audio_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: css-asset.json
3
- # timestamp: 2025-11-18T03:35:10+00:00
2
+ # filename: core/assets/css_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: daast-asset.json
3
- # timestamp: 2025-11-21T12:49:05+00:00
2
+ # filename: core/assets/daast_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,8 +9,8 @@ from typing import Annotated, Literal
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import AnyUrl, ConfigDict, Field
11
11
 
12
- from . import daast_tracking_event
13
- from . import daast_version as daast_version_1
12
+ from ...enums import daast_tracking_event
13
+ from ...enums import daast_version as daast_version_1
14
14
 
15
15
 
16
16
  class DaastAsset1(AdCPBaseModel):
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: html-asset.json
3
- # timestamp: 2025-11-18T03:35:10+00:00
2
+ # filename: core/assets/html_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -0,0 +1,19 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/assets/image_asset.json
3
+ # timestamp: 2025-11-22T19:16:02+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from pydantic import AnyUrl, Field
10
+
11
+ from ..dimensions import Dimensions
12
+
13
+
14
+ class ImageAsset(Dimensions):
15
+ alt_text: Annotated[str | None, Field(description='Alternative text for accessibility')] = None
16
+ format: Annotated[
17
+ str | None, Field(description='Image file format (jpg, png, gif, webp, etc.)')
18
+ ] = None
19
+ url: Annotated[AnyUrl, Field(description='URL to the image asset')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: javascript-asset.json
3
- # timestamp: 2025-11-21T12:49:05+00:00
2
+ # filename: core/assets/javascript_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,7 +9,7 @@ from typing import Annotated
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import ConfigDict, Field
11
11
 
12
- from . import javascript_module_type
12
+ from ...enums import javascript_module_type
13
13
 
14
14
 
15
15
  class JavascriptAsset(AdCPBaseModel):
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: text-asset.json
3
- # timestamp: 2025-11-18T03:35:10+00:00
2
+ # filename: core/assets/text_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: url-asset.json
3
- # timestamp: 2025-11-21T12:49:05+00:00
2
+ # filename: core/assets/url_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,7 +9,7 @@ from typing import Annotated
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import AnyUrl, ConfigDict, Field
11
11
 
12
- from . import url_asset_type
12
+ from ...enums import url_asset_type
13
13
 
14
14
 
15
15
  class UrlAsset(AdCPBaseModel):
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: vast-asset.json
3
- # timestamp: 2025-11-21T12:49:05+00:00
2
+ # filename: core/assets/vast_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,8 +9,8 @@ from typing import Annotated, Literal
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import AnyUrl, ConfigDict, Field
11
11
 
12
- from . import vast_tracking_event
13
- from . import vast_version as vast_version_1
12
+ from ...enums import vast_tracking_event
13
+ from ...enums import vast_version as vast_version_1
14
14
 
15
15
 
16
16
  class VastAsset1(AdCPBaseModel):
@@ -1,28 +1,24 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: video-asset.json
3
- # timestamp: 2025-11-18T03:35:10+00:00
2
+ # filename: core/assets/video_asset.json
3
+ # timestamp: 2025-11-22T19:16:02+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
7
  from typing import Annotated
8
8
 
9
- from adcp.types.base import AdCPBaseModel
10
- from pydantic import AnyUrl, ConfigDict, Field
9
+ from pydantic import AnyUrl, Field
11
10
 
11
+ from ..dimensions import Dimensions
12
12
 
13
- class VideoAsset(AdCPBaseModel):
14
- model_config = ConfigDict(
15
- extra='forbid',
16
- )
13
+
14
+ class VideoAsset(Dimensions):
17
15
  bitrate_kbps: Annotated[
18
16
  int | None, Field(description='Video bitrate in kilobits per second', ge=1)
19
17
  ] = None
20
18
  duration_ms: Annotated[
21
- int | None, Field(description='Video duration in milliseconds', ge=0)
19
+ int | None, Field(description='Video duration in milliseconds', ge=1)
22
20
  ] = None
23
21
  format: Annotated[str | None, Field(description='Video file format (mp4, webm, mov, etc.)')] = (
24
22
  None
25
23
  )
26
- height: Annotated[int | None, Field(description='Video height in pixels', ge=1)] = None
27
24
  url: Annotated[AnyUrl, Field(description='URL to the video asset')]
28
- width: Annotated[int | None, Field(description='Video width in pixels', ge=1)] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: webhook-asset.json
3
- # timestamp: 2025-11-21T12:49:05+00:00
2
+ # filename: core/assets/webhook_asset.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,7 +9,7 @@ from typing import Annotated
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import AnyUrl, ConfigDict, Field
11
11
 
12
- from . import http_method, webhook_response_type, webhook_security_method
12
+ from ...enums import http_method, webhook_response_type, webhook_security_method
13
13
 
14
14
 
15
15
  class Security(AdCPBaseModel):
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: brand-manifest.json
3
- # timestamp: 2025-11-20T11:58:34+00:00
2
+ # filename: core/brand_manifest.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -10,7 +10,7 @@ from typing import Annotated, Any
10
10
  from adcp.types.base import AdCPBaseModel
11
11
  from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field
12
12
 
13
- from . import asset_content_type
13
+ from ..enums import asset_content_type
14
14
 
15
15
 
16
16
  class Asset(AdCPBaseModel):
@@ -0,0 +1,15 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/context.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from adcp.types.base import AdCPBaseModel
8
+ from pydantic import ConfigDict
9
+
10
+
11
+ class ContextObject(AdCPBaseModel):
12
+ pass
13
+ model_config = ConfigDict(
14
+ extra='allow',
15
+ )
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: creative-asset.json
3
- # timestamp: 2025-11-18T03:35:10+00:00
2
+ # filename: core/creative_asset.json
3
+ # timestamp: 2025-11-22T19:54:03+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,13 +9,15 @@ from typing import Annotated
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import ConfigDict, Field
11
11
 
12
- from . import audio_asset, css_asset, daast_asset
13
12
  from . import format_id as format_id_1
14
- from . import (
13
+ from . import promoted_offerings
14
+ from .assets import (
15
+ audio_asset,
16
+ css_asset,
17
+ daast_asset,
15
18
  html_asset,
16
19
  image_asset,
17
20
  javascript_asset,
18
- promoted_offerings,
19
21
  text_asset,
20
22
  url_asset,
21
23
  vast_asset,
@@ -69,7 +71,9 @@ class CreativeAsset(AdCPBaseModel):
69
71
  creative_id: Annotated[str, Field(description='Unique identifier for the creative')]
70
72
  format_id: Annotated[
71
73
  format_id_1.FormatId,
72
- Field(description='Format identifier specifying which format this creative conforms to'),
74
+ Field(
75
+ 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.'
76
+ ),
73
77
  ]
74
78
  inputs: Annotated[
75
79
  list[Input] | None,
@@ -78,6 +82,21 @@ class CreativeAsset(AdCPBaseModel):
78
82
  ),
79
83
  ] = None
80
84
  name: Annotated[str, Field(description='Human-readable creative name')]
85
+ placement_ids: Annotated[
86
+ list[str] | None,
87
+ Field(
88
+ description="Optional array of placement IDs where this creative should run when uploading via create_media_buy or update_media_buy. References placement_id values from the product's placements array. If omitted, creative runs on all placements. Only used during upload to media buy - not stored in creative library.",
89
+ min_length=1,
90
+ ),
91
+ ] = None
81
92
  tags: Annotated[
82
93
  list[str] | None, Field(description='User-defined tags for organization and searchability')
83
94
  ] = None
95
+ weight: Annotated[
96
+ float | None,
97
+ Field(
98
+ 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.',
99
+ ge=0.0,
100
+ le=100.0,
101
+ ),
102
+ ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: creative-assignment.json
3
- # timestamp: 2025-11-18T03:35:10+00:00
2
+ # filename: core/creative_assignment.json
3
+ # timestamp: 2025-11-22T15:23:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6