adcp 2.18.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 (187) hide show
  1. adcp/__init__.py +1 -1
  2. adcp/protocols/mcp.py +3 -1
  3. adcp/types/_ergonomic.py +0 -4
  4. adcp/types/_generated.py +85 -4
  5. adcp/types/generated_poc/adagents.py +239 -149
  6. adcp/types/generated_poc/core/activation_key.py +8 -8
  7. adcp/types/generated_poc/core/assets/audio_asset.py +5 -5
  8. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  9. adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
  10. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  11. adcp/types/generated_poc/core/assets/image_asset.py +6 -6
  12. adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
  13. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  14. adcp/types/generated_poc/core/assets/url_asset.py +3 -3
  15. adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
  16. adcp/types/generated_poc/core/assets/video_asset.py +7 -7
  17. adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
  18. adcp/types/generated_poc/core/async_response_data.py +2 -2
  19. adcp/types/generated_poc/core/brand_manifest.py +55 -55
  20. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  21. adcp/types/generated_poc/core/context.py +1 -1
  22. adcp/types/generated_poc/core/creative_asset.py +13 -13
  23. adcp/types/generated_poc/core/creative_assignment.py +3 -3
  24. adcp/types/generated_poc/core/creative_filters.py +19 -19
  25. adcp/types/generated_poc/core/creative_manifest.py +2 -2
  26. adcp/types/generated_poc/core/creative_policy.py +4 -4
  27. adcp/types/generated_poc/core/delivery_metrics.py +32 -32
  28. adcp/types/generated_poc/core/deployment.py +20 -20
  29. adcp/types/generated_poc/core/destination.py +11 -11
  30. adcp/types/generated_poc/core/error.py +6 -6
  31. adcp/types/generated_poc/core/ext.py +1 -1
  32. adcp/types/generated_poc/core/format.py +67 -66
  33. adcp/types/generated_poc/core/format_id.py +5 -5
  34. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  35. adcp/types/generated_poc/core/identifier.py +27 -0
  36. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  37. adcp/types/generated_poc/core/measurement.py +8 -8
  38. adcp/types/generated_poc/core/media_buy.py +7 -7
  39. adcp/types/generated_poc/core/package.py +8 -8
  40. adcp/types/generated_poc/core/performance_feedback.py +18 -18
  41. adcp/types/generated_poc/core/placement.py +4 -4
  42. adcp/types/generated_poc/core/pricing_option.py +2 -2
  43. adcp/types/generated_poc/core/product.py +20 -20
  44. adcp/types/generated_poc/core/product_filters.py +18 -18
  45. adcp/types/generated_poc/core/promoted_offerings.py +20 -20
  46. adcp/types/generated_poc/core/promoted_products.py +2 -2
  47. adcp/types/generated_poc/core/property.py +9 -9
  48. adcp/types/generated_poc/core/property_id.py +4 -4
  49. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  50. adcp/types/generated_poc/core/property_tag.py +4 -4
  51. adcp/types/generated_poc/core/protocol_envelope.py +8 -8
  52. adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
  53. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  54. adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
  55. adcp/types/generated_poc/core/response.py +4 -4
  56. adcp/types/generated_poc/core/signal_filters.py +5 -5
  57. adcp/types/generated_poc/core/start_timing.py +5 -5
  58. adcp/types/generated_poc/core/sub_asset.py +14 -14
  59. adcp/types/generated_poc/core/targeting.py +8 -8
  60. adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
  61. adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
  62. adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
  63. adcp/types/generated_poc/creative/preview_creative_response.py +31 -30
  64. adcp/types/generated_poc/creative/preview_render.py +25 -25
  65. adcp/types/generated_poc/enums/adcp_domain.py +5 -3
  66. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  67. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  68. adcp/types/generated_poc/enums/available_metric.py +9 -9
  69. adcp/types/generated_poc/enums/channels.py +9 -9
  70. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  71. adcp/types/generated_poc/enums/creative_action.py +5 -5
  72. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  73. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  74. adcp/types/generated_poc/enums/creative_status.py +4 -4
  75. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  76. adcp/types/generated_poc/enums/daast_version.py +2 -2
  77. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  78. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  79. adcp/types/generated_poc/enums/feed_format.py +3 -3
  80. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  81. adcp/types/generated_poc/enums/format_category.py +7 -7
  82. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  83. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  84. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  85. adcp/types/generated_poc/enums/http_method.py +2 -2
  86. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  87. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  88. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  89. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  90. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  91. adcp/types/generated_poc/enums/metric_type.py +8 -8
  92. adcp/types/generated_poc/enums/notification_type.py +4 -4
  93. adcp/types/generated_poc/enums/pacing.py +3 -3
  94. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  95. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  96. adcp/types/generated_poc/enums/property_type.py +7 -7
  97. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  98. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  99. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  100. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  101. adcp/types/generated_poc/enums/standard_format_ids.py +35 -35
  102. adcp/types/generated_poc/enums/task_status.py +9 -9
  103. adcp/types/generated_poc/enums/task_type.py +12 -6
  104. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  105. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  106. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  107. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  108. adcp/types/generated_poc/enums/vast_version.py +5 -5
  109. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  110. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  111. adcp/types/generated_poc/extensions/__init__.py +3 -0
  112. adcp/types/generated_poc/extensions/extension_meta.py +50 -0
  113. adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
  114. adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
  115. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
  116. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  117. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
  118. adcp/types/generated_poc/media_buy/create_media_buy_request.py +25 -25
  119. adcp/types/generated_poc/media_buy/create_media_buy_response.py +7 -7
  120. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
  121. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
  122. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
  123. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  124. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
  125. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  126. adcp/types/generated_poc/media_buy/get_products_response.py +10 -4
  127. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +3 -3
  128. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +7 -7
  129. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
  130. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
  131. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  132. adcp/types/generated_poc/media_buy/list_creatives_response.py +52 -52
  133. adcp/types/generated_poc/media_buy/package_request.py +16 -7
  134. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
  135. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
  136. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
  137. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  138. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
  139. adcp/types/generated_poc/media_buy/sync_creatives_request.py +7 -7
  140. adcp/types/generated_poc/media_buy/sync_creatives_response.py +15 -15
  141. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
  142. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  143. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
  144. adcp/types/generated_poc/media_buy/update_media_buy_request.py +37 -29
  145. adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
  146. adcp/types/generated_poc/pricing_options/cpc_option.py +8 -8
  147. adcp/types/generated_poc/pricing_options/cpcv_option.py +8 -8
  148. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +13 -13
  149. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +8 -8
  150. adcp/types/generated_poc/pricing_options/cpp_option.py +13 -13
  151. adcp/types/generated_poc/pricing_options/cpv_option.py +12 -12
  152. adcp/types/generated_poc/pricing_options/flat_rate_option.py +15 -15
  153. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +13 -13
  154. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +8 -8
  155. adcp/types/generated_poc/property/__init__.py +3 -0
  156. adcp/types/generated_poc/property/base_property_source.py +86 -0
  157. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  158. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  159. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  160. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  161. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  162. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  163. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  164. adcp/types/generated_poc/property/list_property_features_request.py +25 -0
  165. adcp/types/generated_poc/property/list_property_features_response.py +24 -0
  166. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  167. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  168. adcp/types/generated_poc/property/property_error.py +33 -0
  169. adcp/types/generated_poc/property/property_feature.py +22 -0
  170. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  171. adcp/types/generated_poc/property/property_list.py +62 -0
  172. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  173. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  174. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  175. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  176. adcp/types/generated_poc/protocols/adcp_extension.py +26 -10
  177. adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
  178. adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
  179. adcp/types/generated_poc/signals/get_signals_request.py +8 -8
  180. adcp/types/generated_poc/signals/get_signals_response.py +15 -15
  181. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/METADATA +1 -1
  182. adcp-2.19.0.dist-info/RECORD +220 -0
  183. adcp-2.18.0.dist-info/RECORD +0 -195
  184. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/WHEEL +0 -0
  185. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/entry_points.txt +0 -0
  186. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/licenses/LICENSE +0 -0
  187. {adcp-2.18.0.dist-info → adcp-2.19.0.dist-info}/top_level.txt +0 -0
@@ -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
  ]
@@ -45,7 +45,7 @@ class PricingOption(
45
45
  | cpp_option.CppPricingOption
46
46
  | flat_rate_option.FlatRatePricingOption,
47
47
  Field(
48
- description='A pricing model option offered by a publisher for a product. Each pricing model has its own schema with model-specific requirements.',
49
- title='Pricing Option',
48
+ description="A pricing model option offered by a publisher for a product. Each pricing model has its own schema with model-specific requirements.",
49
+ title="Pricing Option",
50
50
  ),
51
51
  ]
@@ -35,100 +35,100 @@ 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
132
  publisher_properties: Annotated[
133
133
  list[publisher_property_selector.PublisherPropertySelector],
134
134
  Field(
@@ -18,43 +18,43 @@ from . import format_id
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 ProductFilters(AdCPBaseModel):
52
52
  model_config = ConfigDict(
53
- extra='allow',
53
+ extra="allow",
54
54
  )
55
55
  budget_range: Annotated[
56
56
  BudgetRange | BudgetRange1 | None,
57
- Field(description='Budget range to filter appropriate products'),
57
+ Field(description="Budget range to filter appropriate products"),
58
58
  ] = None
59
59
  channels: Annotated[
60
60
  list[channels_1.AdvertisingChannels] | None,
@@ -70,28 +70,28 @@ class ProductFilters(AdCPBaseModel):
70
70
  end_date: Annotated[
71
71
  date | None,
72
72
  Field(
73
- description='Campaign end date (ISO 8601 date format: YYYY-MM-DD) for availability checks'
73
+ description="Campaign end date (ISO 8601 date format: YYYY-MM-DD) for availability checks"
74
74
  ),
75
75
  ] = None
76
76
  format_ids: Annotated[
77
- list[format_id.FormatId] | None, Field(description='Filter by specific format IDs')
77
+ list[format_id.FormatId] | None, Field(description="Filter by specific format IDs")
78
78
  ] = None
79
79
  format_types: Annotated[
80
- list[format_category.FormatCategory] | None, Field(description='Filter by format types')
80
+ list[format_category.FormatCategory] | None, Field(description="Filter by format types")
81
81
  ] = None
82
82
  is_fixed_price: Annotated[
83
- bool | None, Field(description='Filter for fixed price vs auction products')
83
+ bool | None, Field(description="Filter for fixed price vs auction products")
84
84
  ] = None
85
85
  min_exposures: Annotated[
86
86
  int | None,
87
- Field(description='Minimum exposures/impressions needed for measurement validity', ge=1),
87
+ Field(description="Minimum exposures/impressions needed for measurement validity", ge=1),
88
88
  ] = None
89
89
  standard_formats_only: Annotated[
90
- bool | None, Field(description='Only return products accepting IAB standard formats')
90
+ bool | None, Field(description="Only return products accepting IAB standard formats")
91
91
  ] = None
92
92
  start_date: Annotated[
93
93
  date | None,
94
94
  Field(
95
- description='Campaign start date (ISO 8601 date format: YYYY-MM-DD) for availability checks'
95
+ description="Campaign start date (ISO 8601 date format: YYYY-MM-DD) for availability checks"
96
96
  ),
97
97
  ] = None
@@ -14,28 +14,28 @@ from . import brand_manifest_ref, 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,10 +45,10 @@ class AssetSelectors(AdCPBaseModel):
45
45
 
46
46
  class Offering(AdCPBaseModel):
47
47
  model_config = ConfigDict(
48
- extra='allow',
48
+ extra="allow",
49
49
  )
50
50
  assets: Annotated[
51
- list[dict[str, Any]] | None, Field(description='Assets specific to this offering')
51
+ list[dict[str, Any]] | None, Field(description="Assets specific to this offering")
52
52
  ] = None
53
53
  description: Annotated[str | None, Field(description="Description of what's being offered")] = (
54
54
  None
@@ -60,27 +60,27 @@ class Offering(AdCPBaseModel):
60
60
 
61
61
  class PromotedOfferings(AdCPBaseModel):
62
62
  model_config = ConfigDict(
63
- extra='allow',
63
+ extra="allow",
64
64
  )
65
65
  asset_selectors: Annotated[
66
66
  AssetSelectors | None,
67
- Field(description='Selectors to choose specific assets from the brand manifest'),
67
+ Field(description="Selectors to choose specific assets from the brand manifest"),
68
68
  ] = None
69
69
  brand_manifest: Annotated[
70
70
  brand_manifest_ref.BrandManifestReference,
71
71
  Field(
72
- description='Brand information manifest containing assets, themes, and guidelines. Can be provided inline or as a URL reference to a hosted manifest.'
72
+ description="Brand information manifest containing assets, themes, and guidelines. Can be provided inline or as a URL reference to a hosted manifest."
73
73
  ),
74
74
  ]
75
75
  offerings: Annotated[
76
76
  list[Offering] | None,
77
77
  Field(
78
- description='Inline offerings for campaigns without a product catalog. Each offering has a name, description, and associated assets.'
78
+ description="Inline offerings for campaigns without a product catalog. Each offering has a name, description, and associated assets."
79
79
  ),
80
80
  ] = None
81
81
  product_selectors: Annotated[
82
82
  promoted_products.PromotedProducts | None,
83
83
  Field(
84
- description='Selectors to choose which products/offerings from the brand manifest product catalog to promote'
84
+ description="Selectors to choose which products/offerings from the brand manifest product catalog to promote"
85
85
  ),
86
86
  ] = None
@@ -12,7 +12,7 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class PromotedProducts(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  manifest_category: Annotated[
18
18
  str | None,
@@ -28,7 +28,7 @@ class PromotedProducts(AdCPBaseModel):
28
28
  ] = None
29
29
  manifest_skus: Annotated[
30
30
  list[str] | None,
31
- Field(description='Direct product SKU references from the brand manifest product catalog'),
31
+ Field(description="Direct product SKU references from the brand manifest product catalog"),
32
32
  ] = None
33
33
  manifest_tags: Annotated[
34
34
  list[str] | None,
@@ -17,11 +17,11 @@ from . import property_tag
17
17
 
18
18
  class Identifier(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='allow',
20
+ extra="allow",
21
21
  )
22
22
  type: Annotated[
23
23
  identifier_types.PropertyIdentifierTypes,
24
- Field(description='Type of identifier for this property'),
24
+ Field(description="Type of identifier for this property"),
25
25
  ]
26
26
  value: Annotated[
27
27
  str,
@@ -33,30 +33,30 @@ class Identifier(AdCPBaseModel):
33
33
 
34
34
  class Property(AdCPBaseModel):
35
35
  model_config = ConfigDict(
36
- extra='allow',
36
+ extra="allow",
37
37
  )
38
38
  identifiers: Annotated[
39
- list[Identifier], Field(description='Array of identifiers for this property', min_length=1)
39
+ list[Identifier], Field(description="Array of identifiers for this property", min_length=1)
40
40
  ]
41
- name: Annotated[str, Field(description='Human-readable property name')]
41
+ name: Annotated[str, Field(description="Human-readable property name")]
42
42
  property_id: Annotated[
43
43
  property_id_1.PropertyId | None,
44
44
  Field(
45
- description='Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects.'
45
+ description="Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects."
46
46
  ),
47
47
  ] = None
48
48
  property_type: Annotated[
49
- property_type_1.PropertyType, Field(description='Type of advertising property')
49
+ property_type_1.PropertyType, Field(description="Type of advertising property")
50
50
  ]
51
51
  publisher_domain: Annotated[
52
52
  str | None,
53
53
  Field(
54
- description='Domain where adagents.json should be checked for authorization validation. Required for list_authorized_properties response. Optional in adagents.json (file location implies domain).'
54
+ description="Domain where adagents.json should be checked for authorization validation. Required for list_authorized_properties response. Optional in adagents.json (file location implies domain)."
55
55
  ),
56
56
  ] = None
57
57
  tags: Annotated[
58
58
  list[property_tag.PropertyTag] | None,
59
59
  Field(
60
- description='Tags for categorization and grouping (e.g., network membership, content categories)'
60
+ description="Tags for categorization and grouping (e.g., network membership, content categories)"
61
61
  ),
62
62
  ] = None
@@ -13,9 +13,9 @@ class PropertyId(RootModel[str]):
13
13
  root: Annotated[
14
14
  str,
15
15
  Field(
16
- description='Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.',
17
- examples=['cnn_ctv_app', 'homepage', 'mobile_ios', 'instagram'],
18
- pattern='^[a-z0-9_]+$',
19
- title='Property ID',
16
+ description="Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.",
17
+ examples=["cnn_ctv_app", "homepage", "mobile_ios", "instagram"],
18
+ pattern="^[a-z0-9_]+$",
19
+ title="Property ID",
20
20
  ),
21
21
  ]
@@ -0,0 +1,26 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/property_list_ref.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 AnyUrl, ConfigDict, Field
11
+
12
+
13
+ class PropertyListReference(AdCPBaseModel):
14
+ model_config = ConfigDict(
15
+ extra="forbid",
16
+ )
17
+ agent_url: Annotated[AnyUrl, Field(description="URL of the agent managing the property list")]
18
+ auth_token: Annotated[
19
+ str | None,
20
+ Field(
21
+ description="JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access."
22
+ ),
23
+ ] = None
24
+ list_id: Annotated[
25
+ str, Field(description="Identifier for the property list within the agent", min_length=1)
26
+ ]
@@ -13,9 +13,9 @@ class PropertyTag(RootModel[str]):
13
13
  root: Annotated[
14
14
  str,
15
15
  Field(
16
- description='Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.',
17
- examples=['ctv', 'premium', 'news', 'sports', 'meta_network', 'social_media'],
18
- pattern='^[a-z0-9_]+$',
19
- title='Property Tag',
16
+ description="Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.",
17
+ examples=["ctv", "premium", "news", "sports", "meta_network", "social_media"],
18
+ pattern="^[a-z0-9_]+$",
19
+ title="Property Tag",
20
20
  ),
21
21
  ]