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
@@ -0,0 +1,29 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/media_buy_features.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 Field
11
+
12
+
13
+ class MediaBuyFeatures(AdCPBaseModel):
14
+ content_standards: Annotated[
15
+ bool | None,
16
+ Field(
17
+ description='Full support for content_standards configuration including sampling rates and category filtering'
18
+ ),
19
+ ] = None
20
+ inline_creative_management: Annotated[
21
+ bool | None,
22
+ Field(description='Supports creatives provided inline in create_media_buy requests'),
23
+ ] = None
24
+ property_list_filtering: Annotated[
25
+ bool | None,
26
+ Field(
27
+ description='Honors property_list parameter in get_products to filter results to buyer-approved properties'
28
+ ),
29
+ ] = None
@@ -0,0 +1,80 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/offering.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated, Any
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field
11
+
12
+ from . import ext as ext_1
13
+
14
+
15
+ class Offering(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='allow',
18
+ )
19
+ assets: Annotated[
20
+ list[dict[str, Any]] | None,
21
+ Field(description='Assets specific to this offering (images, videos, copy)'),
22
+ ] = None
23
+ categories: Annotated[
24
+ list[str] | None,
25
+ Field(
26
+ description="Categories this offering belongs to (e.g., 'measurement', 'identity', 'programmatic')"
27
+ ),
28
+ ] = None
29
+ checkout_url: Annotated[
30
+ AnyUrl | None,
31
+ Field(
32
+ description="URL for checkout/purchase flow when the brand doesn't support agentic checkout."
33
+ ),
34
+ ] = None
35
+ description: Annotated[str | None, Field(description="Description of what's being offered")] = (
36
+ None
37
+ )
38
+ ext: ext_1.ExtensionObject | None = None
39
+ keywords: Annotated[
40
+ list[str] | None,
41
+ Field(
42
+ description='Keywords for matching this offering to user intent. Hosts use these for retrieval/relevance scoring.'
43
+ ),
44
+ ] = None
45
+ landing_url: Annotated[
46
+ AnyUrl | None, Field(description='Landing page URL for this offering.')
47
+ ] = None
48
+ name: Annotated[
49
+ str,
50
+ Field(
51
+ description="Human-readable offering name (e.g., 'Winter Sale', 'Free Trial', 'Enterprise Platform')"
52
+ ),
53
+ ]
54
+ offering_id: Annotated[
55
+ str,
56
+ Field(
57
+ description='Unique identifier for this offering. Used by hosts to reference specific offerings in si_get_offering calls.'
58
+ ),
59
+ ]
60
+ portfolio_ref: Annotated[
61
+ AnyUrl | None,
62
+ Field(
63
+ description='Reference to a creative portfolio for this offering. Portfolios contain organized creative assets across formats, enabling consistent ad delivery for this specific offering.'
64
+ ),
65
+ ] = None
66
+ tagline: Annotated[
67
+ str | None, Field(description='Short promotional tagline for the offering')
68
+ ] = None
69
+ valid_from: Annotated[
70
+ AwareDatetime | None,
71
+ Field(
72
+ description='When the offering becomes available. If not specified, offering is immediately available.'
73
+ ),
74
+ ] = None
75
+ valid_to: Annotated[
76
+ AwareDatetime | None,
77
+ Field(
78
+ description='When the offering expires. If not specified, offering has no expiration.'
79
+ ),
80
+ ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/package.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,19 +17,19 @@ from . import format_id, targeting
17
17
 
18
18
  class Package(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="allow",
20
+ extra='allow',
21
21
  )
22
22
  bid_price: Annotated[
23
23
  float | None,
24
24
  Field(
25
- description="Bid price for auction-based CPM pricing (present if using cpm-auction-option)",
25
+ description='Bid price for auction-based CPM pricing (present if using cpm-auction-option)',
26
26
  ge=0.0,
27
27
  ),
28
28
  ] = None
29
29
  budget: Annotated[
30
30
  float | None,
31
31
  Field(
32
- description="Budget allocation for this package in the currency specified by the pricing option",
32
+ description='Budget allocation for this package in the currency specified by the pricing option',
33
33
  ge=0.0,
34
34
  ),
35
35
  ] = None
@@ -38,22 +38,22 @@ class Package(AdCPBaseModel):
38
38
  ] = None
39
39
  creative_assignments: Annotated[
40
40
  list[creative_assignment.CreativeAssignment] | None,
41
- Field(description="Creative assets assigned to this package"),
41
+ Field(description='Creative assets assigned to this package'),
42
42
  ] = None
43
43
  ext: ext_1.ExtensionObject | None = None
44
44
  format_ids_to_provide: Annotated[
45
45
  list[format_id.FormatId] | None,
46
- Field(description="Format IDs that creative assets will be provided for this package"),
46
+ Field(description='Format IDs that creative assets will be provided for this package'),
47
47
  ] = None
48
48
  impressions: Annotated[
49
- float | None, Field(description="Impression goal for this package", ge=0.0)
49
+ float | None, Field(description='Impression goal for this package', ge=0.0)
50
50
  ] = None
51
51
  pacing: pacing_1.Pacing | None = None
52
52
  package_id: Annotated[str, Field(description="Publisher's unique identifier for the package")]
53
53
  paused: Annotated[
54
54
  bool | None,
55
55
  Field(
56
- description="Whether this package is paused by the buyer. Paused packages do not deliver impressions. Defaults to false."
56
+ description='Whether this package is paused by the buyer. Paused packages do not deliver impressions. Defaults to false.'
57
57
  ),
58
58
  ] = False
59
59
  pricing_option_id: Annotated[
@@ -63,6 +63,6 @@ class Package(AdCPBaseModel):
63
63
  ),
64
64
  ] = None
65
65
  product_id: Annotated[
66
- str | None, Field(description="ID of the product this package is based on")
66
+ str | None, Field(description='ID of the product this package is based on')
67
67
  ] = None
68
68
  targeting_overlay: targeting.TargetingOverlay | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/performance_feedback.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
 
@@ -16,63 +16,63 @@ from ..enums import metric_type as metric_type_1
16
16
 
17
17
  class MeasurementPeriod(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra="allow",
19
+ extra='allow',
20
20
  )
21
21
  end: Annotated[
22
- AwareDatetime, Field(description="ISO 8601 end timestamp for measurement period")
22
+ AwareDatetime, Field(description='ISO 8601 end timestamp for measurement period')
23
23
  ]
24
24
  start: Annotated[
25
- AwareDatetime, Field(description="ISO 8601 start timestamp for measurement period")
25
+ AwareDatetime, Field(description='ISO 8601 start timestamp for measurement period')
26
26
  ]
27
27
 
28
28
 
29
29
  class Status(Enum):
30
- accepted = "accepted"
31
- queued = "queued"
32
- applied = "applied"
33
- rejected = "rejected"
30
+ accepted = 'accepted'
31
+ queued = 'queued'
32
+ applied = 'applied'
33
+ rejected = 'rejected'
34
34
 
35
35
 
36
36
  class PerformanceFeedback(AdCPBaseModel):
37
37
  model_config = ConfigDict(
38
- extra="allow",
38
+ extra='allow',
39
39
  )
40
40
  applied_at: Annotated[
41
41
  AwareDatetime | None,
42
42
  Field(
43
- description="ISO 8601 timestamp when feedback was applied to optimization algorithms"
43
+ description='ISO 8601 timestamp when feedback was applied to optimization algorithms'
44
44
  ),
45
45
  ] = None
46
46
  creative_id: Annotated[
47
- str | None, Field(description="Specific creative asset (if feedback is creative-specific)")
47
+ str | None, Field(description='Specific creative asset (if feedback is creative-specific)')
48
48
  ] = None
49
49
  feedback_id: Annotated[
50
- str, Field(description="Unique identifier for this performance feedback submission")
50
+ str, Field(description='Unique identifier for this performance feedback submission')
51
51
  ]
52
52
  feedback_source: Annotated[
53
- feedback_source_1.FeedbackSource, Field(description="Source of the performance data")
53
+ feedback_source_1.FeedbackSource, Field(description='Source of the performance data')
54
54
  ]
55
55
  measurement_period: Annotated[
56
- MeasurementPeriod, Field(description="Time period for performance measurement")
56
+ MeasurementPeriod, Field(description='Time period for performance measurement')
57
57
  ]
58
58
  media_buy_id: Annotated[str, Field(description="Publisher's media buy identifier")]
59
59
  metric_type: Annotated[
60
- metric_type_1.MetricType, Field(description="The business metric being measured")
60
+ metric_type_1.MetricType, Field(description='The business metric being measured')
61
61
  ]
62
62
  package_id: Annotated[
63
63
  str | None,
64
64
  Field(
65
- description="Specific package within the media buy (if feedback is package-specific)"
65
+ description='Specific package within the media buy (if feedback is package-specific)'
66
66
  ),
67
67
  ] = None
68
68
  performance_index: Annotated[
69
69
  float,
70
70
  Field(
71
- description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)",
71
+ description='Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)',
72
72
  ge=0.0,
73
73
  ),
74
74
  ]
75
- status: Annotated[Status, Field(description="Processing status of the performance feedback")]
75
+ status: Annotated[Status, Field(description='Processing status of the performance feedback')]
76
76
  submitted_at: Annotated[
77
- AwareDatetime, Field(description="ISO 8601 timestamp when feedback was submitted")
77
+ AwareDatetime, Field(description='ISO 8601 timestamp when feedback was submitted')
78
78
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/placement.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
 
@@ -14,15 +14,15 @@ from . import format_id
14
14
 
15
15
  class Placement(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra="allow",
17
+ extra='allow',
18
18
  )
19
19
  description: Annotated[
20
- str | None, Field(description="Detailed description of where and how the placement appears")
20
+ str | None, Field(description='Detailed description of where and how the placement appears')
21
21
  ] = None
22
22
  format_ids: Annotated[
23
23
  list[format_id.FormatId] | None,
24
24
  Field(
25
- description="Format IDs supported by this specific placement. Can include: (1) concrete format_ids (fixed dimensions), (2) template format_ids without parameters (accepts any dimensions/duration), or (3) parameterized format_ids (specific dimension/duration constraints).",
25
+ description='Format IDs supported by this specific placement. Can include: (1) concrete format_ids (fixed dimensions), (2) template format_ids without parameters (accepts any dimensions/duration), or (3) parameterized format_ids (specific dimension/duration constraints).',
26
26
  min_length=1,
27
27
  ),
28
28
  ] = None
@@ -33,5 +33,5 @@ class Placement(AdCPBaseModel):
33
33
  ),
34
34
  ]
35
35
  placement_id: Annotated[
36
- str, Field(description="Unique identifier for the placement within the product")
36
+ str, Field(description='Unique identifier for the placement within the product')
37
37
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/pricing_option.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-26T11:40:01+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -11,22 +11,18 @@ from pydantic import Field, RootModel
11
11
  from ..pricing_options import (
12
12
  cpc_option,
13
13
  cpcv_option,
14
- cpm_auction_option,
15
- cpm_fixed_option,
14
+ cpm_option,
16
15
  cpp_option,
17
16
  cpv_option,
18
17
  flat_rate_option,
19
- vcpm_auction_option,
20
- vcpm_fixed_option,
18
+ vcpm_option,
21
19
  )
22
20
 
23
21
 
24
22
  class PricingOption(
25
23
  RootModel[
26
- cpm_fixed_option.CpmFixedRatePricingOption
27
- | cpm_auction_option.CpmAuctionPricingOption
28
- | vcpm_fixed_option.VcpmFixedRatePricingOption
29
- | vcpm_auction_option.VcpmAuctionPricingOption
24
+ cpm_option.CpmPricingOption
25
+ | vcpm_option.VcpmPricingOption
30
26
  | cpc_option.CpcPricingOption
31
27
  | cpcv_option.CpcvPricingOption
32
28
  | cpv_option.CpvPricingOption
@@ -35,17 +31,15 @@ class PricingOption(
35
31
  ]
36
32
  ):
37
33
  root: Annotated[
38
- cpm_fixed_option.CpmFixedRatePricingOption
39
- | cpm_auction_option.CpmAuctionPricingOption
40
- | vcpm_fixed_option.VcpmFixedRatePricingOption
41
- | vcpm_auction_option.VcpmAuctionPricingOption
34
+ cpm_option.CpmPricingOption
35
+ | vcpm_option.VcpmPricingOption
42
36
  | cpc_option.CpcPricingOption
43
37
  | cpcv_option.CpcvPricingOption
44
38
  | cpv_option.CpvPricingOption
45
39
  | cpp_option.CppPricingOption
46
40
  | flat_rate_option.FlatRatePricingOption,
47
41
  Field(
48
- description="A pricing model option offered by a publisher for a product. Each pricing model has its own schema with model-specific requirements.",
49
- title="Pricing Option",
42
+ description="A pricing model option offered by a publisher for a product. Discriminated by pricing_model field. If fixed_price is present, it's fixed pricing. If absent, it's auction-based (floor_price and price_guidance optional).",
43
+ title='Pricing Option',
50
44
  ),
51
45
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/product.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
 
@@ -35,100 +35,100 @@ class DeliveryMeasurement(AdCPBaseModel):
35
35
 
36
36
  class ProductCard(AdCPBaseModel):
37
37
  model_config = ConfigDict(
38
- extra="allow",
38
+ extra='allow',
39
39
  )
40
40
  format_id: Annotated[
41
41
  format_id_1.FormatId,
42
42
  Field(
43
- description="Creative format defining the card layout (typically product_card_standard)"
43
+ description='Creative format defining the card layout (typically product_card_standard)'
44
44
  ),
45
45
  ]
46
46
  manifest: Annotated[
47
47
  dict[str, Any],
48
- Field(description="Asset manifest for rendering the card, structure defined by the format"),
48
+ Field(description='Asset manifest for rendering the card, structure defined by the format'),
49
49
  ]
50
50
 
51
51
 
52
52
  class ProductCardDetailed(AdCPBaseModel):
53
53
  model_config = ConfigDict(
54
- extra="allow",
54
+ extra='allow',
55
55
  )
56
56
  format_id: Annotated[
57
57
  format_id_1.FormatId,
58
58
  Field(
59
- description="Creative format defining the detailed card layout (typically product_card_detailed)"
59
+ description='Creative format defining the detailed card layout (typically product_card_detailed)'
60
60
  ),
61
61
  ]
62
62
  manifest: Annotated[
63
63
  dict[str, Any],
64
64
  Field(
65
- description="Asset manifest for rendering the detailed card, structure defined by the format"
65
+ description='Asset manifest for rendering the detailed card, structure defined by the format'
66
66
  ),
67
67
  ]
68
68
 
69
69
 
70
70
  class Product(AdCPBaseModel):
71
71
  model_config = ConfigDict(
72
- extra="allow",
72
+ extra='allow',
73
73
  )
74
74
  brief_relevance: Annotated[
75
75
  str | None,
76
76
  Field(
77
- description="Explanation of why this product matches the brief (only included when brief is provided)"
77
+ description='Explanation of why this product matches the brief (only included when brief is provided)'
78
78
  ),
79
79
  ] = None
80
80
  creative_policy: creative_policy_1.CreativePolicy | None = None
81
81
  delivery_measurement: Annotated[
82
82
  DeliveryMeasurement,
83
83
  Field(
84
- description="Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products."
84
+ description='Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products.'
85
85
  ),
86
86
  ]
87
87
  delivery_type: delivery_type_1.DeliveryType
88
88
  description: Annotated[
89
- str, Field(description="Detailed description of the product and its inventory")
89
+ str, Field(description='Detailed description of the product and its inventory')
90
90
  ]
91
91
  estimated_exposures: Annotated[
92
92
  int | None,
93
- Field(description="Estimated exposures/impressions for guaranteed products", ge=0),
93
+ Field(description='Estimated exposures/impressions for guaranteed products', ge=0),
94
94
  ] = None
95
95
  expires_at: Annotated[
96
- AwareDatetime | None, Field(description="Expiration timestamp for custom products")
96
+ AwareDatetime | None, Field(description='Expiration timestamp for custom products')
97
97
  ] = None
98
98
  ext: ext_1.ExtensionObject | None = None
99
99
  format_ids: Annotated[
100
100
  list[format_id_1.FormatId],
101
101
  Field(
102
- description="Array of supported creative format IDs - structured format_id objects with agent_url and id"
102
+ description='Array of supported creative format IDs - structured format_id objects with agent_url and id'
103
103
  ),
104
104
  ]
105
- is_custom: Annotated[bool | None, Field(description="Whether this is a custom product")] = None
105
+ is_custom: Annotated[bool | None, Field(description='Whether this is a custom product')] = None
106
106
  measurement: measurement_1.Measurement | None = None
107
- name: Annotated[str, Field(description="Human-readable product name")]
107
+ name: Annotated[str, Field(description='Human-readable product name')]
108
108
  placements: Annotated[
109
109
  list[placement.Placement] | None,
110
110
  Field(
111
- description="Optional array of specific placements within this product. When provided, buyers can target specific placements when assigning creatives.",
111
+ description='Optional array of specific placements within this product. When provided, buyers can target specific placements when assigning creatives.',
112
112
  min_length=1,
113
113
  ),
114
114
  ] = None
115
115
  pricing_options: Annotated[
116
116
  list[pricing_option.PricingOption],
117
- Field(description="Available pricing models for this product", min_length=1),
117
+ Field(description='Available pricing models for this product', min_length=1),
118
118
  ]
119
119
  product_card: Annotated[
120
120
  ProductCard | None,
121
121
  Field(
122
- description="Optional standard visual card (300x400px) for displaying this product in user interfaces. Can be rendered via preview_creative or pre-generated."
122
+ description='Optional standard visual card (300x400px) for displaying this product in user interfaces. Can be rendered via preview_creative or pre-generated.'
123
123
  ),
124
124
  ] = None
125
125
  product_card_detailed: Annotated[
126
126
  ProductCardDetailed | None,
127
127
  Field(
128
- description="Optional detailed card with carousel and full specifications. Provides rich product presentation similar to media kit pages."
128
+ description='Optional detailed card with carousel and full specifications. Provides rich product presentation similar to media kit pages.'
129
129
  ),
130
130
  ] = None
131
- product_id: Annotated[str, Field(description="Unique identifier for the product")]
131
+ product_id: Annotated[str, Field(description='Unique identifier for the product')]
132
132
  publisher_properties: Annotated[
133
133
  list[publisher_property_selector.PublisherPropertySelector],
134
134
  Field(
@@ -0,0 +1,48 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/product_allocation.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
11
+
12
+ from . import ext as ext_1
13
+
14
+
15
+ class ProductAllocation(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='allow',
18
+ )
19
+ allocation_percentage: Annotated[
20
+ float,
21
+ Field(
22
+ description='Percentage of total budget allocated to this product (0-100)',
23
+ ge=0.0,
24
+ le=100.0,
25
+ ),
26
+ ]
27
+ ext: ext_1.ExtensionObject | None = None
28
+ pricing_option_id: Annotated[
29
+ str | None,
30
+ Field(description="Recommended pricing option ID from the product's pricing_options array"),
31
+ ] = None
32
+ product_id: Annotated[
33
+ str, Field(description='ID of the product (must reference a product in the products array)')
34
+ ]
35
+ rationale: Annotated[
36
+ str | None,
37
+ Field(description='Explanation of why this product and allocation are recommended'),
38
+ ] = None
39
+ sequence: Annotated[
40
+ int | None,
41
+ Field(description='Optional ordering hint for multi-line-item plans (1-based)', ge=1),
42
+ ] = None
43
+ tags: Annotated[
44
+ list[str] | None,
45
+ Field(
46
+ description="Categorical tags for this allocation (e.g., 'desktop', 'german', 'mobile') - useful for grouping/filtering allocations by dimension"
47
+ ),
48
+ ] = None