adcp 2.18.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 (245) 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 +87 -1
  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 -18
  18. adcp/types/_generated.py +419 -44
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +103 -6
  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 +1 -1
  41. adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
  42. adcp/types/generated_poc/core/assets/css_asset.py +1 -1
  43. adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
  44. adcp/types/generated_poc/core/assets/html_asset.py +1 -1
  45. adcp/types/generated_poc/core/assets/image_asset.py +1 -1
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
  47. adcp/types/generated_poc/core/assets/text_asset.py +1 -1
  48. adcp/types/generated_poc/core/assets/url_asset.py +1 -1
  49. adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
  50. adcp/types/generated_poc/core/assets/video_asset.py +1 -1
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
  52. adcp/types/generated_poc/core/async_response_data.py +1 -1
  53. adcp/types/generated_poc/core/brand_manifest.py +68 -5
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
  55. adcp/types/generated_poc/core/context.py +1 -1
  56. adcp/types/generated_poc/core/creative_asset.py +8 -7
  57. adcp/types/generated_poc/core/creative_assignment.py +1 -1
  58. adcp/types/generated_poc/core/creative_filters.py +4 -14
  59. adcp/types/generated_poc/core/creative_manifest.py +1 -1
  60. adcp/types/generated_poc/core/creative_policy.py +1 -1
  61. adcp/types/generated_poc/core/delivery_metrics.py +1 -1
  62. adcp/types/generated_poc/core/deployment.py +1 -1
  63. adcp/types/generated_poc/core/destination.py +1 -1
  64. adcp/types/generated_poc/core/error.py +1 -1
  65. adcp/types/generated_poc/core/ext.py +1 -1
  66. adcp/types/generated_poc/core/format.py +6 -5
  67. adcp/types/generated_poc/core/format_id.py +1 -1
  68. adcp/types/generated_poc/core/frequency_cap.py +1 -1
  69. adcp/types/generated_poc/core/identifier.py +27 -0
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
  71. adcp/types/generated_poc/core/measurement.py +1 -1
  72. adcp/types/generated_poc/core/media_buy.py +1 -1
  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 +1 -1
  76. adcp/types/generated_poc/core/performance_feedback.py +1 -1
  77. adcp/types/generated_poc/core/placement.py +1 -1
  78. adcp/types/generated_poc/core/pricing_option.py +8 -14
  79. adcp/types/generated_poc/core/product.py +1 -1
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +72 -7
  82. adcp/types/generated_poc/core/promoted_offerings.py +12 -21
  83. adcp/types/generated_poc/core/promoted_products.py +1 -1
  84. adcp/types/generated_poc/core/property.py +1 -1
  85. adcp/types/generated_poc/core/property_id.py +1 -1
  86. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  87. adcp/types/generated_poc/core/property_tag.py +1 -1
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +1 -1
  90. adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
  91. adcp/types/generated_poc/core/push_notification_config.py +1 -1
  92. adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +1 -1
  95. adcp/types/generated_poc/core/signal_filters.py +1 -1
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +1 -1
  98. adcp/types/generated_poc/core/targeting.py +55 -14
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
  101. adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
  102. adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
  103. adcp/types/generated_poc/creative/preview_render.py +1 -1
  104. adcp/types/generated_poc/enums/adcp_domain.py +3 -1
  105. adcp/types/generated_poc/enums/asset_content_type.py +1 -1
  106. adcp/types/generated_poc/enums/auth_scheme.py +1 -1
  107. adcp/types/generated_poc/enums/available_metric.py +1 -1
  108. adcp/types/generated_poc/enums/channels.py +18 -8
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
  110. adcp/types/generated_poc/enums/creative_action.py +1 -1
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
  112. adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
  113. adcp/types/generated_poc/enums/creative_status.py +2 -1
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
  115. adcp/types/generated_poc/enums/daast_version.py +1 -1
  116. adcp/types/generated_poc/enums/delivery_type.py +1 -1
  117. adcp/types/generated_poc/enums/dimension_unit.py +1 -1
  118. adcp/types/generated_poc/enums/feed_format.py +1 -1
  119. adcp/types/generated_poc/enums/feedback_source.py +1 -1
  120. adcp/types/generated_poc/enums/format_category.py +1 -1
  121. adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +1 -1
  125. adcp/types/generated_poc/enums/http_method.py +1 -1
  126. adcp/types/generated_poc/enums/identifier_types.py +1 -1
  127. adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
  129. adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
  130. adcp/types/generated_poc/enums/media_buy_status.py +1 -1
  131. adcp/types/generated_poc/enums/metric_type.py +1 -1
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +1 -1
  134. adcp/types/generated_poc/enums/pacing.py +1 -1
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +1 -1
  137. adcp/types/generated_poc/enums/pricing_model.py +1 -1
  138. adcp/types/generated_poc/enums/property_type.py +2 -1
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
  140. adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
  142. adcp/types/generated_poc/enums/sort_direction.py +1 -1
  143. adcp/types/generated_poc/enums/task_status.py +1 -1
  144. adcp/types/generated_poc/enums/task_type.py +7 -1
  145. adcp/types/generated_poc/enums/update_frequency.py +1 -1
  146. adcp/types/generated_poc/enums/url_asset_type.py +1 -1
  147. adcp/types/generated_poc/enums/validation_mode.py +1 -1
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
  149. adcp/types/generated_poc/enums/vast_version.py +1 -1
  150. adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
  151. adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
  152. adcp/types/generated_poc/extensions/__init__.py +3 -0
  153. adcp/types/generated_poc/extensions/extension_meta.py +58 -0
  154. adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
  155. adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  158. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +1 -1
  159. adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
  160. adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
  162. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
  163. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
  164. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
  165. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
  166. adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
  167. adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
  169. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
  170. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
  171. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
  172. adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
  173. adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
  174. adcp/types/generated_poc/media_buy/package_request.py +15 -6
  175. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
  182. adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
  187. adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
  188. adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
  189. adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
  190. adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
  191. adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
  192. adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
  193. adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
  194. adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
  195. adcp/types/generated_poc/property/__init__.py +3 -0
  196. adcp/types/generated_poc/property/base_property_source.py +86 -0
  197. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  198. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  199. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  200. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  201. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  202. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  203. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  204. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  205. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  206. adcp/types/generated_poc/property/property_error.py +33 -0
  207. adcp/types/generated_poc/property/property_feature.py +22 -0
  208. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  209. adcp/types/generated_poc/property/property_list.py +62 -0
  210. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  211. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  212. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  213. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  214. adcp/types/generated_poc/protocol/__init__.py +3 -0
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  217. adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
  218. adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
  219. adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
  220. adcp/types/generated_poc/signals/get_signals_request.py +1 -1
  221. adcp/types/generated_poc/signals/get_signals_response.py +1 -1
  222. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  232. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  233. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  234. adcp/utils/format_assets.py +5 -5
  235. adcp/utils/preview_cache.py +2 -2
  236. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  237. adcp-3.0.0.dist-info/RECORD +264 -0
  238. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  239. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  240. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp-2.18.0.dist-info/RECORD +0 -195
  243. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  244. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  245. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,66 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/content_standards.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 Field
11
+
12
+ from ..core import ext as ext_1
13
+ from ..enums import channels
14
+ from . import artifact
15
+
16
+
17
+ class CalibrationExemplars(AdCPBaseModel):
18
+ fail: Annotated[
19
+ list[artifact.Artifact] | None,
20
+ Field(description='Artifacts that fail the content standards'),
21
+ ] = None
22
+ pass_: Annotated[
23
+ list[artifact.Artifact] | None,
24
+ Field(alias='pass', description='Artifacts that pass the content standards'),
25
+ ] = None
26
+
27
+
28
+ class ContentStandards(AdCPBaseModel):
29
+ calibration_exemplars: Annotated[
30
+ CalibrationExemplars | None,
31
+ Field(
32
+ description='Training/test set to calibrate policy interpretation. Provides concrete examples of pass/fail decisions.'
33
+ ),
34
+ ] = None
35
+ channels_any: Annotated[
36
+ list[channels.MediaChannel] | None,
37
+ Field(
38
+ description='Advertising channels. Standards apply to ANY of the listed channels (OR logic).'
39
+ ),
40
+ ] = None
41
+ countries_all: Annotated[
42
+ list[str] | None,
43
+ Field(
44
+ description='ISO 3166-1 alpha-2 country codes. Standards apply in ALL listed countries (AND logic).'
45
+ ),
46
+ ] = None
47
+ ext: ext_1.ExtensionObject | None = None
48
+ languages_any: Annotated[
49
+ list[str] | None,
50
+ Field(
51
+ 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.",
52
+ min_length=1,
53
+ ),
54
+ ] = None
55
+ name: Annotated[
56
+ str | None, Field(description='Human-readable name for this standards configuration')
57
+ ] = None
58
+ policy: Annotated[
59
+ str | None,
60
+ Field(
61
+ description='Natural language policy describing acceptable and unacceptable content contexts. Used by LLMs and human reviewers to make judgments.'
62
+ ),
63
+ ] = None
64
+ standards_id: Annotated[
65
+ str, Field(description='Unique identifier for this standards configuration')
66
+ ]
@@ -0,0 +1,97 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/create_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],
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
+ ]
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 CreateContentStandardsRequest(AdCPBaseModel):
80
+ model_config = ConfigDict(
81
+ extra='allow',
82
+ )
83
+ calibration_exemplars: Annotated[
84
+ CalibrationExemplars | None,
85
+ Field(
86
+ description='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,
93
+ Field(
94
+ description='Natural language policy describing acceptable and unacceptable content contexts. Used by LLMs and human reviewers to make judgments.'
95
+ ),
96
+ ]
97
+ scope: Annotated[Scope, Field(description='Where this standards configuration applies')]
@@ -0,0 +1,52 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/create_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
+
16
+
17
+ class CreateContentStandardsResponse1(AdCPBaseModel):
18
+ context: context_1.ContextObject | None = None
19
+ errors: Annotated[
20
+ Any | None, Field(description='Field must not be present in success response')
21
+ ] = None
22
+ ext: ext_1.ExtensionObject | None = None
23
+ standards_id: Annotated[
24
+ str, Field(description='Unique identifier for the created standards configuration')
25
+ ]
26
+
27
+
28
+ class CreateContentStandardsResponse2(AdCPBaseModel):
29
+ conflicting_standards_id: Annotated[
30
+ str | None,
31
+ Field(
32
+ description='If the error is a scope conflict, the ID of the existing standards that conflict'
33
+ ),
34
+ ] = None
35
+ context: context_1.ContextObject | None = None
36
+ errors: list[error.Error]
37
+ ext: ext_1.ExtensionObject | None = None
38
+ standards_id: Annotated[
39
+ Any | None, Field(description='Field must not be present in error response')
40
+ ] = None
41
+
42
+
43
+ class CreateContentStandardsResponse(
44
+ RootModel[CreateContentStandardsResponse1 | CreateContentStandardsResponse2]
45
+ ):
46
+ root: Annotated[
47
+ CreateContentStandardsResponse1 | CreateContentStandardsResponse2,
48
+ Field(
49
+ description='Response payload for creating a content standards configuration',
50
+ title='Create Content Standards Response',
51
+ ),
52
+ ]
@@ -0,0 +1,21 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/get_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 Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class GetContentStandardsRequest(AdCPBaseModel):
17
+ context: context_1.ContextObject | None = None
18
+ ext: ext_1.ExtensionObject | None = None
19
+ standards_id: Annotated[
20
+ str, Field(description='Identifier for the standards configuration to retrieve')
21
+ ]
@@ -0,0 +1,43 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/get_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 .content_standards import ContentStandards
16
+
17
+
18
+ class GetContentStandardsResponse2(AdCPBaseModel):
19
+ context: context_1.ContextObject | None = None
20
+ errors: list[error.Error]
21
+ ext: ext_1.ExtensionObject | None = None
22
+ standards_id: Annotated[
23
+ Any | None, Field(description='Field must not be present in error response')
24
+ ] = None
25
+
26
+
27
+ class GetContentStandardsResponse1(ContentStandards):
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
+
33
+
34
+ class GetContentStandardsResponse(
35
+ RootModel[GetContentStandardsResponse1 | GetContentStandardsResponse2]
36
+ ):
37
+ root: Annotated[
38
+ GetContentStandardsResponse1 | GetContentStandardsResponse2,
39
+ Field(
40
+ description='Response payload with content safety policies',
41
+ title='Get Content Standards Response',
42
+ ),
43
+ ]
@@ -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