adcp 2.17.0__py3-none-any.whl → 2.19.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 (192) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +22 -1
  3. adcp/__main__.py +72 -0
  4. adcp/protocols/mcp.py +3 -1
  5. adcp/types/_ergonomic.py +0 -4
  6. adcp/types/_generated.py +91 -4
  7. adcp/types/generated_poc/adagents.py +239 -149
  8. adcp/types/generated_poc/core/activation_key.py +9 -9
  9. adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  10. adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  11. adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
  12. adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  13. adcp/types/generated_poc/core/assets/image_asset.py +7 -7
  14. adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  15. adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  16. adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  17. adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
  18. adcp/types/generated_poc/core/assets/video_asset.py +8 -8
  19. adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  20. adcp/types/generated_poc/core/async_response_data.py +2 -2
  21. adcp/types/generated_poc/core/brand_manifest.py +56 -56
  22. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  23. adcp/types/generated_poc/core/context.py +2 -3
  24. adcp/types/generated_poc/core/creative_asset.py +14 -14
  25. adcp/types/generated_poc/core/creative_assignment.py +4 -4
  26. adcp/types/generated_poc/core/creative_filters.py +20 -20
  27. adcp/types/generated_poc/core/creative_manifest.py +3 -3
  28. adcp/types/generated_poc/core/creative_policy.py +5 -5
  29. adcp/types/generated_poc/core/delivery_metrics.py +33 -33
  30. adcp/types/generated_poc/core/deployment.py +21 -21
  31. adcp/types/generated_poc/core/destination.py +12 -12
  32. adcp/types/generated_poc/core/error.py +9 -9
  33. adcp/types/generated_poc/core/ext.py +2 -3
  34. adcp/types/generated_poc/core/format.py +139 -51
  35. adcp/types/generated_poc/core/format_id.py +6 -6
  36. adcp/types/generated_poc/core/frequency_cap.py +3 -3
  37. adcp/types/generated_poc/core/identifier.py +27 -0
  38. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  39. adcp/types/generated_poc/core/measurement.py +9 -9
  40. adcp/types/generated_poc/core/media_buy.py +8 -8
  41. adcp/types/generated_poc/core/package.py +9 -9
  42. adcp/types/generated_poc/core/performance_feedback.py +19 -19
  43. adcp/types/generated_poc/core/placement.py +5 -5
  44. adcp/types/generated_poc/core/pricing_option.py +2 -2
  45. adcp/types/generated_poc/core/product.py +21 -21
  46. adcp/types/generated_poc/core/product_filters.py +19 -19
  47. adcp/types/generated_poc/core/promoted_offerings.py +21 -21
  48. adcp/types/generated_poc/core/promoted_products.py +3 -3
  49. adcp/types/generated_poc/core/property.py +10 -10
  50. adcp/types/generated_poc/core/property_id.py +4 -4
  51. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  52. adcp/types/generated_poc/core/property_tag.py +4 -4
  53. adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  54. adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  55. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  56. adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  57. adcp/types/generated_poc/core/response.py +5 -5
  58. adcp/types/generated_poc/core/signal_filters.py +6 -6
  59. adcp/types/generated_poc/core/start_timing.py +5 -5
  60. adcp/types/generated_poc/core/sub_asset.py +15 -15
  61. adcp/types/generated_poc/core/targeting.py +9 -9
  62. adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  63. adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  64. adcp/types/generated_poc/creative/preview_creative_request.py +26 -26
  65. adcp/types/generated_poc/creative/preview_creative_response.py +31 -30
  66. adcp/types/generated_poc/creative/preview_render.py +26 -26
  67. adcp/types/generated_poc/enums/adcp_domain.py +5 -3
  68. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  69. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  70. adcp/types/generated_poc/enums/available_metric.py +9 -9
  71. adcp/types/generated_poc/enums/channels.py +9 -9
  72. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  73. adcp/types/generated_poc/enums/creative_action.py +5 -5
  74. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  75. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  76. adcp/types/generated_poc/enums/creative_status.py +4 -4
  77. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  78. adcp/types/generated_poc/enums/daast_version.py +2 -2
  79. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  80. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  81. adcp/types/generated_poc/enums/feed_format.py +3 -3
  82. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  83. adcp/types/generated_poc/enums/format_category.py +7 -7
  84. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  85. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  86. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  87. adcp/types/generated_poc/enums/http_method.py +2 -2
  88. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  89. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  90. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  91. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  92. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  93. adcp/types/generated_poc/enums/metric_type.py +8 -8
  94. adcp/types/generated_poc/enums/notification_type.py +4 -4
  95. adcp/types/generated_poc/enums/pacing.py +3 -3
  96. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  97. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  98. adcp/types/generated_poc/enums/property_type.py +7 -7
  99. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  100. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  101. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  102. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  103. adcp/types/generated_poc/enums/standard_format_ids.py +35 -35
  104. adcp/types/generated_poc/enums/task_status.py +9 -9
  105. adcp/types/generated_poc/enums/task_type.py +12 -6
  106. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  107. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  108. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  109. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  110. adcp/types/generated_poc/enums/vast_version.py +5 -5
  111. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  112. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  113. adcp/types/generated_poc/extensions/__init__.py +3 -0
  114. adcp/types/generated_poc/extensions/extension_meta.py +50 -0
  115. adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  116. adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  117. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  118. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  119. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  120. adcp/types/generated_poc/media_buy/create_media_buy_request.py +64 -23
  121. adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  122. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  123. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  124. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  125. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  126. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  127. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  128. adcp/types/generated_poc/media_buy/get_products_response.py +10 -4
  129. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  130. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +8 -8
  131. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  132. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  133. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  134. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -53
  135. adcp/types/generated_poc/media_buy/package_request.py +16 -7
  136. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  137. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  138. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  139. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  140. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  141. adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  142. adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  143. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  144. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  145. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  146. adcp/types/generated_poc/media_buy/update_media_buy_request.py +37 -29
  147. adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  148. adcp/types/generated_poc/pricing_options/cpc_option.py +9 -9
  149. adcp/types/generated_poc/pricing_options/cpcv_option.py +9 -9
  150. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +14 -14
  151. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +9 -9
  152. adcp/types/generated_poc/pricing_options/cpp_option.py +14 -14
  153. adcp/types/generated_poc/pricing_options/cpv_option.py +13 -13
  154. adcp/types/generated_poc/pricing_options/flat_rate_option.py +16 -16
  155. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +14 -14
  156. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +9 -9
  157. adcp/types/generated_poc/property/__init__.py +3 -0
  158. adcp/types/generated_poc/property/base_property_source.py +86 -0
  159. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  160. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  161. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  162. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  163. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  164. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  165. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  166. adcp/types/generated_poc/property/list_property_features_request.py +25 -0
  167. adcp/types/generated_poc/property/list_property_features_response.py +24 -0
  168. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  169. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  170. adcp/types/generated_poc/property/property_error.py +33 -0
  171. adcp/types/generated_poc/property/property_feature.py +22 -0
  172. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  173. adcp/types/generated_poc/property/property_list.py +62 -0
  174. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  175. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  176. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  177. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  178. adcp/types/generated_poc/protocols/adcp_extension.py +26 -10
  179. adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  180. adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  181. adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  182. adcp/types/generated_poc/signals/get_signals_response.py +16 -16
  183. adcp/utils/__init__.py +24 -1
  184. adcp/utils/format_assets.py +224 -0
  185. adcp/utils/preview_cache.py +29 -7
  186. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/METADATA +1 -1
  187. adcp-2.19.0.dist-info/RECORD +220 -0
  188. adcp-2.17.0.dist-info/RECORD +0 -194
  189. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/WHEEL +0 -0
  190. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/entry_points.txt +0 -0
  191. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/licenses/LICENSE +0 -0
  192. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpm_auction_option.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,42 +14,42 @@ class PriceGuidance(AdCPBaseModel):
14
14
  floor: Annotated[
15
15
  float,
16
16
  Field(
17
- description='Minimum bid price - publisher will reject bids under this value', ge=0.0
17
+ description="Minimum bid price - publisher will reject bids under this value", ge=0.0
18
18
  ),
19
19
  ]
20
- p25: Annotated[float | None, Field(description='25th percentile winning price', ge=0.0)] = None
21
- p50: Annotated[float | None, Field(description='Median winning price', ge=0.0)] = None
22
- p75: Annotated[float | None, Field(description='75th percentile winning price', ge=0.0)] = None
23
- p90: Annotated[float | None, Field(description='90th percentile winning price', ge=0.0)] = None
20
+ p25: Annotated[float | None, Field(description="25th percentile winning price", ge=0.0)] = None
21
+ p50: Annotated[float | None, Field(description="Median winning price", ge=0.0)] = None
22
+ p75: Annotated[float | None, Field(description="75th percentile winning price", ge=0.0)] = None
23
+ p90: Annotated[float | None, Field(description="90th percentile winning price", ge=0.0)] = None
24
24
 
25
25
 
26
26
  class CpmAuctionPricingOption(AdCPBaseModel):
27
27
  model_config = ConfigDict(
28
- extra='forbid',
28
+ extra="allow",
29
29
  )
30
30
  currency: Annotated[
31
31
  str,
32
32
  Field(
33
- description='ISO 4217 currency code',
34
- examples=['USD', 'EUR', 'GBP', 'JPY'],
35
- pattern='^[A-Z]{3}$',
33
+ description="ISO 4217 currency code",
34
+ examples=["USD", "EUR", "GBP", "JPY"],
35
+ pattern="^[A-Z]{3}$",
36
36
  ),
37
37
  ]
38
38
  is_fixed: Annotated[
39
39
  Literal[False],
40
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
40
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
41
41
  ]
42
42
  min_spend_per_package: Annotated[
43
43
  float | None,
44
44
  Field(
45
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
45
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
46
46
  ge=0.0,
47
47
  ),
48
48
  ] = None
49
49
  price_guidance: Annotated[
50
- PriceGuidance, Field(description='Pricing guidance for auction-based CPM bidding')
50
+ PriceGuidance, Field(description="Pricing guidance for auction-based CPM bidding")
51
51
  ]
52
- pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
52
+ pricing_model: Annotated[Literal["cpm"], Field(description="Cost per 1,000 impressions")]
53
53
  pricing_option_id: Annotated[
54
54
  str,
55
55
  Field(
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpm_fixed_option.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,32 +12,32 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class CpmFixedRatePricingOption(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra="allow",
16
16
  )
17
17
  currency: Annotated[
18
18
  str,
19
19
  Field(
20
- description='ISO 4217 currency code',
21
- examples=['USD', 'EUR', 'GBP', 'JPY'],
22
- pattern='^[A-Z]{3}$',
20
+ description="ISO 4217 currency code",
21
+ examples=["USD", "EUR", "GBP", "JPY"],
22
+ pattern="^[A-Z]{3}$",
23
23
  ),
24
24
  ]
25
25
  is_fixed: Annotated[
26
26
  Literal[True],
27
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
27
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
28
28
  ]
29
29
  min_spend_per_package: Annotated[
30
30
  float | None,
31
31
  Field(
32
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
32
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
33
33
  ge=0.0,
34
34
  ),
35
35
  ] = None
36
- pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
36
+ pricing_model: Annotated[Literal["cpm"], Field(description="Cost per 1,000 impressions")]
37
37
  pricing_option_id: Annotated[
38
38
  str,
39
39
  Field(
40
40
  description="Unique identifier for this pricing option within the product (e.g., 'cpm_usd_guaranteed')"
41
41
  ),
42
42
  ]
43
- rate: Annotated[float, Field(description='Fixed CPM rate (cost per 1,000 impressions)', ge=0.0)]
43
+ rate: Annotated[float, Field(description="Fixed CPM rate (cost per 1,000 impressions)", ge=0.0)]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpp_option.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,53 +12,53 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class Parameters(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra="allow",
16
16
  )
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)',
21
- pattern='^[PMWAC][0-9]{2}(-[0-9]{2}|\\+)$',
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)",
21
+ pattern="^[PMWAC][0-9]{2}(-[0-9]{2}|\\+)$",
22
22
  ),
23
23
  ]
24
24
  min_points: Annotated[
25
25
  float | None,
26
- Field(description='Minimum GRPs/TRPs required for this pricing option', ge=0.0),
26
+ Field(description="Minimum GRPs/TRPs required for this pricing option", ge=0.0),
27
27
  ] = None
28
28
 
29
29
 
30
30
  class CppPricingOption(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra='forbid',
32
+ extra="allow",
33
33
  )
34
34
  currency: Annotated[
35
35
  str,
36
36
  Field(
37
- description='ISO 4217 currency code',
38
- examples=['USD', 'EUR', 'GBP', 'JPY'],
39
- pattern='^[A-Z]{3}$',
37
+ description="ISO 4217 currency code",
38
+ examples=["USD", "EUR", "GBP", "JPY"],
39
+ pattern="^[A-Z]{3}$",
40
40
  ),
41
41
  ]
42
42
  is_fixed: Annotated[
43
43
  Literal[True],
44
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
44
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
45
45
  ]
46
46
  min_spend_per_package: Annotated[
47
47
  float | None,
48
48
  Field(
49
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
49
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
50
50
  ge=0.0,
51
51
  ),
52
52
  ] = None
53
53
  parameters: Annotated[
54
54
  Parameters,
55
- Field(description='CPP-specific parameters for demographic targeting and GRP requirements'),
55
+ Field(description="CPP-specific parameters for demographic targeting and GRP requirements"),
56
56
  ]
57
- pricing_model: Annotated[Literal['cpp'], Field(description='Cost per Gross Rating Point')]
57
+ pricing_model: Annotated[Literal["cpp"], Field(description="Cost per Gross Rating Point")]
58
58
  pricing_option_id: Annotated[
59
59
  str,
60
60
  Field(
61
61
  description="Unique identifier for this pricing option within the product (e.g., 'cpp_usd_p18-49')"
62
62
  ),
63
63
  ]
64
- rate: Annotated[float, Field(description='Fixed CPP rate (cost per rating point)', ge=0.0)]
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: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+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 for CPV pricing (0.0 to 1.0, e.g., 0.5 = 50% completion)",
18
18
  ge=0.0,
19
19
  le=1.0,
20
20
  ),
@@ -23,7 +23,7 @@ class ViewThreshold(RootModel[float]):
23
23
 
24
24
  class ViewThreshold1(AdCPBaseModel):
25
25
  model_config = ConfigDict(
26
- extra='forbid',
26
+ extra="allow",
27
27
  )
28
28
  duration_seconds: Annotated[
29
29
  int,
@@ -36,42 +36,42 @@ class ViewThreshold1(AdCPBaseModel):
36
36
 
37
37
  class Parameters(AdCPBaseModel):
38
38
  model_config = ConfigDict(
39
- extra='forbid',
39
+ extra="allow",
40
40
  )
41
41
  view_threshold: ViewThreshold | ViewThreshold1
42
42
 
43
43
 
44
44
  class CpvPricingOption(AdCPBaseModel):
45
45
  model_config = ConfigDict(
46
- extra='forbid',
46
+ extra="allow",
47
47
  )
48
48
  currency: Annotated[
49
49
  str,
50
50
  Field(
51
- description='ISO 4217 currency code',
52
- examples=['USD', 'EUR', 'GBP', 'JPY'],
53
- pattern='^[A-Z]{3}$',
51
+ description="ISO 4217 currency code",
52
+ examples=["USD", "EUR", "GBP", "JPY"],
53
+ pattern="^[A-Z]{3}$",
54
54
  ),
55
55
  ]
56
56
  is_fixed: Annotated[
57
57
  Literal[True],
58
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
58
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
59
59
  ]
60
60
  min_spend_per_package: Annotated[
61
61
  float | None,
62
62
  Field(
63
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
63
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
64
64
  ge=0.0,
65
65
  ),
66
66
  ] = None
67
67
  parameters: Annotated[
68
- Parameters, Field(description='CPV-specific parameters defining the view threshold')
68
+ Parameters, Field(description="CPV-specific parameters defining the view threshold")
69
69
  ]
70
- pricing_model: Annotated[Literal['cpv'], Field(description='Cost per view at threshold')]
70
+ pricing_model: Annotated[Literal["cpv"], Field(description="Cost per view at threshold")]
71
71
  pricing_option_id: Annotated[
72
72
  str,
73
73
  Field(
74
74
  description="Unique identifier for this pricing option within the product (e.g., 'cpv_usd_50pct')"
75
75
  ),
76
76
  ]
77
- rate: Annotated[float, Field(description='Fixed CPV rate (cost per view)', ge=0.0)]
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: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,7 +12,7 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class Parameters(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra="allow",
16
16
  )
17
17
  daypart: Annotated[
18
18
  str | None,
@@ -22,28 +22,28 @@ class Parameters(AdCPBaseModel):
22
22
  ] = None
23
23
  duration_hours: Annotated[
24
24
  float | None,
25
- Field(description='Duration in hours for time-based flat rate pricing (DOOH)', ge=0.0),
25
+ Field(description="Duration in hours for time-based flat rate pricing (DOOH)", ge=0.0),
26
26
  ] = None
27
27
  estimated_impressions: Annotated[
28
28
  int | None,
29
29
  Field(
30
- description='Estimated impressions for this flat rate option (informational, commonly used with SOV or time-based DOOH)',
30
+ description="Estimated impressions for this flat rate option (informational, commonly used with SOV or time-based DOOH)",
31
31
  ge=0,
32
32
  ),
33
33
  ] = None
34
34
  loop_duration_seconds: Annotated[
35
- int | None, Field(description='Duration of ad loop rotation in seconds (DOOH)', ge=1)
35
+ int | None, Field(description="Duration of ad loop rotation in seconds (DOOH)", ge=1)
36
36
  ] = None
37
37
  min_plays_per_hour: Annotated[
38
38
  int | None,
39
39
  Field(
40
- description='Minimum number of times ad plays per hour (DOOH frequency guarantee)', ge=0
40
+ description="Minimum number of times ad plays per hour (DOOH frequency guarantee)", ge=0
41
41
  ),
42
42
  ] = None
43
43
  sov_percentage: Annotated[
44
44
  float | None,
45
45
  Field(
46
- description='Guaranteed share of voice as percentage (DOOH, 0-100)', ge=0.0, le=100.0
46
+ description="Guaranteed share of voice as percentage (DOOH, 0-100)", ge=0.0, le=100.0
47
47
  ),
48
48
  ] = None
49
49
  venue_package: Annotated[
@@ -56,33 +56,33 @@ class Parameters(AdCPBaseModel):
56
56
 
57
57
  class FlatRatePricingOption(AdCPBaseModel):
58
58
  model_config = ConfigDict(
59
- extra='forbid',
59
+ extra="allow",
60
60
  )
61
61
  currency: Annotated[
62
62
  str,
63
63
  Field(
64
- description='ISO 4217 currency code',
65
- examples=['USD', 'EUR', 'GBP', 'JPY'],
66
- pattern='^[A-Z]{3}$',
64
+ description="ISO 4217 currency code",
65
+ examples=["USD", "EUR", "GBP", "JPY"],
66
+ pattern="^[A-Z]{3}$",
67
67
  ),
68
68
  ]
69
69
  is_fixed: Annotated[
70
70
  Literal[True],
71
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
71
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
72
72
  ]
73
73
  min_spend_per_package: Annotated[
74
74
  float | None,
75
75
  Field(
76
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
76
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
77
77
  ge=0.0,
78
78
  ),
79
79
  ] = None
80
80
  parameters: Annotated[
81
81
  Parameters | None,
82
- Field(description='Flat rate parameters for DOOH and time-based campaigns'),
82
+ Field(description="Flat rate parameters for DOOH and time-based campaigns"),
83
83
  ] = None
84
84
  pricing_model: Annotated[
85
- Literal['flat_rate'], Field(description='Fixed cost regardless of delivery volume')
85
+ Literal["flat_rate"], Field(description="Fixed cost regardless of delivery volume")
86
86
  ]
87
87
  pricing_option_id: Annotated[
88
88
  str,
@@ -90,4 +90,4 @@ class FlatRatePricingOption(AdCPBaseModel):
90
90
  description="Unique identifier for this pricing option within the product (e.g., 'flat_rate_usd_24h_takeover')"
91
91
  ),
92
92
  ]
93
- rate: Annotated[float, Field(description='Flat rate cost', ge=0.0)]
93
+ rate: Annotated[float, Field(description="Flat rate cost", ge=0.0)]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/vcpm_auction_option.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -11,47 +11,47 @@ 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)]
14
+ floor: Annotated[float, Field(description="Minimum acceptable bid price", ge=0.0)]
15
15
  p25: Annotated[
16
- float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
16
+ float | None, Field(description="25th percentile of recent winning bids", ge=0.0)
17
17
  ] = None
18
- p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
18
+ p50: Annotated[float | None, Field(description="Median of recent winning bids", ge=0.0)] = None
19
19
  p75: Annotated[
20
- float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
20
+ float | None, Field(description="75th percentile of recent winning bids", ge=0.0)
21
21
  ] = None
22
22
  p90: Annotated[
23
- float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
23
+ float | None, Field(description="90th percentile of recent winning bids", ge=0.0)
24
24
  ] = None
25
25
 
26
26
 
27
27
  class VcpmAuctionPricingOption(AdCPBaseModel):
28
28
  model_config = ConfigDict(
29
- extra='forbid',
29
+ extra="allow",
30
30
  )
31
31
  currency: Annotated[
32
32
  str,
33
33
  Field(
34
- description='ISO 4217 currency code',
35
- examples=['USD', 'EUR', 'GBP', 'JPY'],
36
- pattern='^[A-Z]{3}$',
34
+ description="ISO 4217 currency code",
35
+ examples=["USD", "EUR", "GBP", "JPY"],
36
+ pattern="^[A-Z]{3}$",
37
37
  ),
38
38
  ]
39
39
  is_fixed: Annotated[
40
40
  Literal[False],
41
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
41
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
42
42
  ]
43
43
  min_spend_per_package: Annotated[
44
44
  float | None,
45
45
  Field(
46
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
46
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
47
47
  ge=0.0,
48
48
  ),
49
49
  ] = None
50
50
  price_guidance: Annotated[
51
- PriceGuidance, Field(description='Statistical guidance for auction pricing')
51
+ PriceGuidance, Field(description="Statistical guidance for auction pricing")
52
52
  ]
53
53
  pricing_model: Annotated[
54
- Literal['vcpm'], Field(description='Cost per 1,000 viewable impressions (MRC standard)')
54
+ Literal["vcpm"], Field(description="Cost per 1,000 viewable impressions (MRC standard)")
55
55
  ]
56
56
  pricing_option_id: Annotated[
57
57
  str,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/vcpm_fixed_option.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,29 +12,29 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class VcpmFixedRatePricingOption(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra="allow",
16
16
  )
17
17
  currency: Annotated[
18
18
  str,
19
19
  Field(
20
- description='ISO 4217 currency code',
21
- examples=['USD', 'EUR', 'GBP', 'JPY'],
22
- pattern='^[A-Z]{3}$',
20
+ description="ISO 4217 currency code",
21
+ examples=["USD", "EUR", "GBP", "JPY"],
22
+ pattern="^[A-Z]{3}$",
23
23
  ),
24
24
  ]
25
25
  is_fixed: Annotated[
26
26
  Literal[True],
27
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
27
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
28
28
  ]
29
29
  min_spend_per_package: Annotated[
30
30
  float | None,
31
31
  Field(
32
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
32
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
33
33
  ge=0.0,
34
34
  ),
35
35
  ] = None
36
36
  pricing_model: Annotated[
37
- Literal['vcpm'], Field(description='Cost per 1,000 viewable impressions (MRC standard)')
37
+ Literal["vcpm"], Field(description="Cost per 1,000 viewable impressions (MRC standard)")
38
38
  ]
39
39
  pricing_option_id: Annotated[
40
40
  str,
@@ -43,5 +43,5 @@ class VcpmFixedRatePricingOption(AdCPBaseModel):
43
43
  ),
44
44
  ]
45
45
  rate: Annotated[
46
- float, Field(description='Fixed vCPM rate (cost per 1,000 viewable impressions)', ge=0.0)
46
+ float, Field(description="Fixed vCPM rate (cost per 1,000 viewable impressions)", ge=0.0)
47
47
  ]
@@ -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-14T17:08:13+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-14T17:08:13+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-14T17:08:13+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")]