adcp 2.18.0__py3-none-any.whl → 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +6 -14
  3. adcp/__main__.py +94 -51
  4. adcp/adagents.py +91 -19
  5. adcp/client.py +865 -0
  6. adcp/protocols/a2a.py +84 -0
  7. adcp/protocols/base.py +101 -0
  8. adcp/protocols/mcp.py +87 -1
  9. adcp/server/__init__.py +49 -0
  10. adcp/server/base.py +368 -0
  11. adcp/server/content_standards.py +561 -0
  12. adcp/server/governance.py +491 -0
  13. adcp/server/mcp_tools.py +471 -0
  14. adcp/server/proposal.py +334 -0
  15. adcp/server/sponsored_intelligence.py +444 -0
  16. adcp/types/__init__.py +111 -23
  17. adcp/types/_ergonomic.py +35 -18
  18. adcp/types/_generated.py +419 -44
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +103 -6
  22. adcp/types/generated_poc/content_standards/__init__.py +3 -0
  23. adcp/types/generated_poc/content_standards/artifact.py +208 -0
  24. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  25. adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  26. adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  27. adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  28. adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  29. adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  30. adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  31. adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  32. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  33. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  34. adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  35. adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  36. adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  37. adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  38. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  39. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  40. adcp/types/generated_poc/core/activation_key.py +1 -1
  41. adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
  42. adcp/types/generated_poc/core/assets/css_asset.py +1 -1
  43. adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
  44. adcp/types/generated_poc/core/assets/html_asset.py +1 -1
  45. adcp/types/generated_poc/core/assets/image_asset.py +1 -1
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
  47. adcp/types/generated_poc/core/assets/text_asset.py +1 -1
  48. adcp/types/generated_poc/core/assets/url_asset.py +1 -1
  49. adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
  50. adcp/types/generated_poc/core/assets/video_asset.py +1 -1
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
  52. adcp/types/generated_poc/core/async_response_data.py +1 -1
  53. adcp/types/generated_poc/core/brand_manifest.py +68 -5
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
  55. adcp/types/generated_poc/core/context.py +1 -1
  56. adcp/types/generated_poc/core/creative_asset.py +8 -7
  57. adcp/types/generated_poc/core/creative_assignment.py +1 -1
  58. adcp/types/generated_poc/core/creative_filters.py +4 -14
  59. adcp/types/generated_poc/core/creative_manifest.py +1 -1
  60. adcp/types/generated_poc/core/creative_policy.py +1 -1
  61. adcp/types/generated_poc/core/delivery_metrics.py +1 -1
  62. adcp/types/generated_poc/core/deployment.py +1 -1
  63. adcp/types/generated_poc/core/destination.py +1 -1
  64. adcp/types/generated_poc/core/error.py +1 -1
  65. adcp/types/generated_poc/core/ext.py +1 -1
  66. adcp/types/generated_poc/core/format.py +6 -5
  67. adcp/types/generated_poc/core/format_id.py +1 -1
  68. adcp/types/generated_poc/core/frequency_cap.py +1 -1
  69. adcp/types/generated_poc/core/identifier.py +27 -0
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
  71. adcp/types/generated_poc/core/measurement.py +1 -1
  72. adcp/types/generated_poc/core/media_buy.py +1 -1
  73. adcp/types/generated_poc/core/media_buy_features.py +29 -0
  74. adcp/types/generated_poc/core/offering.py +80 -0
  75. adcp/types/generated_poc/core/package.py +1 -1
  76. adcp/types/generated_poc/core/performance_feedback.py +1 -1
  77. adcp/types/generated_poc/core/placement.py +1 -1
  78. adcp/types/generated_poc/core/pricing_option.py +8 -14
  79. adcp/types/generated_poc/core/product.py +1 -1
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +72 -7
  82. adcp/types/generated_poc/core/promoted_offerings.py +12 -21
  83. adcp/types/generated_poc/core/promoted_products.py +1 -1
  84. adcp/types/generated_poc/core/property.py +1 -1
  85. adcp/types/generated_poc/core/property_id.py +1 -1
  86. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  87. adcp/types/generated_poc/core/property_tag.py +1 -1
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +1 -1
  90. adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
  91. adcp/types/generated_poc/core/push_notification_config.py +1 -1
  92. adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +1 -1
  95. adcp/types/generated_poc/core/signal_filters.py +1 -1
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +1 -1
  98. adcp/types/generated_poc/core/targeting.py +55 -14
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
  101. adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
  102. adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
  103. adcp/types/generated_poc/creative/preview_render.py +1 -1
  104. adcp/types/generated_poc/enums/adcp_domain.py +3 -1
  105. adcp/types/generated_poc/enums/asset_content_type.py +1 -1
  106. adcp/types/generated_poc/enums/auth_scheme.py +1 -1
  107. adcp/types/generated_poc/enums/available_metric.py +1 -1
  108. adcp/types/generated_poc/enums/channels.py +18 -8
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
  110. adcp/types/generated_poc/enums/creative_action.py +1 -1
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
  112. adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
  113. adcp/types/generated_poc/enums/creative_status.py +2 -1
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
  115. adcp/types/generated_poc/enums/daast_version.py +1 -1
  116. adcp/types/generated_poc/enums/delivery_type.py +1 -1
  117. adcp/types/generated_poc/enums/dimension_unit.py +1 -1
  118. adcp/types/generated_poc/enums/feed_format.py +1 -1
  119. adcp/types/generated_poc/enums/feedback_source.py +1 -1
  120. adcp/types/generated_poc/enums/format_category.py +1 -1
  121. adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +1 -1
  125. adcp/types/generated_poc/enums/http_method.py +1 -1
  126. adcp/types/generated_poc/enums/identifier_types.py +1 -1
  127. adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
  129. adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
  130. adcp/types/generated_poc/enums/media_buy_status.py +1 -1
  131. adcp/types/generated_poc/enums/metric_type.py +1 -1
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +1 -1
  134. adcp/types/generated_poc/enums/pacing.py +1 -1
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +1 -1
  137. adcp/types/generated_poc/enums/pricing_model.py +1 -1
  138. adcp/types/generated_poc/enums/property_type.py +2 -1
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
  140. adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
  142. adcp/types/generated_poc/enums/sort_direction.py +1 -1
  143. adcp/types/generated_poc/enums/task_status.py +1 -1
  144. adcp/types/generated_poc/enums/task_type.py +7 -1
  145. adcp/types/generated_poc/enums/update_frequency.py +1 -1
  146. adcp/types/generated_poc/enums/url_asset_type.py +1 -1
  147. adcp/types/generated_poc/enums/validation_mode.py +1 -1
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
  149. adcp/types/generated_poc/enums/vast_version.py +1 -1
  150. adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
  151. adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
  152. adcp/types/generated_poc/extensions/__init__.py +3 -0
  153. adcp/types/generated_poc/extensions/extension_meta.py +58 -0
  154. adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
  155. adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  158. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +1 -1
  159. adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
  160. adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
  162. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
  163. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
  164. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
  165. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
  166. adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
  167. adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
  169. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
  170. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
  171. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
  172. adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
  173. adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
  174. adcp/types/generated_poc/media_buy/package_request.py +15 -6
  175. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
  182. adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
  187. adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
  188. adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
  189. adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
  190. adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
  191. adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
  192. adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
  193. adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
  194. adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
  195. adcp/types/generated_poc/property/__init__.py +3 -0
  196. adcp/types/generated_poc/property/base_property_source.py +86 -0
  197. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  198. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  199. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  200. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  201. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  202. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  203. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  204. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  205. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  206. adcp/types/generated_poc/property/property_error.py +33 -0
  207. adcp/types/generated_poc/property/property_feature.py +22 -0
  208. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  209. adcp/types/generated_poc/property/property_list.py +62 -0
  210. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  211. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  212. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  213. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  214. adcp/types/generated_poc/protocol/__init__.py +3 -0
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  217. adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
  218. adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
  219. adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
  220. adcp/types/generated_poc/signals/get_signals_request.py +1 -1
  221. adcp/types/generated_poc/signals/get_signals_response.py +1 -1
  222. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  232. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  233. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  234. adcp/utils/format_assets.py +5 -5
  235. adcp/utils/preview_cache.py +2 -2
  236. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  237. adcp-3.0.0.dist-info/RECORD +264 -0
  238. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  239. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  240. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp-2.18.0.dist-info/RECORD +0 -195
  243. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  244. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  245. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/package_request.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -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 ..core import creative_asset
12
+ from ..core import creative_asset, creative_assignment
13
13
  from ..core import ext as ext_1
14
14
  from ..core import format_id, targeting
15
15
  from ..enums import pacing as pacing_1
@@ -31,16 +31,16 @@ class PackageRequest(AdCPBaseModel):
31
31
  Field(description="Budget allocation for this package in the media buy's currency", ge=0.0),
32
32
  ]
33
33
  buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for this package")]
34
- creative_ids: Annotated[
35
- list[str] | None,
34
+ creative_assignments: Annotated[
35
+ list[creative_assignment.CreativeAssignment] | None,
36
36
  Field(
37
- description='Creative IDs to assign to this package at creation time (references existing library creatives)'
37
+ description='Assign existing library creatives to this package with optional weights and placement targeting'
38
38
  ),
39
39
  ] = None
40
40
  creatives: Annotated[
41
41
  list[creative_asset.CreativeAsset] | None,
42
42
  Field(
43
- description='Full creative objects to upload and assign to this package at creation time (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.',
43
+ description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
44
44
  max_length=100,
45
45
  ),
46
46
  ] = None
@@ -52,7 +52,16 @@ class PackageRequest(AdCPBaseModel):
52
52
  min_length=1,
53
53
  ),
54
54
  ] = None
55
+ impressions: Annotated[
56
+ float | None, Field(description='Impression goal for this package', ge=0.0)
57
+ ] = None
55
58
  pacing: pacing_1.Pacing | None = None
59
+ paused: Annotated[
60
+ bool | None,
61
+ Field(
62
+ description='Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false.'
63
+ ),
64
+ ] = False
56
65
  pricing_option_id: Annotated[
57
66
  str,
58
67
  Field(
@@ -0,0 +1,119 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/package_update.json
3
+ # timestamp: 2026-01-25T21:17:54+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, RootModel
11
+
12
+ from ..core import creative_asset, creative_assignment
13
+ from ..core import ext as ext_1
14
+ from ..core import targeting
15
+ from ..enums import pacing as pacing_1
16
+
17
+
18
+ class PackageUpdate1(AdCPBaseModel):
19
+ model_config = ConfigDict(
20
+ extra='allow',
21
+ )
22
+ bid_price: Annotated[
23
+ float | None,
24
+ Field(
25
+ description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
26
+ ge=0.0,
27
+ ),
28
+ ] = None
29
+ budget: Annotated[
30
+ float | None,
31
+ Field(
32
+ description='Updated budget allocation for this package in the currency specified by the pricing option',
33
+ ge=0.0,
34
+ ),
35
+ ] = None
36
+ buyer_ref: Annotated[
37
+ str | None, Field(description="Buyer's reference for the package to update")
38
+ ] = None
39
+ creative_assignments: Annotated[
40
+ list[creative_assignment.CreativeAssignment] | None,
41
+ Field(
42
+ description='Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.'
43
+ ),
44
+ ] = None
45
+ creatives: Annotated[
46
+ list[creative_asset.CreativeAsset] | None,
47
+ Field(
48
+ description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
49
+ max_length=100,
50
+ ),
51
+ ] = None
52
+ ext: ext_1.ExtensionObject | None = None
53
+ impressions: Annotated[
54
+ float | None, Field(description='Updated impression goal for this package', ge=0.0)
55
+ ] = None
56
+ pacing: pacing_1.Pacing | None = None
57
+ package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
58
+ paused: Annotated[
59
+ bool | None,
60
+ Field(description='Pause/resume specific package (true = paused, false = active)'),
61
+ ] = None
62
+ targeting_overlay: targeting.TargetingOverlay | None = None
63
+
64
+
65
+ class PackageUpdate2(AdCPBaseModel):
66
+ model_config = ConfigDict(
67
+ extra='allow',
68
+ )
69
+ bid_price: Annotated[
70
+ float | None,
71
+ Field(
72
+ description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
73
+ ge=0.0,
74
+ ),
75
+ ] = None
76
+ budget: Annotated[
77
+ float | None,
78
+ Field(
79
+ description='Updated budget allocation for this package in the currency specified by the pricing option',
80
+ ge=0.0,
81
+ ),
82
+ ] = None
83
+ buyer_ref: Annotated[str, Field(description="Buyer's reference for the package to update")]
84
+ creative_assignments: Annotated[
85
+ list[creative_assignment.CreativeAssignment] | None,
86
+ Field(
87
+ description='Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.'
88
+ ),
89
+ ] = None
90
+ creatives: Annotated[
91
+ list[creative_asset.CreativeAsset] | None,
92
+ Field(
93
+ description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
94
+ max_length=100,
95
+ ),
96
+ ] = None
97
+ ext: ext_1.ExtensionObject | None = None
98
+ impressions: Annotated[
99
+ float | None, Field(description='Updated impression goal for this package', ge=0.0)
100
+ ] = None
101
+ pacing: pacing_1.Pacing | None = None
102
+ package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
103
+ None
104
+ )
105
+ paused: Annotated[
106
+ bool | None,
107
+ Field(description='Pause/resume specific package (true = paused, false = active)'),
108
+ ] = None
109
+ targeting_overlay: targeting.TargetingOverlay | None = None
110
+
111
+
112
+ class PackageUpdate(RootModel[PackageUpdate1 | PackageUpdate2]):
113
+ root: Annotated[
114
+ PackageUpdate1 | PackageUpdate2,
115
+ Field(
116
+ description='Package update configuration for update_media_buy. Identifies package by package_id or buyer_ref and specifies fields to modify. Fields not present are left unchanged. Note: product_id, format_ids, and pricing_option_id cannot be changed after creation.',
117
+ title='Package Update',
118
+ ),
119
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/provide_performance_feedback_request.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/provide_performance_feedback_response.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_async_response_input_required.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_async_response_submitted.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_async_response_working.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_request.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_response.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_async_response_input_required.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_async_response_submitted.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_async_response_working.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_request.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -10,105 +10,11 @@ from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import AwareDatetime, ConfigDict, Field, RootModel
11
11
 
12
12
  from ..core import context as context_1
13
- from ..core import creative_asset, creative_assignment
14
13
  from ..core import ext as ext_1
15
14
  from ..core import push_notification_config as push_notification_config_1
16
- from ..core import start_timing, targeting
17
- from ..enums import pacing as pacing_1
18
-
19
-
20
- class Packages(AdCPBaseModel):
21
- model_config = ConfigDict(
22
- extra='allow',
23
- )
24
- bid_price: Annotated[
25
- float | None,
26
- Field(
27
- description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
28
- ge=0.0,
29
- ),
30
- ] = None
31
- budget: Annotated[
32
- float | None,
33
- Field(
34
- description='Updated budget allocation for this package in the currency specified by the pricing option',
35
- ge=0.0,
36
- ),
37
- ] = None
38
- buyer_ref: Annotated[
39
- str | None, Field(description="Buyer's reference for the package to update")
40
- ] = None
41
- creative_assignments: Annotated[
42
- list[creative_assignment.CreativeAssignment] | None,
43
- Field(
44
- description='Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids.'
45
- ),
46
- ] = None
47
- creative_ids: Annotated[
48
- list[str] | None,
49
- Field(description='Update creative assignments (references existing library creatives)'),
50
- ] = None
51
- creatives: Annotated[
52
- list[creative_asset.CreativeAsset] | None,
53
- Field(
54
- description='Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.',
55
- max_length=100,
56
- ),
57
- ] = None
58
- pacing: pacing_1.Pacing | None = None
59
- package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
60
- paused: Annotated[
61
- bool | None,
62
- Field(description='Pause/resume specific package (true = paused, false = active)'),
63
- ] = None
64
- targeting_overlay: targeting.TargetingOverlay | None = None
65
-
66
-
67
- class Packages1(AdCPBaseModel):
68
- model_config = ConfigDict(
69
- extra='allow',
70
- )
71
- bid_price: Annotated[
72
- float | None,
73
- Field(
74
- description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
75
- ge=0.0,
76
- ),
77
- ] = None
78
- budget: Annotated[
79
- float | None,
80
- Field(
81
- description='Updated budget allocation for this package in the currency specified by the pricing option',
82
- ge=0.0,
83
- ),
84
- ] = None
85
- buyer_ref: Annotated[str, Field(description="Buyer's reference for the package to update")]
86
- creative_assignments: Annotated[
87
- list[creative_assignment.CreativeAssignment] | None,
88
- Field(
89
- description='Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids.'
90
- ),
91
- ] = None
92
- creative_ids: Annotated[
93
- list[str] | None,
94
- Field(description='Update creative assignments (references existing library creatives)'),
95
- ] = None
96
- creatives: Annotated[
97
- list[creative_asset.CreativeAsset] | None,
98
- Field(
99
- description='Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.',
100
- max_length=100,
101
- ),
102
- ] = None
103
- pacing: pacing_1.Pacing | None = None
104
- package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
105
- None
106
- )
107
- paused: Annotated[
108
- bool | None,
109
- Field(description='Pause/resume specific package (true = paused, false = active)'),
110
- ] = None
111
- targeting_overlay: targeting.TargetingOverlay | None = None
15
+ from ..core import reporting_webhook as reporting_webhook_1
16
+ from ..core import start_timing
17
+ from . import package_update
112
18
 
113
19
 
114
20
  class UpdateMediaBuyRequest1(AdCPBaseModel):
@@ -125,7 +31,7 @@ class UpdateMediaBuyRequest1(AdCPBaseModel):
125
31
  ext: ext_1.ExtensionObject | None = None
126
32
  media_buy_id: Annotated[str, Field(description="Publisher's ID of the media buy to update")]
127
33
  packages: Annotated[
128
- list[Packages | Packages1] | None, Field(description='Package-specific updates')
34
+ list[package_update.PackageUpdate] | None, Field(description='Package-specific updates')
129
35
  ] = None
130
36
  paused: Annotated[
131
37
  bool | None,
@@ -134,18 +40,18 @@ class UpdateMediaBuyRequest1(AdCPBaseModel):
134
40
  push_notification_config: Annotated[
135
41
  push_notification_config_1.PushNotificationConfig | None,
136
42
  Field(
137
- description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.'
43
+ description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time. This is separate from reporting_webhook which configures ongoing campaign reporting.'
44
+ ),
45
+ ] = None
46
+ reporting_webhook: Annotated[
47
+ reporting_webhook_1.ReportingWebhook | None,
48
+ Field(
49
+ description='Optional webhook configuration for automated reporting delivery. Updates the reporting configuration for this media buy.'
138
50
  ),
139
51
  ] = None
140
52
  start_time: start_timing.StartTiming | None = None
141
53
 
142
54
 
143
- Packages2 = Packages
144
-
145
-
146
- Packages3 = Packages1
147
-
148
-
149
55
  class UpdateMediaBuyRequest2(AdCPBaseModel):
150
56
  model_config = ConfigDict(
151
57
  extra='allow',
@@ -160,7 +66,7 @@ class UpdateMediaBuyRequest2(AdCPBaseModel):
160
66
  str | None, Field(description="Publisher's ID of the media buy to update")
161
67
  ] = None
162
68
  packages: Annotated[
163
- list[Packages2 | Packages3] | None, Field(description='Package-specific updates')
69
+ list[package_update.PackageUpdate] | None, Field(description='Package-specific updates')
164
70
  ] = None
165
71
  paused: Annotated[
166
72
  bool | None,
@@ -169,7 +75,13 @@ class UpdateMediaBuyRequest2(AdCPBaseModel):
169
75
  push_notification_config: Annotated[
170
76
  push_notification_config_1.PushNotificationConfig | None,
171
77
  Field(
172
- description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.'
78
+ description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time. This is separate from reporting_webhook which configures ongoing campaign reporting.'
79
+ ),
80
+ ] = None
81
+ reporting_webhook: Annotated[
82
+ reporting_webhook_1.ReportingWebhook | None,
83
+ Field(
84
+ description='Optional webhook configuration for automated reporting delivery. Updates the reporting configuration for this media buy.'
173
85
  ),
174
86
  ] = None
175
87
  start_time: start_timing.StartTiming | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_response.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpc_option.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-26T11:40:01+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -10,6 +10,19 @@ from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import ConfigDict, Field
11
11
 
12
12
 
13
+ class PriceGuidance(AdCPBaseModel):
14
+ p25: Annotated[
15
+ float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
16
+ ] = None
17
+ p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
18
+ p75: Annotated[
19
+ float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
20
+ ] = None
21
+ p90: Annotated[
22
+ float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
23
+ ] = None
24
+
25
+
13
26
  class CpcPricingOption(AdCPBaseModel):
14
27
  model_config = ConfigDict(
15
28
  extra='allow',
@@ -22,10 +35,20 @@ class CpcPricingOption(AdCPBaseModel):
22
35
  pattern='^[A-Z]{3}$',
23
36
  ),
24
37
  ]
25
- is_fixed: Annotated[
26
- Literal[True],
27
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
28
- ]
38
+ fixed_price: Annotated[
39
+ float | None,
40
+ Field(
41
+ description='Fixed price per click. If present, this is fixed pricing. If absent, auction-based.',
42
+ ge=0.0,
43
+ ),
44
+ ] = None
45
+ floor_price: Annotated[
46
+ float | None,
47
+ Field(
48
+ description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
49
+ ge=0.0,
50
+ ),
51
+ ] = None
29
52
  min_spend_per_package: Annotated[
30
53
  float | None,
31
54
  Field(
@@ -33,11 +56,13 @@ class CpcPricingOption(AdCPBaseModel):
33
56
  ge=0.0,
34
57
  ),
35
58
  ] = None
36
- pricing_model: Annotated[Literal['cpc'], Field(description='Cost per click')]
37
- pricing_option_id: Annotated[
38
- str,
59
+ price_guidance: Annotated[
60
+ PriceGuidance | None,
39
61
  Field(
40
- description="Unique identifier for this pricing option within the product (e.g., 'cpc_usd_fixed')"
62
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
41
63
  ),
64
+ ] = None
65
+ pricing_model: Annotated[Literal['cpc'], Field(description='Cost per click')]
66
+ pricing_option_id: Annotated[
67
+ str, Field(description='Unique identifier for this pricing option within the product')
42
68
  ]
43
- rate: Annotated[float, Field(description='Fixed CPC rate (cost per click)', ge=0.0)]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpcv_option.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-26T11:40:01+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -10,6 +10,19 @@ from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import ConfigDict, Field
11
11
 
12
12
 
13
+ class PriceGuidance(AdCPBaseModel):
14
+ p25: Annotated[
15
+ float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
16
+ ] = None
17
+ p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
18
+ p75: Annotated[
19
+ float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
20
+ ] = None
21
+ p90: Annotated[
22
+ float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
23
+ ] = None
24
+
25
+
13
26
  class CpcvPricingOption(AdCPBaseModel):
14
27
  model_config = ConfigDict(
15
28
  extra='allow',
@@ -22,10 +35,20 @@ class CpcvPricingOption(AdCPBaseModel):
22
35
  pattern='^[A-Z]{3}$',
23
36
  ),
24
37
  ]
25
- is_fixed: Annotated[
26
- Literal[True],
27
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
28
- ]
38
+ fixed_price: Annotated[
39
+ float | None,
40
+ Field(
41
+ description='Fixed price per completed view. If present, this is fixed pricing. If absent, auction-based.',
42
+ ge=0.0,
43
+ ),
44
+ ] = None
45
+ floor_price: Annotated[
46
+ float | None,
47
+ Field(
48
+ description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
49
+ ge=0.0,
50
+ ),
51
+ ] = None
29
52
  min_spend_per_package: Annotated[
30
53
  float | None,
31
54
  Field(
@@ -33,13 +56,15 @@ class CpcvPricingOption(AdCPBaseModel):
33
56
  ge=0.0,
34
57
  ),
35
58
  ] = None
59
+ price_guidance: Annotated[
60
+ PriceGuidance | None,
61
+ Field(
62
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
63
+ ),
64
+ ] = None
36
65
  pricing_model: Annotated[
37
66
  Literal['cpcv'], Field(description='Cost per completed view (100% completion)')
38
67
  ]
39
68
  pricing_option_id: Annotated[
40
- str,
41
- Field(
42
- description="Unique identifier for this pricing option within the product (e.g., 'cpcv_usd_guaranteed')"
43
- ),
69
+ str, Field(description='Unique identifier for this pricing option within the product')
44
70
  ]
45
- rate: Annotated[float, Field(description='Fixed CPCV rate (cost per 100% completion)', ge=0.0)]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: pricing_options/cpm_auction_option.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
2
+ # filename: pricing_options/cpm_option.json
3
+ # timestamp: 2026-01-26T11:40:01+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -11,19 +11,13 @@ from pydantic import ConfigDict, Field
11
11
 
12
12
 
13
13
  class PriceGuidance(AdCPBaseModel):
14
- floor: Annotated[
15
- float,
16
- Field(
17
- description='Minimum bid price - publisher will reject bids under this value', ge=0.0
18
- ),
19
- ]
20
14
  p25: Annotated[float | None, Field(description='25th percentile winning price', ge=0.0)] = None
21
15
  p50: Annotated[float | None, Field(description='Median winning price', ge=0.0)] = None
22
16
  p75: Annotated[float | None, Field(description='75th percentile winning price', ge=0.0)] = None
23
17
  p90: Annotated[float | None, Field(description='90th percentile winning price', ge=0.0)] = None
24
18
 
25
19
 
26
- class CpmAuctionPricingOption(AdCPBaseModel):
20
+ class CpmPricingOption(AdCPBaseModel):
27
21
  model_config = ConfigDict(
28
22
  extra='allow',
29
23
  )
@@ -35,10 +29,20 @@ class CpmAuctionPricingOption(AdCPBaseModel):
35
29
  pattern='^[A-Z]{3}$',
36
30
  ),
37
31
  ]
38
- is_fixed: Annotated[
39
- Literal[False],
40
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
41
- ]
32
+ fixed_price: Annotated[
33
+ float | None,
34
+ Field(
35
+ description='Fixed price per unit. If present, this is fixed pricing. If absent, auction-based.',
36
+ ge=0.0,
37
+ ),
38
+ ] = None
39
+ floor_price: Annotated[
40
+ float | None,
41
+ Field(
42
+ description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
43
+ ge=0.0,
44
+ ),
45
+ ] = None
42
46
  min_spend_per_package: Annotated[
43
47
  float | None,
44
48
  Field(
@@ -47,12 +51,12 @@ class CpmAuctionPricingOption(AdCPBaseModel):
47
51
  ),
48
52
  ] = None
49
53
  price_guidance: Annotated[
50
- PriceGuidance, Field(description='Pricing guidance for auction-based CPM bidding')
51
- ]
52
- pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
53
- pricing_option_id: Annotated[
54
- str,
54
+ PriceGuidance | None,
55
55
  Field(
56
- description="Unique identifier for this pricing option within the product (e.g., 'cpm_usd_auction')"
56
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
57
57
  ),
58
+ ] = None
59
+ pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
60
+ pricing_option_id: Annotated[
61
+ str, Field(description='Unique identifier for this pricing option within the product')
58
62
  ]