adcp 3.1.0__py3-none-any.whl → 3.2.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 (242) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +5 -5
  3. adcp/__main__.py +4 -4
  4. adcp/adagents.py +5 -9
  5. adcp/client.py +14 -12
  6. adcp/protocols/a2a.py +3 -3
  7. adcp/protocols/base.py +2 -2
  8. adcp/protocols/mcp.py +3 -3
  9. adcp/server/base.py +6 -10
  10. adcp/server/content_standards.py +17 -49
  11. adcp/server/governance.py +20 -59
  12. adcp/server/mcp_tools.py +8 -4
  13. adcp/server/proposal.py +1 -3
  14. adcp/server/sponsored_intelligence.py +10 -28
  15. adcp/simple.py +10 -10
  16. adcp/types/__init__.py +10 -6
  17. adcp/types/_generated.py +44 -27
  18. adcp/types/base.py +7 -7
  19. adcp/types/generated_poc/{protocols → a2ui}/__init__.py +1 -1
  20. adcp/types/generated_poc/a2ui/component.py +24 -0
  21. adcp/types/generated_poc/a2ui/surface.py +33 -0
  22. adcp/types/generated_poc/account/__init__.py +3 -0
  23. adcp/types/generated_poc/account/list_accounts_request.py +30 -0
  24. adcp/types/generated_poc/account/list_accounts_response.py +30 -0
  25. adcp/types/generated_poc/adagents.py +192 -195
  26. adcp/types/generated_poc/content_standards/artifact.py +69 -69
  27. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +13 -13
  28. adcp/types/generated_poc/content_standards/calibrate_content_request.py +2 -2
  29. adcp/types/generated_poc/content_standards/calibrate_content_response.py +17 -17
  30. adcp/types/generated_poc/content_standards/content_standards.py +8 -8
  31. adcp/types/generated_poc/content_standards/create_content_standards_request.py +13 -13
  32. adcp/types/generated_poc/content_standards/create_content_standards_response.py +6 -6
  33. adcp/types/generated_poc/content_standards/get_content_standards_request.py +1 -1
  34. adcp/types/generated_poc/content_standards/get_content_standards_response.py +4 -4
  35. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +14 -14
  36. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +30 -30
  37. adcp/types/generated_poc/content_standards/list_content_standards_request.py +4 -4
  38. adcp/types/generated_poc/content_standards/list_content_standards_response.py +5 -5
  39. adcp/types/generated_poc/content_standards/update_content_standards_request.py +14 -14
  40. adcp/types/generated_poc/content_standards/update_content_standards_response.py +4 -4
  41. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +13 -13
  42. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +16 -16
  43. adcp/types/generated_poc/core/account.py +54 -0
  44. adcp/types/generated_poc/core/activation_key.py +8 -8
  45. adcp/types/generated_poc/core/assets/audio_asset.py +37 -8
  46. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  47. adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
  48. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  49. adcp/types/generated_poc/core/assets/image_asset.py +6 -6
  50. adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
  51. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  52. adcp/types/generated_poc/core/assets/url_asset.py +3 -3
  53. adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
  54. adcp/types/generated_poc/core/assets/video_asset.py +126 -10
  55. adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
  56. adcp/types/generated_poc/core/async_response_data.py +2 -2
  57. adcp/types/generated_poc/core/brand_manifest.py +66 -66
  58. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  59. adcp/types/generated_poc/core/context.py +1 -1
  60. adcp/types/generated_poc/core/creative_asset.py +12 -12
  61. adcp/types/generated_poc/core/creative_assignment.py +3 -3
  62. adcp/types/generated_poc/core/creative_filters.py +23 -17
  63. adcp/types/generated_poc/core/creative_manifest.py +4 -4
  64. adcp/types/generated_poc/core/creative_policy.py +4 -4
  65. adcp/types/generated_poc/core/delivery_metrics.py +32 -32
  66. adcp/types/generated_poc/core/deployment.py +20 -20
  67. adcp/types/generated_poc/core/destination.py +11 -11
  68. adcp/types/generated_poc/core/error.py +6 -6
  69. adcp/types/generated_poc/core/ext.py +1 -1
  70. adcp/types/generated_poc/core/format.py +49 -124
  71. adcp/types/generated_poc/core/format_id.py +5 -5
  72. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  73. adcp/types/generated_poc/core/identifier.py +2 -2
  74. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  75. adcp/types/generated_poc/core/measurement.py +8 -8
  76. adcp/types/generated_poc/core/media_buy.py +12 -8
  77. adcp/types/generated_poc/core/media_buy_features.py +3 -3
  78. adcp/types/generated_poc/core/offering.py +9 -9
  79. adcp/types/generated_poc/core/package.py +8 -8
  80. adcp/types/generated_poc/core/performance_feedback.py +18 -18
  81. adcp/types/generated_poc/core/placement.py +4 -4
  82. adcp/types/generated_poc/core/pricing_option.py +1 -1
  83. adcp/types/generated_poc/core/product.py +27 -21
  84. adcp/types/generated_poc/core/product_allocation.py +5 -5
  85. adcp/types/generated_poc/core/product_filters.py +27 -27
  86. adcp/types/generated_poc/core/promoted_offerings.py +18 -18
  87. adcp/types/generated_poc/core/promoted_products.py +2 -2
  88. adcp/types/generated_poc/core/property.py +10 -10
  89. adcp/types/generated_poc/core/property_id.py +4 -4
  90. adcp/types/generated_poc/core/property_list_ref.py +4 -4
  91. adcp/types/generated_poc/core/property_tag.py +4 -4
  92. adcp/types/generated_poc/core/proposal.py +13 -13
  93. adcp/types/generated_poc/core/protocol_envelope.py +8 -8
  94. adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
  95. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  96. adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
  97. adcp/types/generated_poc/core/reporting_webhook.py +10 -10
  98. adcp/types/generated_poc/core/response.py +4 -4
  99. adcp/types/generated_poc/core/signal_filters.py +5 -5
  100. adcp/types/generated_poc/core/start_timing.py +3 -3
  101. adcp/types/generated_poc/core/sub_asset.py +14 -14
  102. adcp/types/generated_poc/core/targeting.py +17 -10
  103. adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
  104. adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
  105. adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
  106. adcp/types/generated_poc/creative/preview_creative_response.py +28 -28
  107. adcp/types/generated_poc/creative/preview_render.py +25 -25
  108. adcp/types/generated_poc/enums/adcp_domain.py +4 -4
  109. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  110. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  111. adcp/types/generated_poc/enums/available_metric.py +9 -9
  112. adcp/types/generated_poc/enums/channels.py +19 -19
  113. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  114. adcp/types/generated_poc/enums/creative_action.py +5 -5
  115. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  116. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  117. adcp/types/generated_poc/enums/creative_status.py +5 -5
  118. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  119. adcp/types/generated_poc/enums/daast_version.py +2 -2
  120. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  121. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  122. adcp/types/generated_poc/enums/feed_format.py +3 -3
  123. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  124. adcp/types/generated_poc/enums/format_category.py +7 -7
  125. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  126. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  127. adcp/types/generated_poc/enums/geo_level.py +4 -4
  128. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  129. adcp/types/generated_poc/enums/http_method.py +2 -2
  130. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  131. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  132. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  133. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  134. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  135. adcp/types/generated_poc/enums/metric_type.py +8 -8
  136. adcp/types/generated_poc/enums/metro_system.py +5 -5
  137. adcp/types/generated_poc/enums/notification_type.py +4 -4
  138. adcp/types/generated_poc/enums/pacing.py +3 -3
  139. adcp/types/generated_poc/enums/postal_system.py +9 -9
  140. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  141. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  142. adcp/types/generated_poc/enums/property_type.py +8 -8
  143. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  144. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  145. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  146. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  147. adcp/types/generated_poc/enums/task_status.py +9 -9
  148. adcp/types/generated_poc/enums/task_type.py +11 -12
  149. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  150. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  151. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  152. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  153. adcp/types/generated_poc/enums/vast_version.py +5 -5
  154. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  155. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  156. adcp/types/generated_poc/extensions/extension_meta.py +14 -14
  157. adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
  158. adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
  159. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
  160. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  161. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
  162. adcp/types/generated_poc/media_buy/create_media_buy_request.py +27 -21
  163. adcp/types/generated_poc/media_buy/create_media_buy_response.py +15 -8
  164. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
  165. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
  166. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
  167. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  168. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
  169. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  170. adcp/types/generated_poc/media_buy/get_products_response.py +5 -5
  171. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
  172. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
  173. adcp/types/generated_poc/media_buy/list_creatives_request.py +23 -23
  174. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -49
  175. adcp/types/generated_poc/media_buy/package_request.py +8 -8
  176. adcp/types/generated_poc/media_buy/package_update.py +16 -16
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
  178. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
  182. adcp/types/generated_poc/media_buy/sync_creatives_request.py +14 -8
  183. adcp/types/generated_poc/media_buy/sync_creatives_response.py +33 -29
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
  187. adcp/types/generated_poc/media_buy/update_media_buy_request.py +14 -14
  188. adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
  189. adcp/types/generated_poc/pricing_options/cpc_option.py +13 -26
  190. adcp/types/generated_poc/pricing_options/cpcv_option.py +13 -26
  191. adcp/types/generated_poc/pricing_options/cpm_option.py +13 -20
  192. adcp/types/generated_poc/pricing_options/cpp_option.py +19 -32
  193. adcp/types/generated_poc/pricing_options/cpv_option.py +19 -32
  194. adcp/types/generated_poc/pricing_options/flat_rate_option.py +23 -36
  195. adcp/types/generated_poc/pricing_options/price_guidance.py +26 -0
  196. adcp/types/generated_poc/pricing_options/vcpm_option.py +13 -26
  197. adcp/types/generated_poc/property/base_property_source.py +15 -15
  198. adcp/types/generated_poc/property/create_property_list_request.py +4 -4
  199. adcp/types/generated_poc/property/create_property_list_response.py +3 -3
  200. adcp/types/generated_poc/property/delete_property_list_request.py +2 -2
  201. adcp/types/generated_poc/property/delete_property_list_response.py +3 -3
  202. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  203. adcp/types/generated_poc/property/get_property_list_request.py +5 -5
  204. adcp/types/generated_poc/property/get_property_list_response.py +11 -11
  205. adcp/types/generated_poc/property/list_property_lists_request.py +5 -5
  206. adcp/types/generated_poc/property/list_property_lists_response.py +8 -8
  207. adcp/types/generated_poc/property/property_error.py +10 -10
  208. adcp/types/generated_poc/property/property_feature.py +4 -4
  209. adcp/types/generated_poc/property/property_feature_definition.py +18 -18
  210. adcp/types/generated_poc/property/property_list.py +11 -11
  211. adcp/types/generated_poc/property/property_list_changed_webhook.py +11 -11
  212. adcp/types/generated_poc/property/property_list_filters.py +7 -7
  213. adcp/types/generated_poc/property/update_property_list_request.py +8 -8
  214. adcp/types/generated_poc/property/update_property_list_response.py +2 -2
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +8 -6
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +59 -58
  217. adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
  218. adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
  219. adcp/types/generated_poc/signals/get_signals_request.py +8 -8
  220. adcp/types/generated_poc/signals/get_signals_response.py +15 -15
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +45 -30
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +4 -4
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +23 -23
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +16 -16
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +5 -5
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +7 -7
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +11 -11
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +37 -23
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +17 -17
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +15 -15
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +11 -11
  232. adcp/utils/format_assets.py +32 -32
  233. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/METADATA +10 -5
  234. adcp-3.2.0.dist-info/RECORD +268 -0
  235. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +0 -38
  236. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +0 -84
  237. adcp/types/generated_poc/protocols/adcp_extension.py +0 -50
  238. adcp-3.1.0.dist-info/RECORD +0 -264
  239. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
  240. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
  241. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
  242. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
@@ -14,11 +14,11 @@ from . import ext as ext_1
14
14
 
15
15
  class Offering(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
19
  assets: Annotated[
20
20
  list[dict[str, Any]] | None,
21
- Field(description='Assets specific to this offering (images, videos, copy)'),
21
+ Field(description="Assets specific to this offering (images, videos, copy)"),
22
22
  ] = None
23
23
  categories: Annotated[
24
24
  list[str] | None,
@@ -39,11 +39,11 @@ class Offering(AdCPBaseModel):
39
39
  keywords: Annotated[
40
40
  list[str] | None,
41
41
  Field(
42
- description='Keywords for matching this offering to user intent. Hosts use these for retrieval/relevance scoring.'
42
+ description="Keywords for matching this offering to user intent. Hosts use these for retrieval/relevance scoring."
43
43
  ),
44
44
  ] = None
45
45
  landing_url: Annotated[
46
- AnyUrl | None, Field(description='Landing page URL for this offering.')
46
+ AnyUrl | None, Field(description="Landing page URL for this offering.")
47
47
  ] = None
48
48
  name: Annotated[
49
49
  str,
@@ -54,27 +54,27 @@ class Offering(AdCPBaseModel):
54
54
  offering_id: Annotated[
55
55
  str,
56
56
  Field(
57
- description='Unique identifier for this offering. Used by hosts to reference specific offerings in si_get_offering calls.'
57
+ description="Unique identifier for this offering. Used by hosts to reference specific offerings in si_get_offering calls."
58
58
  ),
59
59
  ]
60
60
  portfolio_ref: Annotated[
61
61
  AnyUrl | None,
62
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.'
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
64
  ),
65
65
  ] = None
66
66
  tagline: Annotated[
67
- str | None, Field(description='Short promotional tagline for the offering')
67
+ str | None, Field(description="Short promotional tagline for the offering")
68
68
  ] = None
69
69
  valid_from: Annotated[
70
70
  AwareDatetime | None,
71
71
  Field(
72
- description='When the offering becomes available. If not specified, offering is immediately available.'
72
+ description="When the offering becomes available. If not specified, offering is immediately available."
73
73
  ),
74
74
  ] = None
75
75
  valid_to: Annotated[
76
76
  AwareDatetime | None,
77
77
  Field(
78
- description='When the offering expires. If not specified, offering has no expiration.'
78
+ description="When the offering expires. If not specified, offering has no expiration."
79
79
  ),
80
80
  ] = None
@@ -17,19 +17,19 @@ from . import format_id, targeting
17
17
 
18
18
  class Package(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='allow',
20
+ extra="allow",
21
21
  )
22
22
  bid_price: Annotated[
23
23
  float | None,
24
24
  Field(
25
- description='Bid price for auction-based CPM pricing (present if using cpm-auction-option)',
25
+ description="Bid price for auction-based CPM pricing (present if using cpm-auction-option)",
26
26
  ge=0.0,
27
27
  ),
28
28
  ] = None
29
29
  budget: Annotated[
30
30
  float | None,
31
31
  Field(
32
- description='Budget allocation for this package in the currency specified by the pricing option',
32
+ description="Budget allocation for this package in the currency specified by the pricing option",
33
33
  ge=0.0,
34
34
  ),
35
35
  ] = None
@@ -38,22 +38,22 @@ class Package(AdCPBaseModel):
38
38
  ] = None
39
39
  creative_assignments: Annotated[
40
40
  list[creative_assignment.CreativeAssignment] | None,
41
- Field(description='Creative assets assigned to this package'),
41
+ Field(description="Creative assets assigned to this package"),
42
42
  ] = None
43
43
  ext: ext_1.ExtensionObject | None = None
44
44
  format_ids_to_provide: Annotated[
45
45
  list[format_id.FormatId] | None,
46
- Field(description='Format IDs that creative assets will be provided for this package'),
46
+ Field(description="Format IDs that creative assets will be provided for this package"),
47
47
  ] = None
48
48
  impressions: Annotated[
49
- float | None, Field(description='Impression goal for this package', ge=0.0)
49
+ float | None, Field(description="Impression goal for this package", ge=0.0)
50
50
  ] = None
51
51
  pacing: pacing_1.Pacing | None = None
52
52
  package_id: Annotated[str, Field(description="Publisher's unique identifier for the package")]
53
53
  paused: Annotated[
54
54
  bool | None,
55
55
  Field(
56
- description='Whether this package is paused by the buyer. Paused packages do not deliver impressions. Defaults to false.'
56
+ description="Whether this package is paused by the buyer. Paused packages do not deliver impressions. Defaults to false."
57
57
  ),
58
58
  ] = False
59
59
  pricing_option_id: Annotated[
@@ -63,6 +63,6 @@ class Package(AdCPBaseModel):
63
63
  ),
64
64
  ] = None
65
65
  product_id: Annotated[
66
- str | None, Field(description='ID of the product this package is based on')
66
+ str | None, Field(description="ID of the product this package is based on")
67
67
  ] = None
68
68
  targeting_overlay: targeting.TargetingOverlay | None = None
@@ -16,63 +16,63 @@ from ..enums import metric_type as metric_type_1
16
16
 
17
17
  class MeasurementPeriod(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra='allow',
19
+ extra="allow",
20
20
  )
21
21
  end: Annotated[
22
- AwareDatetime, Field(description='ISO 8601 end timestamp for measurement period')
22
+ AwareDatetime, Field(description="ISO 8601 end timestamp for measurement period")
23
23
  ]
24
24
  start: Annotated[
25
- AwareDatetime, Field(description='ISO 8601 start timestamp for measurement period')
25
+ AwareDatetime, Field(description="ISO 8601 start timestamp for measurement period")
26
26
  ]
27
27
 
28
28
 
29
29
  class Status(Enum):
30
- accepted = 'accepted'
31
- queued = 'queued'
32
- applied = 'applied'
33
- rejected = 'rejected'
30
+ accepted = "accepted"
31
+ queued = "queued"
32
+ applied = "applied"
33
+ rejected = "rejected"
34
34
 
35
35
 
36
36
  class PerformanceFeedback(AdCPBaseModel):
37
37
  model_config = ConfigDict(
38
- extra='allow',
38
+ extra="allow",
39
39
  )
40
40
  applied_at: Annotated[
41
41
  AwareDatetime | None,
42
42
  Field(
43
- description='ISO 8601 timestamp when feedback was applied to optimization algorithms'
43
+ description="ISO 8601 timestamp when feedback was applied to optimization algorithms"
44
44
  ),
45
45
  ] = None
46
46
  creative_id: Annotated[
47
- str | None, Field(description='Specific creative asset (if feedback is creative-specific)')
47
+ str | None, Field(description="Specific creative asset (if feedback is creative-specific)")
48
48
  ] = None
49
49
  feedback_id: Annotated[
50
- str, Field(description='Unique identifier for this performance feedback submission')
50
+ str, Field(description="Unique identifier for this performance feedback submission")
51
51
  ]
52
52
  feedback_source: Annotated[
53
- feedback_source_1.FeedbackSource, Field(description='Source of the performance data')
53
+ feedback_source_1.FeedbackSource, Field(description="Source of the performance data")
54
54
  ]
55
55
  measurement_period: Annotated[
56
- MeasurementPeriod, Field(description='Time period for performance measurement')
56
+ MeasurementPeriod, Field(description="Time period for performance measurement")
57
57
  ]
58
58
  media_buy_id: Annotated[str, Field(description="Publisher's media buy identifier")]
59
59
  metric_type: Annotated[
60
- metric_type_1.MetricType, Field(description='The business metric being measured')
60
+ metric_type_1.MetricType, Field(description="The business metric being measured")
61
61
  ]
62
62
  package_id: Annotated[
63
63
  str | None,
64
64
  Field(
65
- description='Specific package within the media buy (if feedback is package-specific)'
65
+ description="Specific package within the media buy (if feedback is package-specific)"
66
66
  ),
67
67
  ] = None
68
68
  performance_index: Annotated[
69
69
  float,
70
70
  Field(
71
- description='Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)',
71
+ description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)",
72
72
  ge=0.0,
73
73
  ),
74
74
  ]
75
- status: Annotated[Status, Field(description='Processing status of the performance feedback')]
75
+ status: Annotated[Status, Field(description="Processing status of the performance feedback")]
76
76
  submitted_at: Annotated[
77
- AwareDatetime, Field(description='ISO 8601 timestamp when feedback was submitted')
77
+ AwareDatetime, Field(description="ISO 8601 timestamp when feedback was submitted")
78
78
  ]
@@ -14,15 +14,15 @@ from . import format_id
14
14
 
15
15
  class Placement(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
19
  description: Annotated[
20
- str | None, Field(description='Detailed description of where and how the placement appears')
20
+ str | None, Field(description="Detailed description of where and how the placement appears")
21
21
  ] = None
22
22
  format_ids: Annotated[
23
23
  list[format_id.FormatId] | None,
24
24
  Field(
25
- description='Format IDs supported by this specific placement. Can include: (1) concrete format_ids (fixed dimensions), (2) template format_ids without parameters (accepts any dimensions/duration), or (3) parameterized format_ids (specific dimension/duration constraints).',
25
+ description="Format IDs supported by this specific placement. Can include: (1) concrete format_ids (fixed dimensions), (2) template format_ids without parameters (accepts any dimensions/duration), or (3) parameterized format_ids (specific dimension/duration constraints).",
26
26
  min_length=1,
27
27
  ),
28
28
  ] = None
@@ -33,5 +33,5 @@ class Placement(AdCPBaseModel):
33
33
  ),
34
34
  ]
35
35
  placement_id: Annotated[
36
- str, Field(description='Unique identifier for the placement within the product')
36
+ str, Field(description="Unique identifier for the placement within the product")
37
37
  ]
@@ -40,6 +40,6 @@ class PricingOption(
40
40
  | flat_rate_option.FlatRatePricingOption,
41
41
  Field(
42
42
  description="A pricing model option offered by a publisher for a product. Discriminated by pricing_model field. If fixed_price is present, it's fixed pricing. If absent, it's auction-based (floor_price and price_guidance optional).",
43
- title='Pricing Option',
43
+ title="Pricing Option",
44
44
  ),
45
45
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/product.json
3
- # timestamp: 2026-01-25T21:17:54+00:00
3
+ # timestamp: 2026-02-02T17:45:21+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -35,100 +35,106 @@ class DeliveryMeasurement(AdCPBaseModel):
35
35
 
36
36
  class ProductCard(AdCPBaseModel):
37
37
  model_config = ConfigDict(
38
- extra='allow',
38
+ extra="allow",
39
39
  )
40
40
  format_id: Annotated[
41
41
  format_id_1.FormatId,
42
42
  Field(
43
- description='Creative format defining the card layout (typically product_card_standard)'
43
+ description="Creative format defining the card layout (typically product_card_standard)"
44
44
  ),
45
45
  ]
46
46
  manifest: Annotated[
47
47
  dict[str, Any],
48
- Field(description='Asset manifest for rendering the card, structure defined by the format'),
48
+ Field(description="Asset manifest for rendering the card, structure defined by the format"),
49
49
  ]
50
50
 
51
51
 
52
52
  class ProductCardDetailed(AdCPBaseModel):
53
53
  model_config = ConfigDict(
54
- extra='allow',
54
+ extra="allow",
55
55
  )
56
56
  format_id: Annotated[
57
57
  format_id_1.FormatId,
58
58
  Field(
59
- description='Creative format defining the detailed card layout (typically product_card_detailed)'
59
+ description="Creative format defining the detailed card layout (typically product_card_detailed)"
60
60
  ),
61
61
  ]
62
62
  manifest: Annotated[
63
63
  dict[str, Any],
64
64
  Field(
65
- description='Asset manifest for rendering the detailed card, structure defined by the format'
65
+ description="Asset manifest for rendering the detailed card, structure defined by the format"
66
66
  ),
67
67
  ]
68
68
 
69
69
 
70
70
  class Product(AdCPBaseModel):
71
71
  model_config = ConfigDict(
72
- extra='allow',
72
+ extra="allow",
73
73
  )
74
74
  brief_relevance: Annotated[
75
75
  str | None,
76
76
  Field(
77
- description='Explanation of why this product matches the brief (only included when brief is provided)'
77
+ description="Explanation of why this product matches the brief (only included when brief is provided)"
78
78
  ),
79
79
  ] = None
80
80
  creative_policy: creative_policy_1.CreativePolicy | None = None
81
81
  delivery_measurement: Annotated[
82
82
  DeliveryMeasurement,
83
83
  Field(
84
- description='Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products.'
84
+ description="Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products."
85
85
  ),
86
86
  ]
87
87
  delivery_type: delivery_type_1.DeliveryType
88
88
  description: Annotated[
89
- str, Field(description='Detailed description of the product and its inventory')
89
+ str, Field(description="Detailed description of the product and its inventory")
90
90
  ]
91
91
  estimated_exposures: Annotated[
92
92
  int | None,
93
- Field(description='Estimated exposures/impressions for guaranteed products', ge=0),
93
+ Field(description="Estimated exposures/impressions for guaranteed products", ge=0),
94
94
  ] = None
95
95
  expires_at: Annotated[
96
- AwareDatetime | None, Field(description='Expiration timestamp for custom products')
96
+ AwareDatetime | None, Field(description="Expiration timestamp for custom products")
97
97
  ] = None
98
98
  ext: ext_1.ExtensionObject | None = None
99
99
  format_ids: Annotated[
100
100
  list[format_id_1.FormatId],
101
101
  Field(
102
- description='Array of supported creative format IDs - structured format_id objects with agent_url and id'
102
+ description="Array of supported creative format IDs - structured format_id objects with agent_url and id"
103
103
  ),
104
104
  ]
105
- is_custom: Annotated[bool | None, Field(description='Whether this is a custom product')] = None
105
+ is_custom: Annotated[bool | None, Field(description="Whether this is a custom product")] = None
106
106
  measurement: measurement_1.Measurement | None = None
107
- name: Annotated[str, Field(description='Human-readable product name')]
107
+ name: Annotated[str, Field(description="Human-readable product name")]
108
108
  placements: Annotated[
109
109
  list[placement.Placement] | None,
110
110
  Field(
111
- description='Optional array of specific placements within this product. When provided, buyers can target specific placements when assigning creatives.',
111
+ description="Optional array of specific placements within this product. When provided, buyers can target specific placements when assigning creatives.",
112
112
  min_length=1,
113
113
  ),
114
114
  ] = None
115
115
  pricing_options: Annotated[
116
116
  list[pricing_option.PricingOption],
117
- Field(description='Available pricing models for this product', min_length=1),
117
+ Field(description="Available pricing models for this product", min_length=1),
118
118
  ]
119
119
  product_card: Annotated[
120
120
  ProductCard | None,
121
121
  Field(
122
- description='Optional standard visual card (300x400px) for displaying this product in user interfaces. Can be rendered via preview_creative or pre-generated.'
122
+ description="Optional standard visual card (300x400px) for displaying this product in user interfaces. Can be rendered via preview_creative or pre-generated."
123
123
  ),
124
124
  ] = None
125
125
  product_card_detailed: Annotated[
126
126
  ProductCardDetailed | None,
127
127
  Field(
128
- description='Optional detailed card with carousel and full specifications. Provides rich product presentation similar to media kit pages.'
128
+ description="Optional detailed card with carousel and full specifications. Provides rich product presentation similar to media kit pages."
129
129
  ),
130
130
  ] = None
131
- product_id: Annotated[str, Field(description='Unique identifier for the product')]
131
+ product_id: Annotated[str, Field(description="Unique identifier for the product")]
132
+ property_targeting_allowed: Annotated[
133
+ bool | None,
134
+ Field(
135
+ description="Whether buyers can filter this product to a subset of its publisher_properties. When false (default), the product is 'all or nothing' - buyers must accept all properties or the product is excluded from property_list filtering results."
136
+ ),
137
+ ] = False
132
138
  publisher_properties: Annotated[
133
139
  list[publisher_property_selector.PublisherPropertySelector],
134
140
  Field(
@@ -14,12 +14,12 @@ from . import ext as ext_1
14
14
 
15
15
  class ProductAllocation(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
19
  allocation_percentage: Annotated[
20
20
  float,
21
21
  Field(
22
- description='Percentage of total budget allocated to this product (0-100)',
22
+ description="Percentage of total budget allocated to this product (0-100)",
23
23
  ge=0.0,
24
24
  le=100.0,
25
25
  ),
@@ -30,15 +30,15 @@ class ProductAllocation(AdCPBaseModel):
30
30
  Field(description="Recommended pricing option ID from the product's pricing_options array"),
31
31
  ] = None
32
32
  product_id: Annotated[
33
- str, Field(description='ID of the product (must reference a product in the products array)')
33
+ str, Field(description="ID of the product (must reference a product in the products array)")
34
34
  ]
35
35
  rationale: Annotated[
36
36
  str | None,
37
- Field(description='Explanation of why this product and allocation are recommended'),
37
+ Field(description="Explanation of why this product and allocation are recommended"),
38
38
  ] = None
39
39
  sequence: Annotated[
40
40
  int | None,
41
- Field(description='Optional ordering hint for multi-line-item plans (1-based)', ge=1),
41
+ Field(description="Optional ordering hint for multi-line-item plans (1-based)", ge=1),
42
42
  ] = None
43
43
  tags: Annotated[
44
44
  list[str] | None,
@@ -18,59 +18,59 @@ from . import format_id, media_buy_features
18
18
 
19
19
  class BudgetRange(AdCPBaseModel):
20
20
  model_config = ConfigDict(
21
- extra='allow',
21
+ extra="allow",
22
22
  )
23
23
  currency: Annotated[
24
24
  str,
25
25
  Field(
26
- description="ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP')", pattern='^[A-Z]{3}$'
26
+ description="ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP')", pattern="^[A-Z]{3}$"
27
27
  ),
28
28
  ]
29
- max: Annotated[float | None, Field(description='Maximum budget amount', ge=0.0)] = None
30
- min: Annotated[float, Field(description='Minimum budget amount', ge=0.0)]
29
+ max: Annotated[float | None, Field(description="Maximum budget amount", ge=0.0)] = None
30
+ min: Annotated[float, Field(description="Minimum budget amount", ge=0.0)]
31
31
 
32
32
 
33
33
  class BudgetRange1(AdCPBaseModel):
34
34
  model_config = ConfigDict(
35
- extra='allow',
35
+ extra="allow",
36
36
  )
37
37
  currency: Annotated[
38
38
  str,
39
39
  Field(
40
- description="ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP')", pattern='^[A-Z]{3}$'
40
+ description="ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP')", pattern="^[A-Z]{3}$"
41
41
  ),
42
42
  ]
43
- max: Annotated[float, Field(description='Maximum budget amount', ge=0.0)]
44
- min: Annotated[float | None, Field(description='Minimum budget amount', ge=0.0)] = None
43
+ max: Annotated[float, Field(description="Maximum budget amount", ge=0.0)]
44
+ min: Annotated[float | None, Field(description="Minimum budget amount", ge=0.0)] = None
45
45
 
46
46
 
47
47
  class Country(RootModel[str]):
48
- root: Annotated[str, Field(pattern='^[A-Z]{2}$')]
48
+ root: Annotated[str, Field(pattern="^[A-Z]{2}$")]
49
49
 
50
50
 
51
51
  class Metro(AdCPBaseModel):
52
52
  model_config = ConfigDict(
53
- extra='forbid',
53
+ extra="forbid",
54
54
  )
55
55
  code: Annotated[
56
56
  str, Field(description="Metro code within the system (e.g., '501' for NYC DMA)")
57
57
  ]
58
58
  system: Annotated[
59
- metro_system.MetroAreaSystem, Field(description='Metro classification system')
59
+ metro_system.MetroAreaSystem, Field(description="Metro classification system")
60
60
  ]
61
61
 
62
62
 
63
63
  class Region(RootModel[str]):
64
- root: Annotated[str, Field(pattern='^[A-Z]{2}-[A-Z0-9]+$')]
64
+ root: Annotated[str, Field(pattern="^[A-Z]{2}-[A-Z0-9]+$")]
65
65
 
66
66
 
67
67
  class RequiredGeoTargetingItem(AdCPBaseModel):
68
68
  model_config = ConfigDict(
69
- extra='forbid',
69
+ extra="forbid",
70
70
  )
71
71
  level: Annotated[
72
72
  geo_level.GeographicTargetingLevel,
73
- Field(description='Geographic targeting level (country, region, metro, postal_area)'),
73
+ Field(description="Geographic targeting level (country, region, metro, postal_area)"),
74
74
  ]
75
75
  system: Annotated[
76
76
  str | None,
@@ -82,11 +82,11 @@ class RequiredGeoTargetingItem(AdCPBaseModel):
82
82
 
83
83
  class ProductFilters(AdCPBaseModel):
84
84
  model_config = ConfigDict(
85
- extra='allow',
85
+ extra="allow",
86
86
  )
87
87
  budget_range: Annotated[
88
88
  BudgetRange | BudgetRange1 | None,
89
- Field(description='Budget range to filter appropriate products'),
89
+ Field(description="Budget range to filter appropriate products"),
90
90
  ] = None
91
91
  channels: Annotated[
92
92
  list[channels_1.MediaChannel] | None,
@@ -102,30 +102,30 @@ class ProductFilters(AdCPBaseModel):
102
102
  end_date: Annotated[
103
103
  date | None,
104
104
  Field(
105
- description='Campaign end date (ISO 8601 date format: YYYY-MM-DD) for availability checks'
105
+ description="Campaign end date (ISO 8601 date format: YYYY-MM-DD) for availability checks"
106
106
  ),
107
107
  ] = None
108
108
  format_ids: Annotated[
109
- list[format_id.FormatId] | None, Field(description='Filter by specific format IDs')
109
+ list[format_id.FormatId] | None, Field(description="Filter by specific format IDs")
110
110
  ] = None
111
111
  format_types: Annotated[
112
- list[format_category.FormatCategory] | None, Field(description='Filter by format types')
112
+ list[format_category.FormatCategory] | None, Field(description="Filter by format types")
113
113
  ] = None
114
114
  is_fixed_price: Annotated[
115
115
  bool | None,
116
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.'
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
118
  ),
119
119
  ] = None
120
120
  metros: Annotated[
121
121
  list[Metro] | None,
122
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.'
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
124
  ),
125
125
  ] = None
126
126
  min_exposures: Annotated[
127
127
  int | None,
128
- Field(description='Minimum exposures/impressions needed for measurement validity', ge=1),
128
+ Field(description="Minimum exposures/impressions needed for measurement validity", ge=1),
129
129
  ] = None
130
130
  regions: Annotated[
131
131
  list[Region] | None,
@@ -136,27 +136,27 @@ class ProductFilters(AdCPBaseModel):
136
136
  required_axe_integrations: Annotated[
137
137
  list[AnyUrl] | None,
138
138
  Field(
139
- description='Filter to products executable through specific agentic ad exchanges. URLs are canonical identifiers.'
139
+ description="Filter to products executable through specific agentic ad exchanges. URLs are canonical identifiers."
140
140
  ),
141
141
  ] = None
142
142
  required_features: Annotated[
143
143
  media_buy_features.MediaBuyFeatures | None,
144
144
  Field(
145
- description='Filter to products from sellers supporting specific protocol features. Only features set to true are used for filtering.'
145
+ description="Filter to products from sellers supporting specific protocol features. Only features set to true are used for filtering."
146
146
  ),
147
147
  ] = None
148
148
  required_geo_targeting: Annotated[
149
149
  list[RequiredGeoTargetingItem] | None,
150
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.'
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
152
  ),
153
153
  ] = None
154
154
  standard_formats_only: Annotated[
155
- bool | None, Field(description='Only return products accepting IAB standard formats')
155
+ bool | None, Field(description="Only return products accepting IAB standard formats")
156
156
  ] = None
157
157
  start_date: Annotated[
158
158
  date | None,
159
159
  Field(
160
- description='Campaign start date (ISO 8601 date format: YYYY-MM-DD) for availability checks'
160
+ description="Campaign start date (ISO 8601 date format: YYYY-MM-DD) for availability checks"
161
161
  ),
162
162
  ] = None
@@ -14,28 +14,28 @@ from . import brand_manifest_ref, offering, promoted_products
14
14
 
15
15
 
16
16
  class AssetType(Enum):
17
- image = 'image'
18
- video = 'video'
19
- audio = 'audio'
20
- vast = 'vast'
21
- daast = 'daast'
22
- text = 'text'
23
- url = 'url'
24
- html = 'html'
25
- css = 'css'
26
- javascript = 'javascript'
27
- webhook = 'webhook'
17
+ image = "image"
18
+ video = "video"
19
+ audio = "audio"
20
+ vast = "vast"
21
+ daast = "daast"
22
+ text = "text"
23
+ url = "url"
24
+ html = "html"
25
+ css = "css"
26
+ javascript = "javascript"
27
+ webhook = "webhook"
28
28
 
29
29
 
30
30
  class AssetSelectors(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra='allow',
32
+ extra="allow",
33
33
  )
34
34
  asset_types: Annotated[
35
35
  list[AssetType] | None, Field(description="Filter by asset type (e.g., ['image', 'video'])")
36
36
  ] = None
37
37
  exclude_tags: Annotated[
38
- list[str] | None, Field(description='Exclude assets with these tags')
38
+ list[str] | None, Field(description="Exclude assets with these tags")
39
39
  ] = None
40
40
  tags: Annotated[
41
41
  list[str] | None,
@@ -45,28 +45,28 @@ class AssetSelectors(AdCPBaseModel):
45
45
 
46
46
  class PromotedOfferings(AdCPBaseModel):
47
47
  model_config = ConfigDict(
48
- extra='allow',
48
+ extra="allow",
49
49
  )
50
50
  asset_selectors: Annotated[
51
51
  AssetSelectors | None,
52
- Field(description='Selectors to choose specific assets from the brand manifest'),
52
+ Field(description="Selectors to choose specific assets from the brand manifest"),
53
53
  ] = None
54
54
  brand_manifest: Annotated[
55
55
  brand_manifest_ref.BrandManifestReference,
56
56
  Field(
57
- description='Brand information manifest containing assets, themes, and guidelines. Can be provided inline or as a URL reference to a hosted manifest.'
57
+ description="Brand information manifest containing assets, themes, and guidelines. Can be provided inline or as a URL reference to a hosted manifest."
58
58
  ),
59
59
  ]
60
60
  offerings: Annotated[
61
61
  list[offering.Offering] | None,
62
62
  Field(
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.'
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."
64
64
  ),
65
65
  ] = None
66
66
  product_selectors: Annotated[
67
67
  promoted_products.PromotedProducts | None,
68
68
  Field(
69
- description='Selectors to choose which products/offerings from the brand manifest product catalog to promote'
69
+ description="Selectors to choose which products/offerings from the brand manifest product catalog to promote"
70
70
  ),
71
71
  ] = None
72
72
  si_agent_url: Annotated[