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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +6 -14
  3. adcp/__main__.py +94 -51
  4. adcp/adagents.py +91 -19
  5. adcp/client.py +865 -0
  6. adcp/protocols/a2a.py +84 -0
  7. adcp/protocols/base.py +101 -0
  8. adcp/protocols/mcp.py +87 -1
  9. adcp/server/__init__.py +49 -0
  10. adcp/server/base.py +368 -0
  11. adcp/server/content_standards.py +561 -0
  12. adcp/server/governance.py +491 -0
  13. adcp/server/mcp_tools.py +471 -0
  14. adcp/server/proposal.py +334 -0
  15. adcp/server/sponsored_intelligence.py +444 -0
  16. adcp/types/__init__.py +111 -23
  17. adcp/types/_ergonomic.py +35 -18
  18. adcp/types/_generated.py +419 -44
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +103 -6
  22. adcp/types/generated_poc/content_standards/__init__.py +3 -0
  23. adcp/types/generated_poc/content_standards/artifact.py +208 -0
  24. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  25. adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  26. adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  27. adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  28. adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  29. adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  30. adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  31. adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  32. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  33. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  34. adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  35. adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  36. adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  37. adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  38. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  39. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  40. adcp/types/generated_poc/core/activation_key.py +1 -1
  41. adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
  42. adcp/types/generated_poc/core/assets/css_asset.py +1 -1
  43. adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
  44. adcp/types/generated_poc/core/assets/html_asset.py +1 -1
  45. adcp/types/generated_poc/core/assets/image_asset.py +1 -1
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
  47. adcp/types/generated_poc/core/assets/text_asset.py +1 -1
  48. adcp/types/generated_poc/core/assets/url_asset.py +1 -1
  49. adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
  50. adcp/types/generated_poc/core/assets/video_asset.py +1 -1
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
  52. adcp/types/generated_poc/core/async_response_data.py +1 -1
  53. adcp/types/generated_poc/core/brand_manifest.py +68 -5
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
  55. adcp/types/generated_poc/core/context.py +1 -1
  56. adcp/types/generated_poc/core/creative_asset.py +8 -7
  57. adcp/types/generated_poc/core/creative_assignment.py +1 -1
  58. adcp/types/generated_poc/core/creative_filters.py +4 -14
  59. adcp/types/generated_poc/core/creative_manifest.py +1 -1
  60. adcp/types/generated_poc/core/creative_policy.py +1 -1
  61. adcp/types/generated_poc/core/delivery_metrics.py +1 -1
  62. adcp/types/generated_poc/core/deployment.py +1 -1
  63. adcp/types/generated_poc/core/destination.py +1 -1
  64. adcp/types/generated_poc/core/error.py +1 -1
  65. adcp/types/generated_poc/core/ext.py +1 -1
  66. adcp/types/generated_poc/core/format.py +6 -5
  67. adcp/types/generated_poc/core/format_id.py +1 -1
  68. adcp/types/generated_poc/core/frequency_cap.py +1 -1
  69. adcp/types/generated_poc/core/identifier.py +27 -0
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
  71. adcp/types/generated_poc/core/measurement.py +1 -1
  72. adcp/types/generated_poc/core/media_buy.py +1 -1
  73. adcp/types/generated_poc/core/media_buy_features.py +29 -0
  74. adcp/types/generated_poc/core/offering.py +80 -0
  75. adcp/types/generated_poc/core/package.py +1 -1
  76. adcp/types/generated_poc/core/performance_feedback.py +1 -1
  77. adcp/types/generated_poc/core/placement.py +1 -1
  78. adcp/types/generated_poc/core/pricing_option.py +8 -14
  79. adcp/types/generated_poc/core/product.py +1 -1
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +72 -7
  82. adcp/types/generated_poc/core/promoted_offerings.py +12 -21
  83. adcp/types/generated_poc/core/promoted_products.py +1 -1
  84. adcp/types/generated_poc/core/property.py +1 -1
  85. adcp/types/generated_poc/core/property_id.py +1 -1
  86. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  87. adcp/types/generated_poc/core/property_tag.py +1 -1
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +1 -1
  90. adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
  91. adcp/types/generated_poc/core/push_notification_config.py +1 -1
  92. adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +1 -1
  95. adcp/types/generated_poc/core/signal_filters.py +1 -1
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +1 -1
  98. adcp/types/generated_poc/core/targeting.py +55 -14
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
  101. adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
  102. adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
  103. adcp/types/generated_poc/creative/preview_render.py +1 -1
  104. adcp/types/generated_poc/enums/adcp_domain.py +3 -1
  105. adcp/types/generated_poc/enums/asset_content_type.py +1 -1
  106. adcp/types/generated_poc/enums/auth_scheme.py +1 -1
  107. adcp/types/generated_poc/enums/available_metric.py +1 -1
  108. adcp/types/generated_poc/enums/channels.py +18 -8
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
  110. adcp/types/generated_poc/enums/creative_action.py +1 -1
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
  112. adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
  113. adcp/types/generated_poc/enums/creative_status.py +2 -1
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
  115. adcp/types/generated_poc/enums/daast_version.py +1 -1
  116. adcp/types/generated_poc/enums/delivery_type.py +1 -1
  117. adcp/types/generated_poc/enums/dimension_unit.py +1 -1
  118. adcp/types/generated_poc/enums/feed_format.py +1 -1
  119. adcp/types/generated_poc/enums/feedback_source.py +1 -1
  120. adcp/types/generated_poc/enums/format_category.py +1 -1
  121. adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +1 -1
  125. adcp/types/generated_poc/enums/http_method.py +1 -1
  126. adcp/types/generated_poc/enums/identifier_types.py +1 -1
  127. adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
  129. adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
  130. adcp/types/generated_poc/enums/media_buy_status.py +1 -1
  131. adcp/types/generated_poc/enums/metric_type.py +1 -1
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +1 -1
  134. adcp/types/generated_poc/enums/pacing.py +1 -1
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +1 -1
  137. adcp/types/generated_poc/enums/pricing_model.py +1 -1
  138. adcp/types/generated_poc/enums/property_type.py +2 -1
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
  140. adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
  142. adcp/types/generated_poc/enums/sort_direction.py +1 -1
  143. adcp/types/generated_poc/enums/task_status.py +1 -1
  144. adcp/types/generated_poc/enums/task_type.py +7 -1
  145. adcp/types/generated_poc/enums/update_frequency.py +1 -1
  146. adcp/types/generated_poc/enums/url_asset_type.py +1 -1
  147. adcp/types/generated_poc/enums/validation_mode.py +1 -1
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
  149. adcp/types/generated_poc/enums/vast_version.py +1 -1
  150. adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
  151. adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
  152. adcp/types/generated_poc/extensions/__init__.py +3 -0
  153. adcp/types/generated_poc/extensions/extension_meta.py +58 -0
  154. adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
  155. adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  158. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +1 -1
  159. adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
  160. adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
  162. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
  163. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
  164. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
  165. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
  166. adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
  167. adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
  169. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
  170. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
  171. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
  172. adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
  173. adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
  174. adcp/types/generated_poc/media_buy/package_request.py +15 -6
  175. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
  182. adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
  187. adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
  188. adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
  189. adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
  190. adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
  191. adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
  192. adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
  193. adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
  194. adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
  195. adcp/types/generated_poc/property/__init__.py +3 -0
  196. adcp/types/generated_poc/property/base_property_source.py +86 -0
  197. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  198. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  199. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  200. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  201. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  202. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  203. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  204. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  205. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  206. adcp/types/generated_poc/property/property_error.py +33 -0
  207. adcp/types/generated_poc/property/property_feature.py +22 -0
  208. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  209. adcp/types/generated_poc/property/property_list.py +62 -0
  210. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  211. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  212. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  213. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  214. adcp/types/generated_poc/protocol/__init__.py +3 -0
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  217. adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
  218. adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
  219. adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
  220. adcp/types/generated_poc/signals/get_signals_request.py +1 -1
  221. adcp/types/generated_poc/signals/get_signals_response.py +1 -1
  222. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  232. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  233. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  234. adcp/utils/format_assets.py +5 -5
  235. adcp/utils/preview_cache.py +2 -2
  236. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  237. adcp-3.0.0.dist-info/RECORD +264 -0
  238. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  239. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  240. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp-2.18.0.dist-info/RECORD +0 -195
  243. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  244. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  245. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: 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
 
@@ -17,13 +17,25 @@ class Parameters(AdCPBaseModel):
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)',
20
+ description='Target demographic in Nielsen format (P18-49, M25-54, W35+, etc.)',
21
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
 
@@ -39,10 +51,20 @@ class CppPricingOption(AdCPBaseModel):
39
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(
@@ -51,14 +73,15 @@ class CppPricingOption(AdCPBaseModel):
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)]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpv_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
 
@@ -14,7 +14,7 @@ class ViewThreshold(RootModel[float]):
14
14
  root: Annotated[
15
15
  float,
16
16
  Field(
17
- description='Percentage completion threshold for CPV pricing (0.0 to 1.0, e.g., 0.5 = 50% completion)',
17
+ description='Percentage completion threshold (0.0 to 1.0, e.g., 0.5 = 50%)',
18
18
  ge=0.0,
19
19
  le=1.0,
20
20
  ),
@@ -25,13 +25,7 @@ class ViewThreshold1(AdCPBaseModel):
25
25
  model_config = ConfigDict(
26
26
  extra='allow',
27
27
  )
28
- duration_seconds: Annotated[
29
- int,
30
- Field(
31
- description="Seconds of viewing required (e.g., 30 for YouTube-style '30 seconds = view')",
32
- ge=1,
33
- ),
34
- ]
28
+ duration_seconds: Annotated[int, Field(description='Seconds of viewing required', ge=1)]
35
29
 
36
30
 
37
31
  class Parameters(AdCPBaseModel):
@@ -41,6 +35,19 @@ class Parameters(AdCPBaseModel):
41
35
  view_threshold: ViewThreshold | ViewThreshold1
42
36
 
43
37
 
38
+ class PriceGuidance(AdCPBaseModel):
39
+ p25: Annotated[
40
+ float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
41
+ ] = None
42
+ p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
43
+ p75: Annotated[
44
+ float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
45
+ ] = None
46
+ p90: Annotated[
47
+ float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
48
+ ] = None
49
+
50
+
44
51
  class CpvPricingOption(AdCPBaseModel):
45
52
  model_config = ConfigDict(
46
53
  extra='allow',
@@ -53,10 +60,20 @@ class CpvPricingOption(AdCPBaseModel):
53
60
  pattern='^[A-Z]{3}$',
54
61
  ),
55
62
  ]
56
- is_fixed: Annotated[
57
- Literal[True],
58
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
59
- ]
63
+ fixed_price: Annotated[
64
+ float | None,
65
+ Field(
66
+ description='Fixed price per view. If present, this is fixed pricing. If absent, auction-based.',
67
+ ge=0.0,
68
+ ),
69
+ ] = None
70
+ floor_price: Annotated[
71
+ float | None,
72
+ Field(
73
+ description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
74
+ ge=0.0,
75
+ ),
76
+ ] = None
60
77
  min_spend_per_package: Annotated[
61
78
  float | None,
62
79
  Field(
@@ -67,11 +84,13 @@ class CpvPricingOption(AdCPBaseModel):
67
84
  parameters: Annotated[
68
85
  Parameters, Field(description='CPV-specific parameters defining the view threshold')
69
86
  ]
70
- pricing_model: Annotated[Literal['cpv'], Field(description='Cost per view at threshold')]
71
- pricing_option_id: Annotated[
72
- str,
87
+ price_guidance: Annotated[
88
+ PriceGuidance | None,
73
89
  Field(
74
- description="Unique identifier for this pricing option within the product (e.g., 'cpv_usd_50pct')"
90
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
75
91
  ),
92
+ ] = None
93
+ pricing_model: Annotated[Literal['cpv'], Field(description='Cost per view at threshold')]
94
+ pricing_option_id: Annotated[
95
+ str, Field(description='Unique identifier for this pricing option within the product')
76
96
  ]
77
- rate: Annotated[float, Field(description='Fixed CPV rate (cost per view)', ge=0.0)]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/flat_rate_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
 
@@ -14,43 +14,37 @@ class Parameters(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
15
  extra='allow',
16
16
  )
17
- daypart: Annotated[
18
- str | None,
19
- Field(
20
- description="Specific daypart for time-based pricing (e.g., 'morning_commute', 'evening_prime', 'overnight')"
21
- ),
22
- ] = None
17
+ daypart: Annotated[str | None, Field(description='Specific daypart for time-based pricing')] = (
18
+ None
19
+ )
23
20
  duration_hours: Annotated[
24
- float | None,
25
- Field(description='Duration in hours for time-based flat rate pricing (DOOH)', ge=0.0),
21
+ float | None, Field(description='Duration in hours for time-based pricing', ge=0.0)
26
22
  ] = None
27
23
  estimated_impressions: Annotated[
28
- int | None,
29
- Field(
30
- description='Estimated impressions for this flat rate option (informational, commonly used with SOV or time-based DOOH)',
31
- ge=0,
32
- ),
24
+ int | None, Field(description='Estimated impressions (informational)', ge=0)
33
25
  ] = None
34
26
  loop_duration_seconds: Annotated[
35
- int | None, Field(description='Duration of ad loop rotation in seconds (DOOH)', ge=1)
36
- ] = None
37
- min_plays_per_hour: Annotated[
38
- int | None,
39
- Field(
40
- description='Minimum number of times ad plays per hour (DOOH frequency guarantee)', ge=0
41
- ),
27
+ int | None, Field(description='Duration of ad loop rotation in seconds', ge=1)
42
28
  ] = None
29
+ min_plays_per_hour: Annotated[int | None, Field(description='Minimum plays per hour', ge=0)] = (
30
+ None
31
+ )
43
32
  sov_percentage: Annotated[
44
- float | None,
45
- Field(
46
- description='Guaranteed share of voice as percentage (DOOH, 0-100)', ge=0.0, le=100.0
47
- ),
33
+ float | None, Field(description='Guaranteed share of voice (0-100)', ge=0.0, le=100.0)
48
34
  ] = None
49
- venue_package: Annotated[
50
- str | None,
51
- Field(
52
- description="Named venue package identifier for DOOH (e.g., 'times_square_network', 'airport_terminals')"
53
- ),
35
+ venue_package: Annotated[str | None, Field(description='Named venue package identifier')] = None
36
+
37
+
38
+ class PriceGuidance(AdCPBaseModel):
39
+ p25: Annotated[
40
+ float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
41
+ ] = None
42
+ p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
43
+ p75: Annotated[
44
+ float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
45
+ ] = None
46
+ p90: Annotated[
47
+ float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
54
48
  ] = None
55
49
 
56
50
 
@@ -66,10 +60,20 @@ class FlatRatePricingOption(AdCPBaseModel):
66
60
  pattern='^[A-Z]{3}$',
67
61
  ),
68
62
  ]
69
- is_fixed: Annotated[
70
- Literal[True],
71
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
72
- ]
63
+ fixed_price: Annotated[
64
+ float | None,
65
+ Field(
66
+ description='Flat rate cost. If present, this is fixed pricing. If absent, auction-based.',
67
+ ge=0.0,
68
+ ),
69
+ ] = None
70
+ floor_price: Annotated[
71
+ float | None,
72
+ Field(
73
+ description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
74
+ ge=0.0,
75
+ ),
76
+ ] = None
73
77
  min_spend_per_package: Annotated[
74
78
  float | None,
75
79
  Field(
@@ -81,13 +85,15 @@ class FlatRatePricingOption(AdCPBaseModel):
81
85
  Parameters | None,
82
86
  Field(description='Flat rate parameters for DOOH and time-based campaigns'),
83
87
  ] = None
88
+ price_guidance: Annotated[
89
+ PriceGuidance | None,
90
+ Field(
91
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
92
+ ),
93
+ ] = None
84
94
  pricing_model: Annotated[
85
95
  Literal['flat_rate'], Field(description='Fixed cost regardless of delivery volume')
86
96
  ]
87
97
  pricing_option_id: Annotated[
88
- str,
89
- Field(
90
- description="Unique identifier for this pricing option within the product (e.g., 'flat_rate_usd_24h_takeover')"
91
- ),
98
+ str, Field(description='Unique identifier for this pricing option within the product')
92
99
  ]
93
- rate: Annotated[float, Field(description='Flat rate cost', ge=0.0)]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: pricing_options/vcpm_auction_option.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
2
+ # filename: pricing_options/vcpm_option.json
3
+ # timestamp: 2026-01-26T11:40:01+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -11,7 +11,6 @@ from pydantic import ConfigDict, Field
11
11
 
12
12
 
13
13
  class PriceGuidance(AdCPBaseModel):
14
- floor: Annotated[float, Field(description='Minimum acceptable bid price', ge=0.0)]
15
14
  p25: Annotated[
16
15
  float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
17
16
  ] = None
@@ -24,7 +23,7 @@ class PriceGuidance(AdCPBaseModel):
24
23
  ] = None
25
24
 
26
25
 
27
- class VcpmAuctionPricingOption(AdCPBaseModel):
26
+ class VcpmPricingOption(AdCPBaseModel):
28
27
  model_config = ConfigDict(
29
28
  extra='allow',
30
29
  )
@@ -36,10 +35,20 @@ class VcpmAuctionPricingOption(AdCPBaseModel):
36
35
  pattern='^[A-Z]{3}$',
37
36
  ),
38
37
  ]
39
- is_fixed: Annotated[
40
- Literal[False],
41
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
42
- ]
38
+ fixed_price: Annotated[
39
+ float | None,
40
+ Field(
41
+ description='Fixed price per unit. 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
43
52
  min_spend_per_package: Annotated[
44
53
  float | None,
45
54
  Field(
@@ -48,14 +57,14 @@ class VcpmAuctionPricingOption(AdCPBaseModel):
48
57
  ),
49
58
  ] = None
50
59
  price_guidance: Annotated[
51
- PriceGuidance, Field(description='Statistical guidance for auction pricing')
52
- ]
60
+ PriceGuidance | None,
61
+ Field(
62
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
63
+ ),
64
+ ] = None
53
65
  pricing_model: Annotated[
54
66
  Literal['vcpm'], Field(description='Cost per 1,000 viewable impressions (MRC standard)')
55
67
  ]
56
68
  pricing_option_id: Annotated[
57
- str,
58
- Field(
59
- description="Unique identifier for this pricing option within the product (e.g., 'vcpm_usd_auction')"
60
- ),
69
+ str, Field(description='Unique identifier for this pricing option within the product')
61
70
  ]
@@ -0,0 +1,3 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: .schema_temp
3
+ # timestamp: 2026-01-14T17:08:13+00:00
@@ -0,0 +1,86 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/base_property_source.json
3
+ # timestamp: 2026-01-25T21:17:54+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, RootModel
11
+
12
+ from ..core import identifier, property_id, property_tag
13
+
14
+
15
+ class BasePropertySource1(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='forbid',
18
+ )
19
+ publisher_domain: Annotated[
20
+ str,
21
+ Field(
22
+ description="Domain where publisher's adagents.json is hosted (e.g., 'raptive.com')",
23
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
24
+ ),
25
+ ]
26
+ selection_type: Annotated[
27
+ Literal['publisher_tags'],
28
+ Field(description='Discriminator indicating selection by property tags within a publisher'),
29
+ ]
30
+ tags: Annotated[
31
+ list[property_tag.PropertyTag],
32
+ Field(
33
+ description="Property tags from the publisher's adagents.json. Selects all properties with these tags.",
34
+ min_length=1,
35
+ ),
36
+ ]
37
+
38
+
39
+ class BasePropertySource2(AdCPBaseModel):
40
+ model_config = ConfigDict(
41
+ extra='forbid',
42
+ )
43
+ property_ids: Annotated[
44
+ list[property_id.PropertyId],
45
+ Field(description="Specific property IDs from the publisher's adagents.json", min_length=1),
46
+ ]
47
+ publisher_domain: Annotated[
48
+ str,
49
+ Field(
50
+ description="Domain where publisher's adagents.json is hosted (e.g., 'raptive.com')",
51
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
52
+ ),
53
+ ]
54
+ selection_type: Annotated[
55
+ Literal['publisher_ids'],
56
+ Field(
57
+ description='Discriminator indicating selection by specific property IDs within a publisher'
58
+ ),
59
+ ]
60
+
61
+
62
+ class BasePropertySource3(AdCPBaseModel):
63
+ model_config = ConfigDict(
64
+ extra='forbid',
65
+ )
66
+ identifiers: Annotated[
67
+ list[identifier.Identifier],
68
+ Field(description='Direct property identifiers (domains, app IDs, etc.)', min_length=1),
69
+ ]
70
+ selection_type: Annotated[
71
+ Literal['identifiers'],
72
+ Field(description='Discriminator indicating selection by direct identifiers'),
73
+ ]
74
+
75
+
76
+ class BasePropertySource(
77
+ RootModel[BasePropertySource1 | BasePropertySource2 | BasePropertySource3]
78
+ ):
79
+ root: Annotated[
80
+ BasePropertySource1 | BasePropertySource2 | BasePropertySource3,
81
+ Field(
82
+ description='A source of properties for a property list. Supports three selection patterns: publisher with tags, publisher with property IDs, or direct identifiers.',
83
+ discriminator='selection_type',
84
+ title='Base Property Source',
85
+ ),
86
+ ]
@@ -0,0 +1,43 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/create_property_list_request.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 ..core import brand_manifest as brand_manifest_1
13
+ from ..core import context as context_1
14
+ from ..core import ext as ext_1
15
+ from . import base_property_source, property_list_filters
16
+
17
+
18
+ class CreatePropertyListRequest(AdCPBaseModel):
19
+ model_config = ConfigDict(
20
+ extra='forbid',
21
+ )
22
+ base_properties: Annotated[
23
+ list[base_property_source.BasePropertySource] | None,
24
+ Field(
25
+ description="Array of property sources to evaluate. Each entry is a discriminated union: publisher_tags (publisher_domain + tags), publisher_ids (publisher_domain + property_ids), or identifiers (direct identifiers). If omitted, queries the agent's entire property database."
26
+ ),
27
+ ] = None
28
+ brand_manifest: Annotated[
29
+ brand_manifest_1.BrandManifest | None,
30
+ Field(
31
+ description='Brand identity and requirements. When provided, the agent automatically applies appropriate rules based on brand characteristics (industry, target_audience, etc.).'
32
+ ),
33
+ ] = None
34
+ context: context_1.ContextObject | None = None
35
+ description: Annotated[str | None, Field(description="Description of the list's purpose")] = (
36
+ None
37
+ )
38
+ ext: ext_1.ExtensionObject | None = None
39
+ filters: Annotated[
40
+ property_list_filters.PropertyListFilters | None,
41
+ Field(description='Dynamic filters to apply when resolving the list'),
42
+ ] = None
43
+ name: Annotated[str, Field(description='Human-readable name for the list')]
@@ -0,0 +1,27 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/create_property_list_response.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 ..core import ext as ext_1
13
+ from . import property_list
14
+
15
+
16
+ class CreatePropertyListResponse(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ auth_token: Annotated[
21
+ str,
22
+ Field(
23
+ description='Token that can be shared with sellers to authorize fetching this list. Store this - it is only returned at creation time.'
24
+ ),
25
+ ]
26
+ ext: ext_1.ExtensionObject | None = None
27
+ list: Annotated[property_list.PropertyList, Field(description='The created property list')]
@@ -0,0 +1,22 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/delete_property_list_request.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 ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class DeletePropertyListRequest(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ context: context_1.ContextObject | None = None
21
+ ext: ext_1.ExtensionObject | None = None
22
+ list_id: Annotated[str, Field(description='ID of the property list to delete')]
@@ -0,0 +1,21 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/delete_property_list_response.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 ..core import ext as ext_1
13
+
14
+
15
+ class DeletePropertyListResponse(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='forbid',
18
+ )
19
+ deleted: Annotated[bool, Field(description='Whether the list was successfully deleted')]
20
+ ext: ext_1.ExtensionObject | None = None
21
+ list_id: Annotated[str, Field(description='ID of the deleted list')]
@@ -0,0 +1,42 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/feature_requirement.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated, Any
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import ConfigDict, Field
12
+
13
+
14
+ class IfNotCovered(Enum):
15
+ exclude = 'exclude'
16
+ include = 'include'
17
+
18
+
19
+ class FeatureRequirement(AdCPBaseModel):
20
+ model_config = ConfigDict(
21
+ extra='forbid',
22
+ )
23
+ allowed_values: Annotated[
24
+ list[Any] | None,
25
+ Field(description='Values that pass the requirement (for binary/categorical features)'),
26
+ ] = None
27
+ feature_id: Annotated[
28
+ str, Field(description='Feature to evaluate (discovered via list_property_features)')
29
+ ]
30
+ if_not_covered: Annotated[
31
+ IfNotCovered | None,
32
+ Field(
33
+ description="How to handle properties where this feature is not covered. 'exclude' (default): property is removed from the list. 'include': property passes this requirement (fail-open)."
34
+ ),
35
+ ] = IfNotCovered.exclude
36
+ max_value: Annotated[
37
+ float | None, Field(description='Maximum numeric value allowed (for quantitative features)')
38
+ ] = None
39
+ min_value: Annotated[
40
+ float | None,
41
+ Field(description='Minimum numeric value required (for quantitative features)'),
42
+ ] = None
@@ -0,0 +1,34 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/get_property_list_request.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 ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class GetPropertyListRequest(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ context: context_1.ContextObject | None = None
21
+ cursor: Annotated[str | None, Field(description='Pagination cursor for large result sets')] = (
22
+ None
23
+ )
24
+ ext: ext_1.ExtensionObject | None = None
25
+ list_id: Annotated[str, Field(description='ID of the property list to retrieve')]
26
+ max_results: Annotated[
27
+ int | None, Field(description='Maximum identifiers to return (for large lists)', ge=1)
28
+ ] = None
29
+ resolve: Annotated[
30
+ bool | None,
31
+ Field(
32
+ description='Whether to apply filters and return resolved identifiers (default: true)'
33
+ ),
34
+ ] = True