adcp 2.19.0__py3-none-any.whl → 3.1.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 +14 -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 +115 -23
  17. adcp/types/_ergonomic.py +35 -14
  18. adcp/types/_generated.py +346 -52
  19. adcp/types/aliases.py +68 -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.1.0.dist-info}/METADATA +1 -1
  235. adcp-3.1.0.dist-info/RECORD +264 -0
  236. {adcp-2.19.0.dist-info → adcp-3.1.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.1.0.dist-info}/entry_points.txt +0 -0
  246. {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/licenses/LICENSE +0 -0
  247. {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/top_level.txt +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
  ),
@@ -23,55 +23,74 @@ class ViewThreshold(RootModel[float]):
23
23
 
24
24
  class ViewThreshold1(AdCPBaseModel):
25
25
  model_config = ConfigDict(
26
- extra="allow",
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):
38
32
  model_config = ConfigDict(
39
- extra="allow",
33
+ extra='allow',
40
34
  )
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
- extra="allow",
53
+ extra='allow',
47
54
  )
48
55
  currency: Annotated[
49
56
  str,
50
57
  Field(
51
- description="ISO 4217 currency code",
52
- examples=["USD", "EUR", "GBP", "JPY"],
53
- pattern="^[A-Z]{3}$",
58
+ description='ISO 4217 currency code',
59
+ examples=['USD', 'EUR', 'GBP', 'JPY'],
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(
63
- description="Minimum spend requirement per package using this pricing option, in the specified currency",
80
+ description='Minimum spend requirement per package using this pricing option, in the specified currency',
64
81
  ge=0.0,
65
82
  ),
66
83
  ] = None
67
84
  parameters: Annotated[
68
- Parameters, Field(description="CPV-specific parameters defining the view threshold")
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
 
@@ -12,82 +12,88 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class Parameters(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra="allow",
15
+ extra='allow',
16
+ )
17
+ daypart: Annotated[str | None, Field(description='Specific daypart for time-based pricing')] = (
18
+ None
16
19
  )
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
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
 
57
51
  class FlatRatePricingOption(AdCPBaseModel):
58
52
  model_config = ConfigDict(
59
- extra="allow",
53
+ extra='allow',
60
54
  )
61
55
  currency: Annotated[
62
56
  str,
63
57
  Field(
64
- description="ISO 4217 currency code",
65
- examples=["USD", "EUR", "GBP", "JPY"],
66
- pattern="^[A-Z]{3}$",
58
+ description='ISO 4217 currency code',
59
+ examples=['USD', 'EUR', 'GBP', 'JPY'],
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(
76
- description="Minimum spend requirement per package using this pricing option, in the specified currency",
80
+ description='Minimum spend requirement per package using this pricing option, in the specified currency',
77
81
  ge=0.0,
78
82
  ),
79
83
  ] = None
80
84
  parameters: Annotated[
81
85
  Parameters | None,
82
- Field(description="Flat rate parameters for DOOH and time-based campaigns"),
86
+ Field(description='Flat rate parameters for DOOH and time-based campaigns'),
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
+ ),
83
93
  ] = None
84
94
  pricing_model: Annotated[
85
- Literal["flat_rate"], Field(description="Fixed cost regardless of delivery volume")
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)]
@@ -0,0 +1,70 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: pricing_options/vcpm_option.json
3
+ # timestamp: 2026-01-26T11:40:01+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated, Literal
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+
13
+ class PriceGuidance(AdCPBaseModel):
14
+ p25: Annotated[
15
+ float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
16
+ ] = None
17
+ p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
18
+ p75: Annotated[
19
+ float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
20
+ ] = None
21
+ p90: Annotated[
22
+ float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
23
+ ] = None
24
+
25
+
26
+ class VcpmPricingOption(AdCPBaseModel):
27
+ model_config = ConfigDict(
28
+ extra='allow',
29
+ )
30
+ currency: Annotated[
31
+ str,
32
+ Field(
33
+ description='ISO 4217 currency code',
34
+ examples=['USD', 'EUR', 'GBP', 'JPY'],
35
+ pattern='^[A-Z]{3}$',
36
+ ),
37
+ ]
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
52
+ min_spend_per_package: Annotated[
53
+ float | None,
54
+ Field(
55
+ description='Minimum spend requirement per package using this pricing option, in the specified currency',
56
+ ge=0.0,
57
+ ),
58
+ ] = None
59
+ price_guidance: Annotated[
60
+ PriceGuidance | None,
61
+ Field(
62
+ description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
63
+ ),
64
+ ] = None
65
+ pricing_model: Annotated[
66
+ Literal['vcpm'], Field(description='Cost per 1,000 viewable impressions (MRC standard)')
67
+ ]
68
+ pricing_option_id: Annotated[
69
+ str, Field(description='Unique identifier for this pricing option within the product')
70
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property/base_property_source.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,18 +14,18 @@ from ..core import identifier, property_id, property_tag
14
14
 
15
15
  class BasePropertySource1(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra="forbid",
17
+ extra='forbid',
18
18
  )
19
19
  publisher_domain: Annotated[
20
20
  str,
21
21
  Field(
22
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])?)*$",
23
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
24
24
  ),
25
25
  ]
26
26
  selection_type: Annotated[
27
- Literal["publisher_tags"],
28
- Field(description="Discriminator indicating selection by property tags within a publisher"),
27
+ Literal['publisher_tags'],
28
+ Field(description='Discriminator indicating selection by property tags within a publisher'),
29
29
  ]
30
30
  tags: Annotated[
31
31
  list[property_tag.PropertyTag],
@@ -38,7 +38,7 @@ class BasePropertySource1(AdCPBaseModel):
38
38
 
39
39
  class BasePropertySource2(AdCPBaseModel):
40
40
  model_config = ConfigDict(
41
- extra="forbid",
41
+ extra='forbid',
42
42
  )
43
43
  property_ids: Annotated[
44
44
  list[property_id.PropertyId],
@@ -48,28 +48,28 @@ class BasePropertySource2(AdCPBaseModel):
48
48
  str,
49
49
  Field(
50
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])?)*$",
51
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
52
52
  ),
53
53
  ]
54
54
  selection_type: Annotated[
55
- Literal["publisher_ids"],
55
+ Literal['publisher_ids'],
56
56
  Field(
57
- description="Discriminator indicating selection by specific property IDs within a publisher"
57
+ description='Discriminator indicating selection by specific property IDs within a publisher'
58
58
  ),
59
59
  ]
60
60
 
61
61
 
62
62
  class BasePropertySource3(AdCPBaseModel):
63
63
  model_config = ConfigDict(
64
- extra="forbid",
64
+ extra='forbid',
65
65
  )
66
66
  identifiers: Annotated[
67
67
  list[identifier.Identifier],
68
- Field(description="Direct property identifiers (domains, app IDs, etc.)", min_length=1),
68
+ Field(description='Direct property identifiers (domains, app IDs, etc.)', min_length=1),
69
69
  ]
70
70
  selection_type: Annotated[
71
- Literal["identifiers"],
72
- Field(description="Discriminator indicating selection by direct identifiers"),
71
+ Literal['identifiers'],
72
+ Field(description='Discriminator indicating selection by direct identifiers'),
73
73
  ]
74
74
 
75
75
 
@@ -79,8 +79,8 @@ class BasePropertySource(
79
79
  root: Annotated[
80
80
  BasePropertySource1 | BasePropertySource2 | BasePropertySource3,
81
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",
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
85
  ),
86
86
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property/create_property_list_request.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -17,7 +17,7 @@ from . import base_property_source, property_list_filters
17
17
 
18
18
  class CreatePropertyListRequest(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra="forbid",
20
+ extra='forbid',
21
21
  )
22
22
  base_properties: Annotated[
23
23
  list[base_property_source.BasePropertySource] | None,
@@ -28,7 +28,7 @@ class CreatePropertyListRequest(AdCPBaseModel):
28
28
  brand_manifest: Annotated[
29
29
  brand_manifest_1.BrandManifest | None,
30
30
  Field(
31
- description="Brand identity and requirements. When provided, the agent automatically applies appropriate rules based on brand characteristics (industry, target_audience, etc.)."
31
+ description='Brand identity and requirements. When provided, the agent automatically applies appropriate rules based on brand characteristics (industry, target_audience, etc.).'
32
32
  ),
33
33
  ] = None
34
34
  context: context_1.ContextObject | None = None
@@ -38,6 +38,6 @@ class CreatePropertyListRequest(AdCPBaseModel):
38
38
  ext: ext_1.ExtensionObject | None = None
39
39
  filters: Annotated[
40
40
  property_list_filters.PropertyListFilters | None,
41
- Field(description="Dynamic filters to apply when resolving the list"),
41
+ Field(description='Dynamic filters to apply when resolving the list'),
42
42
  ] = None
43
- name: Annotated[str, Field(description="Human-readable name for the list")]
43
+ name: Annotated[str, Field(description='Human-readable name for the list')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property/create_property_list_response.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,13 +15,13 @@ from . import property_list
15
15
 
16
16
  class CreatePropertyListResponse(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra="forbid",
18
+ extra='forbid',
19
19
  )
20
20
  auth_token: Annotated[
21
21
  str,
22
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."
23
+ description='Token that can be shared with sellers to authorize fetching this list. Store this - it is only returned at creation time.'
24
24
  ),
25
25
  ]
26
26
  ext: ext_1.ExtensionObject | None = None
27
- list: Annotated[property_list.PropertyList, Field(description="The created property list")]
27
+ list: Annotated[property_list.PropertyList, Field(description='The created property list')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property/delete_property_list_request.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,8 +15,8 @@ from ..core import ext as ext_1
15
15
 
16
16
  class DeletePropertyListRequest(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra="forbid",
18
+ extra='forbid',
19
19
  )
20
20
  context: context_1.ContextObject | None = None
21
21
  ext: ext_1.ExtensionObject | None = None
22
- list_id: Annotated[str, Field(description="ID of the property list to delete")]
22
+ list_id: Annotated[str, Field(description='ID of the property list to delete')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property/delete_property_list_response.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,8 +14,8 @@ from ..core import ext as ext_1
14
14
 
15
15
  class DeletePropertyListResponse(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra="forbid",
17
+ extra='forbid',
18
18
  )
19
- deleted: Annotated[bool, Field(description="Whether the list was successfully deleted")]
19
+ deleted: Annotated[bool, Field(description='Whether the list was successfully deleted')]
20
20
  ext: ext_1.ExtensionObject | None = None
21
- list_id: Annotated[str, Field(description="ID of the deleted list")]
21
+ list_id: Annotated[str, Field(description='ID of the deleted list')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property/feature_requirement.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,20 +12,20 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
 
14
14
  class IfNotCovered(Enum):
15
- exclude = "exclude"
16
- include = "include"
15
+ exclude = 'exclude'
16
+ include = 'include'
17
17
 
18
18
 
19
19
  class FeatureRequirement(AdCPBaseModel):
20
20
  model_config = ConfigDict(
21
- extra="forbid",
21
+ extra='forbid',
22
22
  )
23
23
  allowed_values: Annotated[
24
24
  list[Any] | None,
25
- Field(description="Values that pass the requirement (for binary/categorical features)"),
25
+ Field(description='Values that pass the requirement (for binary/categorical features)'),
26
26
  ] = None
27
27
  feature_id: Annotated[
28
- str, Field(description="Feature to evaluate (discovered via list_property_features)")
28
+ str, Field(description='Feature to evaluate (discovered via list_property_features)')
29
29
  ]
30
30
  if_not_covered: Annotated[
31
31
  IfNotCovered | None,
@@ -34,9 +34,9 @@ class FeatureRequirement(AdCPBaseModel):
34
34
  ),
35
35
  ] = IfNotCovered.exclude
36
36
  max_value: Annotated[
37
- float | None, Field(description="Maximum numeric value allowed (for quantitative features)")
37
+ float | None, Field(description='Maximum numeric value allowed (for quantitative features)')
38
38
  ] = None
39
39
  min_value: Annotated[
40
40
  float | None,
41
- Field(description="Minimum numeric value required (for quantitative features)"),
41
+ Field(description='Minimum numeric value required (for quantitative features)'),
42
42
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property/get_property_list_request.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,20 +15,20 @@ from ..core import ext as ext_1
15
15
 
16
16
  class GetPropertyListRequest(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra="forbid",
18
+ extra='forbid',
19
19
  )
20
20
  context: context_1.ContextObject | None = None
21
- cursor: Annotated[str | None, Field(description="Pagination cursor for large result sets")] = (
21
+ cursor: Annotated[str | None, Field(description='Pagination cursor for large result sets')] = (
22
22
  None
23
23
  )
24
24
  ext: ext_1.ExtensionObject | None = None
25
- list_id: Annotated[str, Field(description="ID of the property list to retrieve")]
25
+ list_id: Annotated[str, Field(description='ID of the property list to retrieve')]
26
26
  max_results: Annotated[
27
- int | None, Field(description="Maximum identifiers to return (for large lists)", ge=1)
27
+ int | None, Field(description='Maximum identifiers to return (for large lists)', ge=1)
28
28
  ] = None
29
29
  resolve: Annotated[
30
30
  bool | None,
31
31
  Field(
32
- description="Whether to apply filters and return resolved identifiers (default: true)"
32
+ description='Whether to apply filters and return resolved identifiers (default: true)'
33
33
  ),
34
34
  ] = True
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property/get_property_list_response.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -16,20 +16,20 @@ from . import property_list
16
16
 
17
17
  class Pagination(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra="forbid",
19
+ extra='forbid',
20
20
  )
21
- cursor: Annotated[str | None, Field(description="Cursor for next page")] = None
22
- has_more: Annotated[bool | None, Field(description="Whether more results are available")] = None
21
+ cursor: Annotated[str | None, Field(description='Cursor for next page')] = None
22
+ has_more: Annotated[bool | None, Field(description='Whether more results are available')] = None
23
23
 
24
24
 
25
25
  class GetPropertyListResponse(AdCPBaseModel):
26
26
  model_config = ConfigDict(
27
- extra="forbid",
27
+ extra='forbid',
28
28
  )
29
29
  cache_valid_until: Annotated[
30
30
  AwareDatetime | None,
31
31
  Field(
32
- description="Cache expiration timestamp. Re-fetch the list after this time to get updated identifiers."
32
+ description='Cache expiration timestamp. Re-fetch the list after this time to get updated identifiers.'
33
33
  ),
34
34
  ] = None
35
35
  coverage_gaps: Annotated[
@@ -42,20 +42,20 @@ class GetPropertyListResponse(AdCPBaseModel):
42
42
  identifiers: Annotated[
43
43
  list[identifier.Identifier] | None,
44
44
  Field(
45
- description="Resolved identifiers that passed filters (if resolve=true). Cache these locally for real-time use."
45
+ description='Resolved identifiers that passed filters (if resolve=true). Cache these locally for real-time use.'
46
46
  ),
47
47
  ] = None
48
48
  list: Annotated[
49
49
  property_list.PropertyList,
50
- Field(description="The property list metadata (always returned)"),
50
+ Field(description='The property list metadata (always returned)'),
51
51
  ]
52
- pagination: Annotated[Pagination | None, Field(description="Pagination information")] = None
52
+ pagination: Annotated[Pagination | None, Field(description='Pagination information')] = None
53
53
  resolved_at: Annotated[
54
- AwareDatetime | None, Field(description="When the list was resolved")
54
+ AwareDatetime | None, Field(description='When the list was resolved')
55
55
  ] = None
56
56
  returned_count: Annotated[
57
- int | None, Field(description="Number of identifiers returned in this response")
57
+ int | None, Field(description='Number of identifiers returned in this response')
58
58
  ] = None
59
59
  total_count: Annotated[
60
- int | None, Field(description="Total number of identifiers in resolved list")
60
+ int | None, Field(description='Total number of identifiers in resolved list')
61
61
  ] = None