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
@@ -0,0 +1,27 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/identifier.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 ..enums import identifier_types
13
+
14
+
15
+ class Identifier(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='forbid',
18
+ )
19
+ type: Annotated[
20
+ identifier_types.PropertyIdentifierTypes, Field(description='Type of identifier')
21
+ ]
22
+ value: Annotated[
23
+ str,
24
+ Field(
25
+ description="The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain"
26
+ ),
27
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/mcp_webhook_payload.json
3
- # timestamp: 2025-12-11T15:09:37+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: core/measurement.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: core/media_buy.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
 
@@ -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
 
@@ -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
 
@@ -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
 
@@ -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.',
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).",
49
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
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/product_filters.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
 
@@ -8,12 +8,12 @@ from datetime import date
8
8
  from typing import Annotated
9
9
 
10
10
  from adcp.types.base import AdCPBaseModel
11
- from pydantic import ConfigDict, Field, RootModel
11
+ from pydantic import AnyUrl, ConfigDict, Field, RootModel
12
12
 
13
13
  from ..enums import channels as channels_1
14
14
  from ..enums import delivery_type as delivery_type_1
15
- from ..enums import format_category
16
- from . import format_id
15
+ from ..enums import format_category, geo_level, metro_system
16
+ from . import format_id, media_buy_features
17
17
 
18
18
 
19
19
  class BudgetRange(AdCPBaseModel):
@@ -48,6 +48,38 @@ class Country(RootModel[str]):
48
48
  root: Annotated[str, Field(pattern='^[A-Z]{2}$')]
49
49
 
50
50
 
51
+ class Metro(AdCPBaseModel):
52
+ model_config = ConfigDict(
53
+ extra='forbid',
54
+ )
55
+ code: Annotated[
56
+ str, Field(description="Metro code within the system (e.g., '501' for NYC DMA)")
57
+ ]
58
+ system: Annotated[
59
+ metro_system.MetroAreaSystem, Field(description='Metro classification system')
60
+ ]
61
+
62
+
63
+ class Region(RootModel[str]):
64
+ root: Annotated[str, Field(pattern='^[A-Z]{2}-[A-Z0-9]+$')]
65
+
66
+
67
+ class RequiredGeoTargetingItem(AdCPBaseModel):
68
+ model_config = ConfigDict(
69
+ extra='forbid',
70
+ )
71
+ level: Annotated[
72
+ geo_level.GeographicTargetingLevel,
73
+ Field(description='Geographic targeting level (country, region, metro, postal_area)'),
74
+ ]
75
+ system: Annotated[
76
+ str | None,
77
+ Field(
78
+ description="Classification system within the level. Required for metro (e.g., 'nielsen_dma') and postal_area (e.g., 'us_zip'). Not applicable for country/region which use ISO standards."
79
+ ),
80
+ ] = None
81
+
82
+
51
83
  class ProductFilters(AdCPBaseModel):
52
84
  model_config = ConfigDict(
53
85
  extra='allow',
@@ -57,13 +89,13 @@ class ProductFilters(AdCPBaseModel):
57
89
  Field(description='Budget range to filter appropriate products'),
58
90
  ] = None
59
91
  channels: Annotated[
60
- list[channels_1.AdvertisingChannels] | None,
92
+ list[channels_1.MediaChannel] | None,
61
93
  Field(description="Filter by advertising channels (e.g., ['display', 'video', 'dooh'])"),
62
94
  ] = None
63
95
  countries: Annotated[
64
96
  list[Country] | None,
65
97
  Field(
66
- description="Filter by target countries using ISO 3166-1 alpha-2 country codes (e.g., ['US', 'CA', 'GB'])"
98
+ description="Filter by country coverage using ISO 3166-1 alpha-2 codes (e.g., ['US', 'CA', 'GB']). Works for all inventory types."
67
99
  ),
68
100
  ] = None
69
101
  delivery_type: delivery_type_1.DeliveryType | None = None
@@ -80,12 +112,45 @@ class ProductFilters(AdCPBaseModel):
80
112
  list[format_category.FormatCategory] | None, Field(description='Filter by format types')
81
113
  ] = None
82
114
  is_fixed_price: Annotated[
83
- bool | None, Field(description='Filter for fixed price vs auction products')
115
+ bool | None,
116
+ Field(
117
+ description='Filter by pricing availability: true = products offering fixed pricing (at least one option with fixed_price), false = products offering auction pricing (at least one option without fixed_price). Products with both fixed and auction options match both true and false.'
118
+ ),
119
+ ] = None
120
+ metros: Annotated[
121
+ list[Metro] | None,
122
+ Field(
123
+ description='Filter by metro coverage for locally-bound inventory (radio, DOOH, local TV). Use when products have DMA/metro-specific coverage. For digital inventory where products have broad coverage, use required_geo_targeting instead to filter by seller capability.'
124
+ ),
84
125
  ] = None
85
126
  min_exposures: Annotated[
86
127
  int | None,
87
128
  Field(description='Minimum exposures/impressions needed for measurement validity', ge=1),
88
129
  ] = None
130
+ regions: Annotated[
131
+ list[Region] | None,
132
+ Field(
133
+ description="Filter by region coverage using ISO 3166-2 codes (e.g., ['US-NY', 'US-CA', 'GB-SCT']). Use for locally-bound inventory (regional OOH, local TV) where products have region-specific coverage."
134
+ ),
135
+ ] = None
136
+ required_axe_integrations: Annotated[
137
+ list[AnyUrl] | None,
138
+ Field(
139
+ description='Filter to products executable through specific agentic ad exchanges. URLs are canonical identifiers.'
140
+ ),
141
+ ] = None
142
+ required_features: Annotated[
143
+ media_buy_features.MediaBuyFeatures | None,
144
+ Field(
145
+ description='Filter to products from sellers supporting specific protocol features. Only features set to true are used for filtering.'
146
+ ),
147
+ ] = None
148
+ required_geo_targeting: Annotated[
149
+ list[RequiredGeoTargetingItem] | None,
150
+ Field(
151
+ description='Filter to products from sellers supporting specific geo targeting capabilities. Each entry specifies a targeting level (country, region, metro, postal_area) and optionally a system for levels that have multiple classification systems.'
152
+ ),
153
+ ] = None
89
154
  standard_formats_only: Annotated[
90
155
  bool | None, Field(description='Only return products accepting IAB standard formats')
91
156
  ] = None
@@ -1,16 +1,16 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/promoted_offerings.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
 
7
7
  from enum import Enum
8
- from typing import Annotated, Any
8
+ from typing import Annotated
9
9
 
10
10
  from adcp.types.base import AdCPBaseModel
11
- from pydantic import ConfigDict, Field
11
+ from pydantic import AnyUrl, ConfigDict, Field
12
12
 
13
- from . import brand_manifest_ref, promoted_products
13
+ from . import brand_manifest_ref, offering, promoted_products
14
14
 
15
15
 
16
16
  class AssetType(Enum):
@@ -43,21 +43,6 @@ class AssetSelectors(AdCPBaseModel):
43
43
  ] = None
44
44
 
45
45
 
46
- class Offering(AdCPBaseModel):
47
- model_config = ConfigDict(
48
- extra='allow',
49
- )
50
- assets: Annotated[
51
- list[dict[str, Any]] | None, Field(description='Assets specific to this offering')
52
- ] = None
53
- description: Annotated[str | None, Field(description="Description of what's being offered")] = (
54
- None
55
- )
56
- name: Annotated[
57
- str, Field(description="Offering name (e.g., 'Winter Sale', 'New Product Launch')")
58
- ]
59
-
60
-
61
46
  class PromotedOfferings(AdCPBaseModel):
62
47
  model_config = ConfigDict(
63
48
  extra='allow',
@@ -73,9 +58,9 @@ class PromotedOfferings(AdCPBaseModel):
73
58
  ),
74
59
  ]
75
60
  offerings: Annotated[
76
- list[Offering] | None,
61
+ list[offering.Offering] | None,
77
62
  Field(
78
- description='Inline offerings for campaigns without a product catalog. Each offering has a name, description, and associated assets.'
63
+ description='Offerings available for promotion. Each offering can include creative assets (via portfolio_ref or inline assets) for traditional ads. When si_agent_url is set at the parent level, hosts can offer conversational experiences about any of these offerings.'
79
64
  ),
80
65
  ] = None
81
66
  product_selectors: Annotated[
@@ -84,3 +69,9 @@ class PromotedOfferings(AdCPBaseModel):
84
69
  description='Selectors to choose which products/offerings from the brand manifest product catalog to promote'
85
70
  ),
86
71
  ] = None
72
+ si_agent_url: Annotated[
73
+ AnyUrl | None,
74
+ Field(
75
+ description="MCP endpoint URL for the brand's SI agent. When present, hosts can connect users to conversational experiences about any of the offerings. The agent handles si_get_offering lookups and full conversations."
76
+ ),
77
+ ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/promoted_products.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: core/property.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: core/property_id.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -0,0 +1,26 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/property_list_ref.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 AnyUrl, ConfigDict, Field
11
+
12
+
13
+ class PropertyListReference(AdCPBaseModel):
14
+ model_config = ConfigDict(
15
+ extra='forbid',
16
+ )
17
+ agent_url: Annotated[AnyUrl, Field(description='URL of the agent managing the property list')]
18
+ auth_token: Annotated[
19
+ str | None,
20
+ Field(
21
+ description='JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.'
22
+ ),
23
+ ] = None
24
+ list_id: Annotated[
25
+ str, Field(description='Identifier for the property list within the agent', min_length=1)
26
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/property_tag.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -0,0 +1,64 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/proposal.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 AwareDatetime, ConfigDict, Field
11
+
12
+ from . import ext as ext_1
13
+ from . import product_allocation
14
+
15
+
16
+ class TotalBudgetGuidance(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='allow',
19
+ )
20
+ currency: Annotated[str | None, Field(description='ISO 4217 currency code')] = None
21
+ max: Annotated[
22
+ float | None, Field(description='Maximum budget before diminishing returns', ge=0.0)
23
+ ] = None
24
+ min: Annotated[float | None, Field(description='Minimum recommended budget', ge=0.0)] = None
25
+ recommended: Annotated[
26
+ float | None, Field(description='Recommended budget for optimal performance', ge=0.0)
27
+ ] = None
28
+
29
+
30
+ class Proposal(AdCPBaseModel):
31
+ model_config = ConfigDict(
32
+ extra='allow',
33
+ )
34
+ allocations: Annotated[
35
+ list[product_allocation.ProductAllocation],
36
+ Field(
37
+ description='Budget allocations across products. Allocation percentages MUST sum to 100. Publishers are responsible for ensuring the sum equals 100; buyers SHOULD validate this before execution.',
38
+ min_length=1,
39
+ ),
40
+ ]
41
+ brief_alignment: Annotated[
42
+ str | None,
43
+ Field(description='Explanation of how this proposal aligns with the campaign brief'),
44
+ ] = None
45
+ description: Annotated[
46
+ str | None, Field(description='Explanation of the proposal strategy and what it achieves')
47
+ ] = None
48
+ expires_at: Annotated[
49
+ AwareDatetime | None,
50
+ Field(
51
+ description='When this proposal expires and can no longer be executed. After expiration, referenced products or pricing may no longer be available.'
52
+ ),
53
+ ] = None
54
+ ext: ext_1.ExtensionObject | None = None
55
+ name: Annotated[str, Field(description='Human-readable name for this media plan proposal')]
56
+ proposal_id: Annotated[
57
+ str,
58
+ Field(
59
+ description='Unique identifier for this proposal. Used to refine the proposal in subsequent get_products calls or to execute it via create_media_buy.'
60
+ ),
61
+ ]
62
+ total_budget_guidance: Annotated[
63
+ TotalBudgetGuidance | None, Field(description='Optional budget guidance for this proposal')
64
+ ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/protocol_envelope.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: core/publisher_property_selector.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: core/push_notification_config.json
3
- # timestamp: 2025-12-18T20:00: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: core/reporting_capabilities.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