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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +6 -14
  3. adcp/__main__.py +94 -51
  4. adcp/adagents.py +91 -19
  5. adcp/client.py +865 -0
  6. adcp/protocols/a2a.py +84 -0
  7. adcp/protocols/base.py +101 -0
  8. adcp/protocols/mcp.py +84 -0
  9. adcp/server/__init__.py +49 -0
  10. adcp/server/base.py +368 -0
  11. adcp/server/content_standards.py +561 -0
  12. adcp/server/governance.py +491 -0
  13. adcp/server/mcp_tools.py +471 -0
  14. adcp/server/proposal.py +334 -0
  15. adcp/server/sponsored_intelligence.py +444 -0
  16. adcp/types/__init__.py +111 -23
  17. adcp/types/_ergonomic.py +35 -14
  18. adcp/types/_generated.py +346 -52
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +196 -189
  22. adcp/types/generated_poc/content_standards/__init__.py +3 -0
  23. adcp/types/generated_poc/content_standards/artifact.py +208 -0
  24. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  25. adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  26. adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  27. adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  28. adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  29. adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  30. adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  31. adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  32. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  33. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  34. adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  35. adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  36. adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  37. adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  38. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  39. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  40. adcp/types/generated_poc/core/activation_key.py +9 -9
  41. adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  42. adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  43. adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
  44. adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  45. adcp/types/generated_poc/core/assets/image_asset.py +7 -7
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  47. adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  48. adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  49. adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
  50. adcp/types/generated_poc/core/assets/video_asset.py +8 -8
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  52. adcp/types/generated_poc/core/async_response_data.py +3 -3
  53. adcp/types/generated_poc/core/brand_manifest.py +122 -59
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +10 -10
  55. adcp/types/generated_poc/core/context.py +2 -2
  56. adcp/types/generated_poc/core/creative_asset.py +20 -19
  57. adcp/types/generated_poc/core/creative_assignment.py +4 -4
  58. adcp/types/generated_poc/core/creative_filters.py +18 -28
  59. adcp/types/generated_poc/core/creative_manifest.py +3 -3
  60. adcp/types/generated_poc/core/creative_policy.py +5 -5
  61. adcp/types/generated_poc/core/delivery_metrics.py +33 -33
  62. adcp/types/generated_poc/core/deployment.py +21 -21
  63. adcp/types/generated_poc/core/destination.py +12 -12
  64. adcp/types/generated_poc/core/error.py +7 -7
  65. adcp/types/generated_poc/core/ext.py +2 -2
  66. adcp/types/generated_poc/core/format.py +66 -66
  67. adcp/types/generated_poc/core/format_id.py +6 -6
  68. adcp/types/generated_poc/core/frequency_cap.py +3 -3
  69. adcp/types/generated_poc/core/identifier.py +3 -3
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
  71. adcp/types/generated_poc/core/measurement.py +9 -9
  72. adcp/types/generated_poc/core/media_buy.py +8 -8
  73. adcp/types/generated_poc/core/media_buy_features.py +29 -0
  74. adcp/types/generated_poc/core/offering.py +80 -0
  75. adcp/types/generated_poc/core/package.py +9 -9
  76. adcp/types/generated_poc/core/performance_feedback.py +19 -19
  77. adcp/types/generated_poc/core/placement.py +5 -5
  78. adcp/types/generated_poc/core/pricing_option.py +9 -15
  79. adcp/types/generated_poc/core/product.py +21 -21
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +89 -24
  82. adcp/types/generated_poc/core/promoted_offerings.py +29 -38
  83. adcp/types/generated_poc/core/promoted_products.py +3 -3
  84. adcp/types/generated_poc/core/property.py +10 -10
  85. adcp/types/generated_poc/core/property_id.py +5 -5
  86. adcp/types/generated_poc/core/property_list_ref.py +5 -5
  87. adcp/types/generated_poc/core/property_tag.py +5 -5
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  90. adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  91. adcp/types/generated_poc/core/push_notification_config.py +6 -6
  92. adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +5 -5
  95. adcp/types/generated_poc/core/signal_filters.py +6 -6
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +15 -15
  98. adcp/types/generated_poc/core/targeting.py +59 -18
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  101. adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
  102. adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
  103. adcp/types/generated_poc/creative/preview_render.py +26 -26
  104. adcp/types/generated_poc/enums/adcp_domain.py +5 -5
  105. adcp/types/generated_poc/enums/asset_content_type.py +14 -14
  106. adcp/types/generated_poc/enums/auth_scheme.py +3 -3
  107. adcp/types/generated_poc/enums/available_metric.py +10 -10
  108. adcp/types/generated_poc/enums/channels.py +21 -11
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
  110. adcp/types/generated_poc/enums/creative_action.py +6 -6
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
  112. adcp/types/generated_poc/enums/creative_sort_field.py +7 -7
  113. adcp/types/generated_poc/enums/creative_status.py +6 -5
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +12 -12
  115. adcp/types/generated_poc/enums/daast_version.py +3 -3
  116. adcp/types/generated_poc/enums/delivery_type.py +3 -3
  117. adcp/types/generated_poc/enums/dimension_unit.py +5 -5
  118. adcp/types/generated_poc/enums/feed_format.py +4 -4
  119. adcp/types/generated_poc/enums/feedback_source.py +5 -5
  120. adcp/types/generated_poc/enums/format_category.py +8 -8
  121. adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +3 -3
  125. adcp/types/generated_poc/enums/http_method.py +3 -3
  126. adcp/types/generated_poc/enums/identifier_types.py +20 -20
  127. adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
  129. adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
  130. adcp/types/generated_poc/enums/media_buy_status.py +5 -5
  131. adcp/types/generated_poc/enums/metric_type.py +9 -9
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +5 -5
  134. adcp/types/generated_poc/enums/pacing.py +4 -4
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +3 -3
  137. adcp/types/generated_poc/enums/pricing_model.py +8 -8
  138. adcp/types/generated_poc/enums/property_type.py +9 -8
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
  140. adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
  142. adcp/types/generated_poc/enums/sort_direction.py +3 -3
  143. adcp/types/generated_poc/enums/task_status.py +10 -10
  144. adcp/types/generated_poc/enums/task_type.py +12 -12
  145. adcp/types/generated_poc/enums/update_frequency.py +5 -5
  146. adcp/types/generated_poc/enums/url_asset_type.py +4 -4
  147. adcp/types/generated_poc/enums/validation_mode.py +3 -3
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +17 -17
  149. adcp/types/generated_poc/enums/vast_version.py +6 -6
  150. adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
  151. adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
  152. adcp/types/generated_poc/extensions/extension_meta.py +20 -12
  153. adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  154. adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  155. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  158. adcp/types/generated_poc/media_buy/create_media_buy_request.py +65 -37
  159. adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  160. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  162. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  163. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  164. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  165. adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
  166. adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
  167. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
  169. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  170. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  171. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  172. adcp/types/generated_poc/media_buy/list_creatives_response.py +54 -57
  173. adcp/types/generated_poc/media_buy/package_request.py +12 -12
  174. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  175. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  177. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  180. adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  181. adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  182. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  185. adcp/types/generated_poc/media_buy/update_media_buy_request.py +28 -124
  186. adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  187. adcp/types/generated_poc/pricing_options/cpc_option.py +40 -15
  188. adcp/types/generated_poc/pricing_options/cpcv_option.py +41 -16
  189. adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
  190. adcp/types/generated_poc/pricing_options/cpp_option.py +46 -23
  191. adcp/types/generated_poc/pricing_options/cpv_option.py +45 -26
  192. adcp/types/generated_poc/pricing_options/flat_rate_option.py +53 -47
  193. adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
  194. adcp/types/generated_poc/property/base_property_source.py +16 -16
  195. adcp/types/generated_poc/property/create_property_list_request.py +5 -5
  196. adcp/types/generated_poc/property/create_property_list_response.py +4 -4
  197. adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
  198. adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
  199. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  200. adcp/types/generated_poc/property/get_property_list_request.py +6 -6
  201. adcp/types/generated_poc/property/get_property_list_response.py +12 -12
  202. adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
  203. adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
  204. adcp/types/generated_poc/property/property_error.py +11 -11
  205. adcp/types/generated_poc/property/property_feature.py +5 -5
  206. adcp/types/generated_poc/property/property_feature_definition.py +19 -19
  207. adcp/types/generated_poc/property/property_list.py +12 -12
  208. adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
  209. adcp/types/generated_poc/property/property_list_filters.py +9 -9
  210. adcp/types/generated_poc/property/update_property_list_request.py +9 -9
  211. adcp/types/generated_poc/property/update_property_list_response.py +3 -3
  212. adcp/types/generated_poc/protocol/__init__.py +3 -0
  213. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  214. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  215. adcp/types/generated_poc/protocols/adcp_extension.py +14 -17
  216. adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  217. adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  218. adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  219. adcp/types/generated_poc/signals/get_signals_response.py +16 -16
  220. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  232. adcp/utils/format_assets.py +5 -5
  233. adcp/utils/preview_cache.py +2 -2
  234. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  235. adcp-3.0.0.dist-info/RECORD +264 -0
  236. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  237. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  238. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
  239. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  240. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp/types/generated_poc/property/list_property_features_request.py +0 -25
  243. adcp/types/generated_poc/property/list_property_features_response.py +0 -24
  244. adcp-2.19.0.dist-info/RECORD +0 -220
  245. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  246. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  247. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,64 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/get_media_buy_artifacts_request.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import AwareDatetime, Field
12
+
13
+ from ..core import context as context_1
14
+ from ..core import ext as ext_1
15
+
16
+
17
+ class Method(Enum):
18
+ random = 'random'
19
+ stratified = 'stratified'
20
+ recent = 'recent'
21
+ failures_only = 'failures_only'
22
+
23
+
24
+ class Sampling(AdCPBaseModel):
25
+ method: Annotated[Method | None, Field(description='How to select the sample')] = None
26
+ rate: Annotated[
27
+ float | None,
28
+ Field(
29
+ description='Sampling rate (0-1). 1.0 = all deliveries, 0.25 = 25% sample.',
30
+ ge=0.0,
31
+ le=1.0,
32
+ ),
33
+ ] = None
34
+
35
+
36
+ class TimeRange(AdCPBaseModel):
37
+ end: Annotated[AwareDatetime | None, Field(description='End of time range (exclusive)')] = None
38
+ start: Annotated[AwareDatetime | None, Field(description='Start of time range (inclusive)')] = (
39
+ None
40
+ )
41
+
42
+
43
+ class GetMediaBuyArtifactsRequest(AdCPBaseModel):
44
+ context: context_1.ContextObject | None = None
45
+ cursor: Annotated[
46
+ str | None, Field(description='Pagination cursor for fetching subsequent pages')
47
+ ] = None
48
+ ext: ext_1.ExtensionObject | None = None
49
+ limit: Annotated[
50
+ int | None, Field(description='Maximum artifacts to return per request', ge=1, le=10000)
51
+ ] = 1000
52
+ media_buy_id: Annotated[str, Field(description='Media buy to get artifacts from')]
53
+ package_ids: Annotated[
54
+ list[str] | None, Field(description='Filter to specific packages within the media buy')
55
+ ] = None
56
+ sampling: Annotated[
57
+ Sampling | None,
58
+ Field(
59
+ description='Sampling parameters. Defaults to the sampling rate agreed in the media buy.'
60
+ ),
61
+ ] = None
62
+ time_range: Annotated[TimeRange | None, Field(description='Filter to specific time period')] = (
63
+ None
64
+ )
@@ -0,0 +1,117 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/get_media_buy_artifacts_response.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated, Any
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import AwareDatetime, Field, RootModel
12
+
13
+ from ..core import context as context_1
14
+ from ..core import error
15
+ from ..core import ext as ext_1
16
+ from . import artifact as artifact_1
17
+
18
+
19
+ class BrandContext(AdCPBaseModel):
20
+ brand_id: Annotated[str | None, Field(description='Brand identifier')] = None
21
+ sku_id: Annotated[str | None, Field(description='Product/SKU identifier if applicable')] = None
22
+
23
+
24
+ class LocalVerdict(Enum):
25
+ pass_ = 'pass'
26
+ fail = 'fail'
27
+ unevaluated = 'unevaluated'
28
+
29
+
30
+ class Pagination(AdCPBaseModel):
31
+ cursor: Annotated[str | None, Field(description='Cursor for fetching the next page')] = None
32
+ has_more: Annotated[bool | None, Field(description='Whether more results are available')] = None
33
+
34
+
35
+ class Method(Enum):
36
+ random = 'random'
37
+ stratified = 'stratified'
38
+ recent = 'recent'
39
+ failures_only = 'failures_only'
40
+
41
+
42
+ class SamplingInfo(AdCPBaseModel):
43
+ effective_rate: Annotated[float | None, Field(description='Actual sampling rate achieved')] = (
44
+ None
45
+ )
46
+ method: Annotated[Method | None, Field(description='Sampling method used')] = None
47
+ sampled_count: Annotated[
48
+ int | None, Field(description='Number of artifacts in this response')
49
+ ] = None
50
+ total_deliveries: Annotated[
51
+ int | None, Field(description='Total deliveries in the time range')
52
+ ] = None
53
+
54
+
55
+ class GetMediaBuyArtifactsResponse2(AdCPBaseModel):
56
+ context: context_1.ContextObject | None = None
57
+ errors: list[error.Error]
58
+ ext: ext_1.ExtensionObject | None = None
59
+ media_buy_id: Annotated[
60
+ Any | None, Field(description='Field must not be present in error response')
61
+ ] = None
62
+
63
+
64
+ class Artifact(AdCPBaseModel):
65
+ artifact: Annotated[artifact_1.Artifact, Field(description='Full artifact with content assets')]
66
+ brand_context: Annotated[
67
+ BrandContext | None,
68
+ Field(
69
+ description='Brand information for policy evaluation. Schema TBD - placeholder for brand identifiers.'
70
+ ),
71
+ ] = None
72
+ channel: Annotated[
73
+ str | None, Field(description='Channel type (e.g., display, video, audio, social)')
74
+ ] = None
75
+ country: Annotated[
76
+ str | None, Field(description='ISO 3166-1 alpha-2 country code where delivery occurred')
77
+ ] = None
78
+ local_verdict: Annotated[
79
+ LocalVerdict | None, Field(description="Seller's local model verdict for this artifact")
80
+ ] = None
81
+ package_id: Annotated[
82
+ str | None, Field(description='Which package this delivery belongs to')
83
+ ] = None
84
+ record_id: Annotated[str, Field(description='Unique identifier for this delivery record')]
85
+ timestamp: Annotated[AwareDatetime | None, Field(description='When the delivery occurred')] = (
86
+ None
87
+ )
88
+
89
+
90
+ class GetMediaBuyArtifactsResponse1(AdCPBaseModel):
91
+ artifacts: Annotated[
92
+ list[Artifact], Field(description='Delivery records with full artifact content')
93
+ ]
94
+ context: context_1.ContextObject | None = None
95
+ errors: Annotated[
96
+ Any | None, Field(description='Field must not be present in success response')
97
+ ] = None
98
+ ext: ext_1.ExtensionObject | None = None
99
+ media_buy_id: Annotated[str, Field(description='Media buy these artifacts belong to')]
100
+ pagination: Annotated[
101
+ Pagination | None, Field(description='Pagination information for large result sets')
102
+ ] = None
103
+ sampling_info: Annotated[
104
+ SamplingInfo | None, Field(description='Information about how the sample was generated')
105
+ ] = None
106
+
107
+
108
+ class GetMediaBuyArtifactsResponse(
109
+ RootModel[GetMediaBuyArtifactsResponse1 | GetMediaBuyArtifactsResponse2]
110
+ ):
111
+ root: Annotated[
112
+ GetMediaBuyArtifactsResponse1 | GetMediaBuyArtifactsResponse2,
113
+ Field(
114
+ description='Response containing content artifacts from a media buy for validation',
115
+ title='Get Media Buy Artifacts Response',
116
+ ),
117
+ ]
@@ -0,0 +1,31 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/list_content_standards_request.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+ from ..enums import channels as channels_1
15
+
16
+
17
+ class ListContentStandardsRequest(AdCPBaseModel):
18
+ model_config = ConfigDict(
19
+ extra='allow',
20
+ )
21
+ channels: Annotated[
22
+ list[channels_1.MediaChannel] | None, Field(description='Filter by channel')
23
+ ] = None
24
+ context: context_1.ContextObject | None = None
25
+ countries: Annotated[
26
+ list[str] | None, Field(description='Filter by ISO 3166-1 alpha-2 country codes')
27
+ ] = None
28
+ ext: ext_1.ExtensionObject | None = None
29
+ languages: Annotated[list[str] | None, Field(description='Filter by BCP 47 language tags')] = (
30
+ None
31
+ )
@@ -0,0 +1,48 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/list_content_standards_response.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated, Any
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import Field, RootModel
11
+
12
+ from ..core import context as context_1
13
+ from ..core import error
14
+ from ..core import ext as ext_1
15
+ from . import content_standards
16
+
17
+
18
+ class ListContentStandardsResponse2(AdCPBaseModel):
19
+ context: context_1.ContextObject | None = None
20
+ errors: list[error.Error]
21
+ ext: ext_1.ExtensionObject | None = None
22
+ standards: Annotated[
23
+ Any | None, Field(description='Field must not be present in error response')
24
+ ] = None
25
+
26
+
27
+ class ListContentStandardsResponse1(AdCPBaseModel):
28
+ context: context_1.ContextObject | None = None
29
+ errors: Annotated[
30
+ Any | None, Field(description='Field must not be present in success response')
31
+ ] = None
32
+ ext: ext_1.ExtensionObject | None = None
33
+ standards: Annotated[
34
+ list[content_standards.ContentStandards],
35
+ Field(description='Array of content standards configurations matching the filter criteria'),
36
+ ]
37
+
38
+
39
+ class ListContentStandardsResponse(
40
+ RootModel[ListContentStandardsResponse1 | ListContentStandardsResponse2]
41
+ ):
42
+ root: Annotated[
43
+ ListContentStandardsResponse1 | ListContentStandardsResponse2,
44
+ Field(
45
+ description='Response payload with list of content standards configurations',
46
+ title='List Content Standards Response',
47
+ ),
48
+ ]
@@ -0,0 +1,101 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/update_content_standards_request.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated, Literal
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import AnyUrl, ConfigDict, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+ from ..enums import channels
15
+ from . import artifact
16
+
17
+
18
+ class Fail(AdCPBaseModel):
19
+ language: Annotated[
20
+ str | None, Field(description='BCP 47 language tag for content at this URL')
21
+ ] = None
22
+ type: Annotated[Literal['url'], Field(description='Indicates this is a URL reference')]
23
+ value: Annotated[
24
+ AnyUrl,
25
+ Field(
26
+ description="Full URL to a specific page (e.g., 'https://news.example.com/controversial-article')"
27
+ ),
28
+ ]
29
+
30
+
31
+ class Pass(AdCPBaseModel):
32
+ language: Annotated[
33
+ str | None, Field(description='BCP 47 language tag for content at this URL')
34
+ ] = None
35
+ type: Annotated[Literal['url'], Field(description='Indicates this is a URL reference')]
36
+ value: Annotated[
37
+ AnyUrl,
38
+ Field(
39
+ description="Full URL to a specific page (e.g., 'https://espn.com/nba/story/_/id/12345/lakers-win')"
40
+ ),
41
+ ]
42
+
43
+
44
+ class Scope(AdCPBaseModel):
45
+ channels_any: Annotated[
46
+ list[channels.MediaChannel] | None,
47
+ Field(
48
+ description='Advertising channels. Standards apply to ANY of the listed channels (OR logic).'
49
+ ),
50
+ ] = None
51
+ countries_all: Annotated[
52
+ list[str] | None,
53
+ Field(
54
+ description='ISO 3166-1 alpha-2 country codes. Standards apply in ALL listed countries (AND logic).'
55
+ ),
56
+ ] = None
57
+ description: Annotated[
58
+ str | None, Field(description='Human-readable description of this scope')
59
+ ] = None
60
+ languages_any: Annotated[
61
+ list[str] | None,
62
+ Field(
63
+ description="BCP 47 language tags (e.g., 'en', 'de', 'fr'). Standards apply to content in ANY of these languages (OR logic). Content in unlisted languages is not covered by these standards.",
64
+ min_length=1,
65
+ ),
66
+ ] = None
67
+
68
+
69
+ class CalibrationExemplars(AdCPBaseModel):
70
+ fail: Annotated[
71
+ list[Fail | artifact.Artifact] | None, Field(description='Content that fails the standards')
72
+ ] = None
73
+ pass_: Annotated[
74
+ list[Pass | artifact.Artifact] | None,
75
+ Field(alias='pass', description='Content that passes the standards'),
76
+ ] = None
77
+
78
+
79
+ class UpdateContentStandardsRequest(AdCPBaseModel):
80
+ model_config = ConfigDict(
81
+ extra='allow',
82
+ )
83
+ calibration_exemplars: Annotated[
84
+ CalibrationExemplars | None,
85
+ Field(
86
+ description='Updated training/test set to calibrate policy interpretation. Use URL references for pages to be fetched and analyzed, or full artifacts for pre-extracted content.'
87
+ ),
88
+ ] = None
89
+ context: context_1.ContextObject | None = None
90
+ ext: ext_1.ExtensionObject | None = None
91
+ policy: Annotated[
92
+ str | None,
93
+ Field(
94
+ description='Updated natural language policy describing acceptable and unacceptable content contexts.'
95
+ ),
96
+ ] = None
97
+ scope: Annotated[
98
+ Scope | None,
99
+ Field(description='Updated scope for where this standards configuration applies'),
100
+ ] = None
101
+ standards_id: Annotated[str, Field(description='ID of the standards configuration to update')]
@@ -0,0 +1,34 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/update_content_standards_response.json
3
+ # timestamp: 2026-01-26T11:40:01+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import error
14
+ from ..core import ext as ext_1
15
+
16
+
17
+ class UpdateContentStandardsResponse(AdCPBaseModel):
18
+ model_config = ConfigDict(
19
+ extra='allow',
20
+ )
21
+ conflicting_standards_id: Annotated[
22
+ str | None,
23
+ Field(
24
+ description='If scope change conflicts with another configuration, the ID of the conflicting standards'
25
+ ),
26
+ ] = None
27
+ context: context_1.ContextObject | None = None
28
+ errors: Annotated[
29
+ list[error.Error] | None, Field(description='Errors that occurred during the update')
30
+ ] = None
31
+ ext: ext_1.ExtensionObject | None = None
32
+ standards_id: Annotated[
33
+ str | None, Field(description='ID of the updated standards configuration')
34
+ ] = None
@@ -0,0 +1,59 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/validate_content_delivery_request.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import AwareDatetime, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+ from . import artifact as artifact_1
15
+
16
+
17
+ class BrandContext(AdCPBaseModel):
18
+ brand_id: Annotated[str | None, Field(description='Brand identifier')] = None
19
+ sku_id: Annotated[str | None, Field(description='Product/SKU identifier if applicable')] = None
20
+
21
+
22
+ class Record(AdCPBaseModel):
23
+ artifact: Annotated[artifact_1.Artifact, Field(description='Artifact where ad was delivered')]
24
+ brand_context: Annotated[
25
+ BrandContext | None,
26
+ Field(
27
+ description='Brand information for policy evaluation. Schema TBD - placeholder for brand identifiers.'
28
+ ),
29
+ ] = None
30
+ channel: Annotated[
31
+ str | None, Field(description='Channel type (e.g., display, video, audio, social)')
32
+ ] = None
33
+ country: Annotated[
34
+ str | None, Field(description='ISO 3166-1 alpha-2 country code where delivery occurred')
35
+ ] = None
36
+ media_buy_id: Annotated[
37
+ str | None,
38
+ Field(description='Media buy this record belongs to (when batching across multiple buys)'),
39
+ ] = None
40
+ record_id: Annotated[str, Field(description='Unique identifier for this delivery record')]
41
+ timestamp: Annotated[AwareDatetime | None, Field(description='When the delivery occurred')] = (
42
+ None
43
+ )
44
+
45
+
46
+ class ValidateContentDeliveryRequest(AdCPBaseModel):
47
+ context: context_1.ContextObject | None = None
48
+ ext: ext_1.ExtensionObject | None = None
49
+ feature_ids: Annotated[
50
+ list[str] | None, Field(description='Specific features to evaluate (defaults to all)')
51
+ ] = None
52
+ include_passed: Annotated[
53
+ bool | None, Field(description='Include passed records in results')
54
+ ] = True
55
+ records: Annotated[
56
+ list[Record],
57
+ Field(description='Delivery records to validate (max 10,000)', max_length=10000),
58
+ ]
59
+ standards_id: Annotated[str, Field(description='Standards configuration to validate against')]
@@ -0,0 +1,85 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/validate_content_delivery_response.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated, Any
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import Field, RootModel
12
+
13
+ from ..core import context as context_1
14
+ from ..core import error
15
+ from ..core import ext as ext_1
16
+
17
+
18
+ class Status(Enum):
19
+ passed = 'passed'
20
+ failed = 'failed'
21
+ warning = 'warning'
22
+ unevaluated = 'unevaluated'
23
+
24
+
25
+ class Feature(AdCPBaseModel):
26
+ feature_id: str
27
+ message: str | None = None
28
+ rule_id: Annotated[
29
+ str | None,
30
+ Field(
31
+ description='Which rule triggered this result (e.g., GARM category, Scope3 standard)'
32
+ ),
33
+ ] = None
34
+ status: Status
35
+ value: Any | None = None
36
+
37
+
38
+ class Verdict(Enum):
39
+ pass_ = 'pass'
40
+ fail = 'fail'
41
+
42
+
43
+ class Result(AdCPBaseModel):
44
+ features: Annotated[
45
+ list[Feature] | None, Field(description='Optional feature-level breakdown')
46
+ ] = None
47
+ record_id: Annotated[str, Field(description='Which delivery record was evaluated')]
48
+ verdict: Annotated[Verdict, Field(description='Overall pass/fail verdict for this record')]
49
+
50
+
51
+ class Summary(AdCPBaseModel):
52
+ failed_records: int
53
+ passed_records: int
54
+ total_records: int
55
+
56
+
57
+ class ValidateContentDeliveryResponse1(AdCPBaseModel):
58
+ context: context_1.ContextObject | None = None
59
+ errors: Annotated[
60
+ Any | None, Field(description='Field must not be present in success response')
61
+ ] = None
62
+ ext: ext_1.ExtensionObject | None = None
63
+ results: Annotated[list[Result], Field(description='Per-record evaluation results')]
64
+ summary: Annotated[Summary, Field(description='Summary counts across all records')]
65
+
66
+
67
+ class ValidateContentDeliveryResponse2(AdCPBaseModel):
68
+ context: context_1.ContextObject | None = None
69
+ errors: list[error.Error]
70
+ ext: ext_1.ExtensionObject | None = None
71
+ summary: Annotated[
72
+ Any | None, Field(description='Field must not be present in error response')
73
+ ] = None
74
+
75
+
76
+ class ValidateContentDeliveryResponse(
77
+ RootModel[ValidateContentDeliveryResponse1 | ValidateContentDeliveryResponse2]
78
+ ):
79
+ root: Annotated[
80
+ ValidateContentDeliveryResponse1 | ValidateContentDeliveryResponse2,
81
+ Field(
82
+ description='Response payload with per-record verdicts and optional feature breakdown',
83
+ title='Validate Content Delivery Response',
84
+ ),
85
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/activation_key.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,22 +12,22 @@ from pydantic import ConfigDict, Field, RootModel
12
12
 
13
13
  class ActivationKey1(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra="allow",
15
+ extra='allow',
16
16
  )
17
17
  segment_id: Annotated[
18
18
  str,
19
- Field(description="The platform-specific segment identifier to use in campaign targeting"),
19
+ Field(description='The platform-specific segment identifier to use in campaign targeting'),
20
20
  ]
21
- type: Annotated[Literal["segment_id"], Field(description="Segment ID based targeting")]
21
+ type: Annotated[Literal['segment_id'], Field(description='Segment ID based targeting')]
22
22
 
23
23
 
24
24
  class ActivationKey2(AdCPBaseModel):
25
25
  model_config = ConfigDict(
26
- extra="allow",
26
+ extra='allow',
27
27
  )
28
- key: Annotated[str, Field(description="The targeting parameter key")]
29
- type: Annotated[Literal["key_value"], Field(description="Key-value pair based targeting")]
30
- value: Annotated[str, Field(description="The targeting parameter value")]
28
+ key: Annotated[str, Field(description='The targeting parameter key')]
29
+ type: Annotated[Literal['key_value'], Field(description='Key-value pair based targeting')]
30
+ value: Annotated[str, Field(description='The targeting parameter value')]
31
31
 
32
32
 
33
33
  class ActivationKey(RootModel[ActivationKey1 | ActivationKey2]):
@@ -35,6 +35,6 @@ class ActivationKey(RootModel[ActivationKey1 | ActivationKey2]):
35
35
  ActivationKey1 | ActivationKey2,
36
36
  Field(
37
37
  description="Universal identifier for using a signal on a destination platform. Can be either a segment ID or a key-value pair depending on the platform's targeting mechanism.",
38
- title="Activation Key",
38
+ title='Activation Key',
39
39
  ),
40
40
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/audio_asset.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,15 +12,15 @@ from pydantic import AnyUrl, ConfigDict, Field
12
12
 
13
13
  class AudioAsset(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra="allow",
15
+ extra='allow',
16
16
  )
17
17
  bitrate_kbps: Annotated[
18
- int | None, Field(description="Audio bitrate in kilobits per second", ge=1)
18
+ int | None, Field(description='Audio bitrate in kilobits per second', ge=1)
19
19
  ] = None
20
20
  duration_ms: Annotated[
21
- int | None, Field(description="Audio duration in milliseconds", ge=0)
21
+ int | None, Field(description='Audio duration in milliseconds', ge=0)
22
22
  ] = None
23
- format: Annotated[str | None, Field(description="Audio file format (mp3, wav, aac, etc.)")] = (
23
+ format: Annotated[str | None, Field(description='Audio file format (mp3, wav, aac, etc.)')] = (
24
24
  None
25
25
  )
26
- url: Annotated[AnyUrl, Field(description="URL to the audio asset")]
26
+ url: Annotated[AnyUrl, Field(description='URL to the audio asset')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/css_asset.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,9 +12,9 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class CssAsset(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra="allow",
15
+ extra='allow',
16
16
  )
17
- content: Annotated[str, Field(description="CSS content")]
17
+ content: Annotated[str, Field(description='CSS content')]
18
18
  media: Annotated[
19
19
  str | None, Field(description="CSS media query context (e.g., 'screen', 'print')")
20
20
  ] = None