adcp 2.19.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 (247) 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 +84 -0
  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 -14
  18. adcp/types/_generated.py +346 -52
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +196 -189
  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 +9 -9
  41. adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  42. adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  43. adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
  44. adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  45. adcp/types/generated_poc/core/assets/image_asset.py +7 -7
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  47. adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  48. adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  49. adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
  50. adcp/types/generated_poc/core/assets/video_asset.py +8 -8
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  52. adcp/types/generated_poc/core/async_response_data.py +3 -3
  53. adcp/types/generated_poc/core/brand_manifest.py +122 -59
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +10 -10
  55. adcp/types/generated_poc/core/context.py +2 -2
  56. adcp/types/generated_poc/core/creative_asset.py +20 -19
  57. adcp/types/generated_poc/core/creative_assignment.py +4 -4
  58. adcp/types/generated_poc/core/creative_filters.py +18 -28
  59. adcp/types/generated_poc/core/creative_manifest.py +3 -3
  60. adcp/types/generated_poc/core/creative_policy.py +5 -5
  61. adcp/types/generated_poc/core/delivery_metrics.py +33 -33
  62. adcp/types/generated_poc/core/deployment.py +21 -21
  63. adcp/types/generated_poc/core/destination.py +12 -12
  64. adcp/types/generated_poc/core/error.py +7 -7
  65. adcp/types/generated_poc/core/ext.py +2 -2
  66. adcp/types/generated_poc/core/format.py +66 -66
  67. adcp/types/generated_poc/core/format_id.py +6 -6
  68. adcp/types/generated_poc/core/frequency_cap.py +3 -3
  69. adcp/types/generated_poc/core/identifier.py +3 -3
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
  71. adcp/types/generated_poc/core/measurement.py +9 -9
  72. adcp/types/generated_poc/core/media_buy.py +8 -8
  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 +9 -9
  76. adcp/types/generated_poc/core/performance_feedback.py +19 -19
  77. adcp/types/generated_poc/core/placement.py +5 -5
  78. adcp/types/generated_poc/core/pricing_option.py +9 -15
  79. adcp/types/generated_poc/core/product.py +21 -21
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +89 -24
  82. adcp/types/generated_poc/core/promoted_offerings.py +29 -38
  83. adcp/types/generated_poc/core/promoted_products.py +3 -3
  84. adcp/types/generated_poc/core/property.py +10 -10
  85. adcp/types/generated_poc/core/property_id.py +5 -5
  86. adcp/types/generated_poc/core/property_list_ref.py +5 -5
  87. adcp/types/generated_poc/core/property_tag.py +5 -5
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  90. adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  91. adcp/types/generated_poc/core/push_notification_config.py +6 -6
  92. adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +5 -5
  95. adcp/types/generated_poc/core/signal_filters.py +6 -6
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +15 -15
  98. adcp/types/generated_poc/core/targeting.py +59 -18
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  101. adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
  102. adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
  103. adcp/types/generated_poc/creative/preview_render.py +26 -26
  104. adcp/types/generated_poc/enums/adcp_domain.py +5 -5
  105. adcp/types/generated_poc/enums/asset_content_type.py +14 -14
  106. adcp/types/generated_poc/enums/auth_scheme.py +3 -3
  107. adcp/types/generated_poc/enums/available_metric.py +10 -10
  108. adcp/types/generated_poc/enums/channels.py +21 -11
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
  110. adcp/types/generated_poc/enums/creative_action.py +6 -6
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
  112. adcp/types/generated_poc/enums/creative_sort_field.py +7 -7
  113. adcp/types/generated_poc/enums/creative_status.py +6 -5
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +12 -12
  115. adcp/types/generated_poc/enums/daast_version.py +3 -3
  116. adcp/types/generated_poc/enums/delivery_type.py +3 -3
  117. adcp/types/generated_poc/enums/dimension_unit.py +5 -5
  118. adcp/types/generated_poc/enums/feed_format.py +4 -4
  119. adcp/types/generated_poc/enums/feedback_source.py +5 -5
  120. adcp/types/generated_poc/enums/format_category.py +8 -8
  121. adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +3 -3
  125. adcp/types/generated_poc/enums/http_method.py +3 -3
  126. adcp/types/generated_poc/enums/identifier_types.py +20 -20
  127. adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
  129. adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
  130. adcp/types/generated_poc/enums/media_buy_status.py +5 -5
  131. adcp/types/generated_poc/enums/metric_type.py +9 -9
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +5 -5
  134. adcp/types/generated_poc/enums/pacing.py +4 -4
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +3 -3
  137. adcp/types/generated_poc/enums/pricing_model.py +8 -8
  138. adcp/types/generated_poc/enums/property_type.py +9 -8
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
  140. adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
  142. adcp/types/generated_poc/enums/sort_direction.py +3 -3
  143. adcp/types/generated_poc/enums/task_status.py +10 -10
  144. adcp/types/generated_poc/enums/task_type.py +12 -12
  145. adcp/types/generated_poc/enums/update_frequency.py +5 -5
  146. adcp/types/generated_poc/enums/url_asset_type.py +4 -4
  147. adcp/types/generated_poc/enums/validation_mode.py +3 -3
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +17 -17
  149. adcp/types/generated_poc/enums/vast_version.py +6 -6
  150. adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
  151. adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
  152. adcp/types/generated_poc/extensions/extension_meta.py +20 -12
  153. adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  154. adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  155. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  158. adcp/types/generated_poc/media_buy/create_media_buy_request.py +65 -37
  159. adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  160. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  162. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  163. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  164. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  165. adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
  166. adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
  167. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
  169. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  170. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  171. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  172. adcp/types/generated_poc/media_buy/list_creatives_response.py +54 -57
  173. adcp/types/generated_poc/media_buy/package_request.py +12 -12
  174. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  175. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  177. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  180. adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  181. adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  182. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  185. adcp/types/generated_poc/media_buy/update_media_buy_request.py +28 -124
  186. adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  187. adcp/types/generated_poc/pricing_options/cpc_option.py +40 -15
  188. adcp/types/generated_poc/pricing_options/cpcv_option.py +41 -16
  189. adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
  190. adcp/types/generated_poc/pricing_options/cpp_option.py +46 -23
  191. adcp/types/generated_poc/pricing_options/cpv_option.py +45 -26
  192. adcp/types/generated_poc/pricing_options/flat_rate_option.py +53 -47
  193. adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
  194. adcp/types/generated_poc/property/base_property_source.py +16 -16
  195. adcp/types/generated_poc/property/create_property_list_request.py +5 -5
  196. adcp/types/generated_poc/property/create_property_list_response.py +4 -4
  197. adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
  198. adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
  199. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  200. adcp/types/generated_poc/property/get_property_list_request.py +6 -6
  201. adcp/types/generated_poc/property/get_property_list_response.py +12 -12
  202. adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
  203. adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
  204. adcp/types/generated_poc/property/property_error.py +11 -11
  205. adcp/types/generated_poc/property/property_feature.py +5 -5
  206. adcp/types/generated_poc/property/property_feature_definition.py +19 -19
  207. adcp/types/generated_poc/property/property_list.py +12 -12
  208. adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
  209. adcp/types/generated_poc/property/property_list_filters.py +9 -9
  210. adcp/types/generated_poc/property/update_property_list_request.py +9 -9
  211. adcp/types/generated_poc/property/update_property_list_response.py +3 -3
  212. adcp/types/generated_poc/protocol/__init__.py +3 -0
  213. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  214. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  215. adcp/types/generated_poc/protocols/adcp_extension.py +14 -17
  216. adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  217. adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  218. adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  219. adcp/types/generated_poc/signals/get_signals_response.py +16 -16
  220. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  232. adcp/utils/format_assets.py +5 -5
  233. adcp/utils/preview_cache.py +2 -2
  234. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  235. adcp-3.0.0.dist-info/RECORD +264 -0
  236. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  237. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  238. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
  239. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  240. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp/types/generated_poc/property/list_property_features_request.py +0 -25
  243. adcp/types/generated_poc/property/list_property_features_response.py +0 -24
  244. adcp-2.19.0.dist-info/RECORD +0 -220
  245. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  246. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  247. {adcp-2.19.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/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
 
@@ -13,7 +13,7 @@ from ..core import ext as ext_1
13
13
 
14
14
  class UpdateMediaBuySubmitted(AdCPBaseModel):
15
15
  model_config = ConfigDict(
16
- extra="allow",
16
+ extra='allow',
17
17
  )
18
18
  context: context_1.ContextObject | None = None
19
19
  ext: ext_1.ExtensionObject | None = None
@@ -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
 
@@ -15,17 +15,17 @@ from ..core import ext as ext_1
15
15
 
16
16
  class UpdateMediaBuyWorking(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra="allow",
18
+ extra='allow',
19
19
  )
20
20
  context: context_1.ContextObject | None = None
21
21
  current_step: Annotated[
22
- str | None, Field(description="Current step or phase of the operation")
22
+ str | None, Field(description='Current step or phase of the operation')
23
23
  ] = None
24
24
  ext: ext_1.ExtensionObject | None = None
25
25
  percentage: Annotated[
26
- float | None, Field(description="Completion percentage (0-100)", ge=0.0, le=100.0)
26
+ float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
27
27
  ] = None
28
- step_number: Annotated[int | None, Field(description="Current step number", ge=1)] = None
28
+ step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
29
29
  total_steps: Annotated[
30
- int | None, Field(description="Total number of steps in the operation", ge=1)
30
+ int | None, Field(description='Total number of steps in the operation', ge=1)
31
31
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_request.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -10,174 +10,78 @@ 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
- impressions: Annotated[
59
- float | None, Field(description="Updated impression goal for this package", ge=0.0)
60
- ] = None
61
- pacing: pacing_1.Pacing | None = None
62
- package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
63
- paused: Annotated[
64
- bool | None,
65
- Field(description="Pause/resume specific package (true = paused, false = active)"),
66
- ] = None
67
- targeting_overlay: targeting.TargetingOverlay | None = None
68
-
69
-
70
- class Packages1(AdCPBaseModel):
71
- model_config = ConfigDict(
72
- extra="allow",
73
- )
74
- bid_price: Annotated[
75
- float | None,
76
- Field(
77
- description="Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)",
78
- ge=0.0,
79
- ),
80
- ] = None
81
- budget: Annotated[
82
- float | None,
83
- Field(
84
- description="Updated budget allocation for this package in the currency specified by the pricing option",
85
- ge=0.0,
86
- ),
87
- ] = None
88
- buyer_ref: Annotated[str, Field(description="Buyer's reference for the package to update")]
89
- creative_assignments: Annotated[
90
- list[creative_assignment.CreativeAssignment] | None,
91
- Field(
92
- 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."
93
- ),
94
- ] = None
95
- creative_ids: Annotated[
96
- list[str] | None,
97
- Field(description="Update creative assignments (references existing library creatives)"),
98
- ] = None
99
- creatives: Annotated[
100
- list[creative_asset.CreativeAsset] | None,
101
- Field(
102
- 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.",
103
- max_length=100,
104
- ),
105
- ] = None
106
- impressions: Annotated[
107
- float | None, Field(description="Updated impression goal for this package", ge=0.0)
108
- ] = None
109
- pacing: pacing_1.Pacing | None = None
110
- package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
111
- None
112
- )
113
- paused: Annotated[
114
- bool | None,
115
- Field(description="Pause/resume specific package (true = paused, false = active)"),
116
- ] = None
117
- 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
118
18
 
119
19
 
120
20
  class UpdateMediaBuyRequest1(AdCPBaseModel):
121
21
  model_config = ConfigDict(
122
- extra="allow",
22
+ extra='allow',
123
23
  )
124
24
  buyer_ref: Annotated[
125
25
  str | None, Field(description="Buyer's reference for the media buy to update")
126
26
  ] = None
127
27
  context: context_1.ContextObject | None = None
128
28
  end_time: Annotated[
129
- AwareDatetime | None, Field(description="New end date/time in ISO 8601 format")
29
+ AwareDatetime | None, Field(description='New end date/time in ISO 8601 format')
130
30
  ] = None
131
31
  ext: ext_1.ExtensionObject | None = None
132
32
  media_buy_id: Annotated[str, Field(description="Publisher's ID of the media buy to update")]
133
33
  packages: Annotated[
134
- list[Packages | Packages1] | None, Field(description="Package-specific updates")
34
+ list[package_update.PackageUpdate] | None, Field(description='Package-specific updates')
135
35
  ] = None
136
36
  paused: Annotated[
137
37
  bool | None,
138
- Field(description="Pause/resume the entire media buy (true = paused, false = active)"),
38
+ Field(description='Pause/resume the entire media buy (true = paused, false = active)'),
139
39
  ] = None
140
40
  push_notification_config: Annotated[
141
41
  push_notification_config_1.PushNotificationConfig | None,
142
42
  Field(
143
- 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.'
144
50
  ),
145
51
  ] = None
146
52
  start_time: start_timing.StartTiming | None = None
147
53
 
148
54
 
149
- class Packages2(Packages):
150
- pass
151
-
152
-
153
- class Packages3(Packages1):
154
- pass
155
-
156
-
157
55
  class UpdateMediaBuyRequest2(AdCPBaseModel):
158
56
  model_config = ConfigDict(
159
- extra="allow",
57
+ extra='allow',
160
58
  )
161
59
  buyer_ref: Annotated[str, Field(description="Buyer's reference for the media buy to update")]
162
60
  context: context_1.ContextObject | None = None
163
61
  end_time: Annotated[
164
- AwareDatetime | None, Field(description="New end date/time in ISO 8601 format")
62
+ AwareDatetime | None, Field(description='New end date/time in ISO 8601 format')
165
63
  ] = None
166
64
  ext: ext_1.ExtensionObject | None = None
167
65
  media_buy_id: Annotated[
168
66
  str | None, Field(description="Publisher's ID of the media buy to update")
169
67
  ] = None
170
68
  packages: Annotated[
171
- list[Packages2 | Packages3] | None, Field(description="Package-specific updates")
69
+ list[package_update.PackageUpdate] | None, Field(description='Package-specific updates')
172
70
  ] = None
173
71
  paused: Annotated[
174
72
  bool | None,
175
- Field(description="Pause/resume the entire media buy (true = paused, false = active)"),
73
+ Field(description='Pause/resume the entire media buy (true = paused, false = active)'),
176
74
  ] = None
177
75
  push_notification_config: Annotated[
178
76
  push_notification_config_1.PushNotificationConfig | None,
179
77
  Field(
180
- 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.'
181
85
  ),
182
86
  ] = None
183
87
  start_time: start_timing.StartTiming | None = None
@@ -187,7 +91,7 @@ class UpdateMediaBuyRequest(RootModel[UpdateMediaBuyRequest1 | UpdateMediaBuyReq
187
91
  root: Annotated[
188
92
  UpdateMediaBuyRequest1 | UpdateMediaBuyRequest2,
189
93
  Field(
190
- description="Request parameters for updating campaign and package settings",
191
- title="Update Media Buy Request",
94
+ description='Request parameters for updating campaign and package settings',
95
+ title='Update Media Buy Request',
192
96
  ),
193
97
  ]
@@ -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
 
@@ -17,30 +17,30 @@ from ..core import package
17
17
 
18
18
  class UpdateMediaBuyResponse2(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="allow",
20
+ extra='allow',
21
21
  )
22
22
  context: context_1.ContextObject | None = None
23
23
  errors: Annotated[
24
24
  list[error.Error],
25
- Field(description="Array of errors explaining why the operation failed", min_length=1),
25
+ Field(description='Array of errors explaining why the operation failed', min_length=1),
26
26
  ]
27
27
  ext: ext_1.ExtensionObject | None = None
28
28
 
29
29
 
30
30
  class UpdateMediaBuyResponse1(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra="allow",
32
+ extra='allow',
33
33
  )
34
34
  affected_packages: Annotated[
35
35
  list[package.Package] | None,
36
- Field(description="Array of packages that were modified with complete state information"),
36
+ Field(description='Array of packages that were modified with complete state information'),
37
37
  ] = None
38
38
  buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for the media buy")]
39
39
  context: context_1.ContextObject | None = None
40
40
  ext: ext_1.ExtensionObject | None = None
41
41
  implementation_date: Annotated[
42
42
  AwareDatetime | None,
43
- Field(description="ISO 8601 timestamp when changes take effect (null if pending approval)"),
43
+ Field(description='ISO 8601 timestamp when changes take effect (null if pending approval)'),
44
44
  ] = None
45
45
  media_buy_id: Annotated[str, Field(description="Publisher's identifier for the media buy")]
46
46
 
@@ -49,7 +49,7 @@ class UpdateMediaBuyResponse(RootModel[UpdateMediaBuyResponse1 | UpdateMediaBuyR
49
49
  root: Annotated[
50
50
  UpdateMediaBuyResponse1 | UpdateMediaBuyResponse2,
51
51
  Field(
52
- description="Response payload for update_media_buy task. Returns either complete success data OR error information, never both. This enforces atomic operation semantics - updates are either fully applied or not applied at all.",
53
- title="Update Media Buy Response",
52
+ description='Response payload for update_media_buy task. Returns either complete success data OR error information, never both. This enforces atomic operation semantics - updates are either fully applied or not applied at all.',
53
+ title='Update Media Buy Response',
54
54
  ),
55
55
  ]
@@ -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,34 +10,59 @@ 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
- extra="allow",
28
+ extra='allow',
16
29
  )
17
30
  currency: Annotated[
18
31
  str,
19
32
  Field(
20
- description="ISO 4217 currency code",
21
- examples=["USD", "EUR", "GBP", "JPY"],
22
- pattern="^[A-Z]{3}$",
33
+ description='ISO 4217 currency code',
34
+ examples=['USD', 'EUR', 'GBP', 'JPY'],
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(
32
- description="Minimum spend requirement per package using this pricing option, in the specified currency",
55
+ description='Minimum spend requirement per package using this pricing option, in the specified currency',
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,36 +10,61 @@ 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
- extra="allow",
28
+ extra='allow',
16
29
  )
17
30
  currency: Annotated[
18
31
  str,
19
32
  Field(
20
- description="ISO 4217 currency code",
21
- examples=["USD", "EUR", "GBP", "JPY"],
22
- pattern="^[A-Z]{3}$",
33
+ description='ISO 4217 currency code',
34
+ examples=['USD', 'EUR', 'GBP', 'JPY'],
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(
32
- description="Minimum spend requirement per package using this pricing option, in the specified currency",
55
+ description='Minimum spend requirement per package using this pricing option, in the specified currency',
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
- Literal["cpcv"], Field(description="Cost per completed view (100% completion)")
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)]
@@ -0,0 +1,62 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: pricing_options/cpm_option.json
3
+ # timestamp: 2026-01-26T11:40:01+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated, Literal
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+
13
+ class PriceGuidance(AdCPBaseModel):
14
+ p25: Annotated[float | None, Field(description='25th percentile winning price', ge=0.0)] = None
15
+ p50: Annotated[float | None, Field(description='Median winning price', ge=0.0)] = None
16
+ p75: Annotated[float | None, Field(description='75th percentile winning price', ge=0.0)] = None
17
+ p90: Annotated[float | None, Field(description='90th percentile winning price', ge=0.0)] = None
18
+
19
+
20
+ class CpmPricingOption(AdCPBaseModel):
21
+ model_config = ConfigDict(
22
+ extra='allow',
23
+ )
24
+ currency: Annotated[
25
+ str,
26
+ Field(
27
+ description='ISO 4217 currency code',
28
+ examples=['USD', 'EUR', 'GBP', 'JPY'],
29
+ pattern='^[A-Z]{3}$',
30
+ ),
31
+ ]
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
46
+ min_spend_per_package: Annotated[
47
+ float | None,
48
+ Field(
49
+ description='Minimum spend requirement per package using this pricing option, in the specified currency',
50
+ ge=0.0,
51
+ ),
52
+ ] = None
53
+ price_guidance: Annotated[
54
+ PriceGuidance | None,
55
+ Field(
56
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
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')
62
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpp_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
 
@@ -12,53 +12,76 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class Parameters(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra="allow",
15
+ extra='allow',
16
16
  )
17
17
  demographic: Annotated[
18
18
  str,
19
19
  Field(
20
- description="Target demographic in Nielsen format: P/M/W/A/C + age range. Examples: P18-49 (Persons 18-49), M25-54 (Men 25-54), W35+ (Women 35+), A18-34 (Adults 18-34), C2-11 (Children 2-11)",
21
- pattern="^[PMWAC][0-9]{2}(-[0-9]{2}|\\+)$",
20
+ description='Target demographic in Nielsen format (P18-49, M25-54, W35+, etc.)',
21
+ pattern='^[PMWAC][0-9]{2}(-[0-9]{2}|\\+)$',
22
22
  ),
23
23
  ]
24
- min_points: Annotated[
25
- float | None,
26
- Field(description="Minimum GRPs/TRPs required for this pricing option", ge=0.0),
24
+ min_points: Annotated[float | None, Field(description='Minimum GRPs/TRPs required', ge=0.0)] = (
25
+ None
26
+ )
27
+
28
+
29
+ class PriceGuidance(AdCPBaseModel):
30
+ p25: Annotated[
31
+ float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
32
+ ] = None
33
+ p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
34
+ p75: Annotated[
35
+ float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
36
+ ] = None
37
+ p90: Annotated[
38
+ float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
27
39
  ] = None
28
40
 
29
41
 
30
42
  class CppPricingOption(AdCPBaseModel):
31
43
  model_config = ConfigDict(
32
- extra="allow",
44
+ extra='allow',
33
45
  )
34
46
  currency: Annotated[
35
47
  str,
36
48
  Field(
37
- description="ISO 4217 currency code",
38
- examples=["USD", "EUR", "GBP", "JPY"],
39
- pattern="^[A-Z]{3}$",
49
+ description='ISO 4217 currency code',
50
+ examples=['USD', 'EUR', 'GBP', 'JPY'],
51
+ pattern='^[A-Z]{3}$',
40
52
  ),
41
53
  ]
42
- is_fixed: Annotated[
43
- Literal[True],
44
- Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
45
- ]
54
+ fixed_price: Annotated[
55
+ float | None,
56
+ Field(
57
+ description='Fixed price per rating point. If present, this is fixed pricing. If absent, auction-based.',
58
+ ge=0.0,
59
+ ),
60
+ ] = None
61
+ floor_price: Annotated[
62
+ float | None,
63
+ Field(
64
+ description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
65
+ ge=0.0,
66
+ ),
67
+ ] = None
46
68
  min_spend_per_package: Annotated[
47
69
  float | None,
48
70
  Field(
49
- description="Minimum spend requirement per package using this pricing option, in the specified currency",
71
+ description='Minimum spend requirement per package using this pricing option, in the specified currency',
50
72
  ge=0.0,
51
73
  ),
52
74
  ] = None
53
75
  parameters: Annotated[
54
- Parameters,
55
- Field(description="CPP-specific parameters for demographic targeting and GRP requirements"),
76
+ Parameters, Field(description='CPP-specific parameters for demographic targeting')
56
77
  ]
57
- pricing_model: Annotated[Literal["cpp"], Field(description="Cost per Gross Rating Point")]
58
- pricing_option_id: Annotated[
59
- str,
78
+ price_guidance: Annotated[
79
+ PriceGuidance | None,
60
80
  Field(
61
- description="Unique identifier for this pricing option within the product (e.g., 'cpp_usd_p18-49')"
81
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
62
82
  ),
83
+ ] = None
84
+ pricing_model: Annotated[Literal['cpp'], Field(description='Cost per Gross Rating Point')]
85
+ pricing_option_id: Annotated[
86
+ str, Field(description='Unique identifier for this pricing option within the product')
63
87
  ]
64
- rate: Annotated[float, Field(description="Fixed CPP rate (cost per rating point)", ge=0.0)]