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,3 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: .schema_temp
3
+ # timestamp: 2026-01-25T21:17:54+00:00
@@ -0,0 +1,208 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/artifact.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, Literal
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field, RootModel
12
+
13
+ from ..core import format_id as format_id_1
14
+ from ..core import identifier
15
+
16
+
17
+ class Role(Enum):
18
+ title_ = 'title'
19
+ paragraph = 'paragraph'
20
+ heading = 'heading'
21
+ caption = 'caption'
22
+ quote = 'quote'
23
+ list_item = 'list_item'
24
+ description = 'description'
25
+
26
+
27
+ class Assets(AdCPBaseModel):
28
+ content: Annotated[str, Field(description='Text content')]
29
+ heading_level: Annotated[
30
+ int | None, Field(description='Heading level (1-6), only for role=heading', ge=1, le=6)
31
+ ] = None
32
+ language: Annotated[
33
+ str | None,
34
+ Field(
35
+ description="BCP 47 language tag for this text (e.g., 'en', 'es-MX'). Useful when artifact contains mixed-language content."
36
+ ),
37
+ ] = None
38
+ role: Annotated[
39
+ Role | None,
40
+ Field(
41
+ description="Role of this text in the document. Use 'title' for the main artifact title, 'description' for summaries."
42
+ ),
43
+ ] = None
44
+ type: Literal['text']
45
+
46
+
47
+ class TranscriptSource(Enum):
48
+ original_script = 'original_script'
49
+ subtitles = 'subtitles'
50
+ closed_captions = 'closed_captions'
51
+ dub = 'dub'
52
+ generated = 'generated'
53
+
54
+
55
+ class TranscriptSource1(Enum):
56
+ original_script = 'original_script'
57
+ closed_captions = 'closed_captions'
58
+ generated = 'generated'
59
+
60
+
61
+ class Identifiers(AdCPBaseModel):
62
+ model_config = ConfigDict(
63
+ extra='allow',
64
+ )
65
+ apple_podcast_id: Annotated[str | None, Field(description='Apple Podcasts ID')] = None
66
+ podcast_guid: Annotated[str | None, Field(description='Podcast GUID (from RSS feed)')] = None
67
+ rss_url: Annotated[AnyUrl | None, Field(description='RSS feed URL')] = None
68
+ spotify_show_id: Annotated[str | None, Field(description='Spotify show ID')] = None
69
+ youtube_video_id: Annotated[str | None, Field(description='YouTube video ID')] = None
70
+
71
+
72
+ class Metadata(AdCPBaseModel):
73
+ model_config = ConfigDict(
74
+ extra='allow',
75
+ )
76
+ author: Annotated[str | None, Field(description='Artifact author name')] = None
77
+ canonical: Annotated[AnyUrl | None, Field(description='Canonical URL')] = None
78
+ json_ld: Annotated[
79
+ list[dict[str, Any]] | None, Field(description='JSON-LD structured data (schema.org)')
80
+ ] = None
81
+ keywords: Annotated[str | None, Field(description='Artifact keywords')] = None
82
+ open_graph: Annotated[
83
+ dict[str, Any] | None, Field(description='Open Graph protocol metadata')
84
+ ] = None
85
+ twitter_card: Annotated[dict[str, Any] | None, Field(description='Twitter Card metadata')] = (
86
+ None
87
+ )
88
+
89
+
90
+ class AssetAccess1(AdCPBaseModel):
91
+ method: Literal['bearer_token']
92
+ token: Annotated[str, Field(description='OAuth2 bearer token for Authorization header')]
93
+
94
+
95
+ class Provider(Enum):
96
+ gcp = 'gcp'
97
+ aws = 'aws'
98
+
99
+
100
+ class AssetAccess2(AdCPBaseModel):
101
+ credentials: Annotated[
102
+ dict[str, Any] | None, Field(description='Service account credentials')
103
+ ] = None
104
+ method: Literal['service_account']
105
+ provider: Annotated[Provider, Field(description='Cloud provider')]
106
+
107
+
108
+ class AssetAccess3(AdCPBaseModel):
109
+ method: Literal['signed_url']
110
+
111
+
112
+ class AssetAccess(RootModel[AssetAccess1 | AssetAccess2 | AssetAccess3]):
113
+ root: Annotated[
114
+ AssetAccess1 | AssetAccess2 | AssetAccess3,
115
+ Field(description='Authentication for accessing secured asset URLs'),
116
+ ]
117
+
118
+
119
+ class Assets1(AdCPBaseModel):
120
+ access: Annotated[AssetAccess | None, Field(description='Authentication for secured URLs')] = (
121
+ None
122
+ )
123
+ alt_text: Annotated[str | None, Field(description='Alt text or image description')] = None
124
+ caption: Annotated[str | None, Field(description='Image caption')] = None
125
+ height: Annotated[int | None, Field(description='Image height in pixels')] = None
126
+ type: Literal['image']
127
+ url: Annotated[AnyUrl, Field(description='Image URL')]
128
+ width: Annotated[int | None, Field(description='Image width in pixels')] = None
129
+
130
+
131
+ class Assets2(AdCPBaseModel):
132
+ access: Annotated[AssetAccess | None, Field(description='Authentication for secured URLs')] = (
133
+ None
134
+ )
135
+ duration_ms: Annotated[int | None, Field(description='Video duration in milliseconds')] = None
136
+ thumbnail_url: Annotated[AnyUrl | None, Field(description='Video thumbnail URL')] = None
137
+ transcript: Annotated[str | None, Field(description='Video transcript')] = None
138
+ transcript_source: Annotated[
139
+ TranscriptSource | None, Field(description='How the transcript was generated')
140
+ ] = None
141
+ type: Literal['video']
142
+ url: Annotated[AnyUrl, Field(description='Video URL')]
143
+
144
+
145
+ class Assets3(AdCPBaseModel):
146
+ access: Annotated[AssetAccess | None, Field(description='Authentication for secured URLs')] = (
147
+ None
148
+ )
149
+ duration_ms: Annotated[int | None, Field(description='Audio duration in milliseconds')] = None
150
+ transcript: Annotated[str | None, Field(description='Audio transcript')] = None
151
+ transcript_source: Annotated[
152
+ TranscriptSource1 | None, Field(description='How the transcript was generated')
153
+ ] = None
154
+ type: Literal['audio']
155
+ url: Annotated[AnyUrl, Field(description='Audio URL')]
156
+
157
+
158
+ class Artifact(AdCPBaseModel):
159
+ model_config = ConfigDict(
160
+ extra='allow',
161
+ )
162
+ artifact_id: Annotated[
163
+ str,
164
+ Field(
165
+ description="Identifier for this artifact within the property. The property owner defines the scheme (e.g., 'article_12345', 'episode_42_segment_3', 'post_abc123')."
166
+ ),
167
+ ]
168
+ assets: Annotated[
169
+ list[Assets | Assets1 | Assets2 | Assets3],
170
+ Field(
171
+ description='Artifact assets in document flow order - text blocks, images, video, audio'
172
+ ),
173
+ ]
174
+ format_id: Annotated[
175
+ format_id_1.FormatId | None,
176
+ Field(
177
+ description='Optional reference to a format definition. Uses the same format registry as creative formats.'
178
+ ),
179
+ ] = None
180
+ identifiers: Annotated[
181
+ Identifiers | None, Field(description='Platform-specific identifiers for this artifact')
182
+ ] = None
183
+ last_update_time: Annotated[
184
+ AwareDatetime | None,
185
+ Field(description='When the artifact was last modified (ISO 8601 format)'),
186
+ ] = None
187
+ metadata: Annotated[
188
+ Metadata | None, Field(description='Rich metadata extracted from the artifact')
189
+ ] = None
190
+ property_id: Annotated[
191
+ identifier.Identifier,
192
+ Field(description='Identifier for the property where this artifact appears'),
193
+ ]
194
+ published_time: Annotated[
195
+ AwareDatetime | None, Field(description='When the artifact was published (ISO 8601 format)')
196
+ ] = None
197
+ url: Annotated[
198
+ AnyUrl | None,
199
+ Field(
200
+ description='Optional URL for this artifact (web page, podcast feed, video page). Not all artifacts have URLs (e.g., Instagram content, podcast segments, TV scenes).'
201
+ ),
202
+ ] = None
203
+ variant_id: Annotated[
204
+ str | None,
205
+ Field(
206
+ description="Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique."
207
+ ),
208
+ ] = None
@@ -0,0 +1,64 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/artifact_webhook_payload.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, ConfigDict, Field
11
+
12
+ from ..core import ext as ext_1
13
+ from . import artifact as artifact_1
14
+
15
+
16
+ class Pagination(AdCPBaseModel):
17
+ batch_number: Annotated[int | None, Field(description='Current batch number (1-indexed)')] = (
18
+ None
19
+ )
20
+ total_artifacts: Annotated[
21
+ int | None, Field(description='Total artifacts in the delivery period')
22
+ ] = None
23
+ total_batches: Annotated[
24
+ int | None, Field(description='Total batches for this delivery period')
25
+ ] = None
26
+
27
+
28
+ class Artifact(AdCPBaseModel):
29
+ artifact: Annotated[artifact_1.Artifact, Field(description='The content artifact')]
30
+ delivered_at: Annotated[
31
+ AwareDatetime, Field(description='When the impression was delivered (ISO 8601)')
32
+ ]
33
+ impression_id: Annotated[
34
+ str | None,
35
+ Field(description='Optional impression identifier for correlation with delivery reports'),
36
+ ] = None
37
+ package_id: Annotated[
38
+ str | None, Field(description='Package within the media buy this artifact relates to')
39
+ ] = None
40
+
41
+
42
+ class ArtifactWebhookPayload(AdCPBaseModel):
43
+ model_config = ConfigDict(
44
+ extra='allow',
45
+ )
46
+ artifacts: Annotated[
47
+ list[Artifact], Field(description='Content artifacts from delivered impressions')
48
+ ]
49
+ batch_id: Annotated[
50
+ str,
51
+ Field(
52
+ description='Unique identifier for this batch of artifacts. Use for deduplication and acknowledgment.'
53
+ ),
54
+ ]
55
+ ext: ext_1.ExtensionObject | None = None
56
+ media_buy_id: Annotated[
57
+ str, Field(description='Media buy identifier these artifacts belong to')
58
+ ]
59
+ pagination: Annotated[
60
+ Pagination | None, Field(description='Pagination info when batching large artifact sets')
61
+ ] = None
62
+ timestamp: Annotated[
63
+ AwareDatetime, Field(description='When this batch was generated (ISO 8601)')
64
+ ]
@@ -0,0 +1,17 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/calibrate_content_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 . import artifact as artifact_1
13
+
14
+
15
+ class CalibrateContentRequest(AdCPBaseModel):
16
+ artifact: Annotated[artifact_1.Artifact, Field(description='Artifact to evaluate')]
17
+ standards_id: Annotated[str, Field(description='Standards configuration to calibrate against')]
@@ -0,0 +1,74 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: content_standards/calibrate_content_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 error
14
+
15
+
16
+ class Status(Enum):
17
+ passed = 'passed'
18
+ failed = 'failed'
19
+ warning = 'warning'
20
+ unevaluated = 'unevaluated'
21
+
22
+
23
+ class Feature(AdCPBaseModel):
24
+ explanation: Annotated[
25
+ str | None,
26
+ Field(description='Human-readable explanation of why this feature passed or failed'),
27
+ ] = None
28
+ feature_id: Annotated[
29
+ str,
30
+ Field(
31
+ description='Which feature was evaluated (e.g., brand_safety, brand_suitability, competitor_adjacency)'
32
+ ),
33
+ ]
34
+ status: Annotated[Status, Field(description='Evaluation status for this feature')]
35
+
36
+
37
+ class Verdict(Enum):
38
+ pass_ = 'pass'
39
+ fail = 'fail'
40
+
41
+
42
+ class CalibrateContentResponse1(AdCPBaseModel):
43
+ confidence: Annotated[
44
+ float | None, Field(description='Model confidence in the verdict (0-1)', ge=0.0, le=1.0)
45
+ ] = None
46
+ errors: Annotated[
47
+ Any | None, Field(description='Field must not be present in success response')
48
+ ] = None
49
+ explanation: Annotated[
50
+ str | None, Field(description='Detailed natural language explanation of the decision')
51
+ ] = None
52
+ features: Annotated[
53
+ list[Feature] | None, Field(description='Per-feature breakdown with explanations')
54
+ ] = None
55
+ verdict: Annotated[
56
+ Verdict, Field(description='Overall pass/fail verdict for the content evaluation')
57
+ ]
58
+
59
+
60
+ class CalibrateContentResponse2(AdCPBaseModel):
61
+ errors: list[error.Error]
62
+ verdict: Annotated[
63
+ Any | None, Field(description='Field must not be present in error response')
64
+ ] = None
65
+
66
+
67
+ class CalibrateContentResponse(RootModel[CalibrateContentResponse1 | CalibrateContentResponse2]):
68
+ root: Annotated[
69
+ CalibrateContentResponse1 | CalibrateContentResponse2,
70
+ Field(
71
+ description='Response payload with verdict and detailed explanations for collaborative calibration',
72
+ title='Calibrate Content Response',
73
+ ),
74
+ ]
@@ -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
+ ]