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,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
 
@@ -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
 
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/daast_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/html_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/image_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/javascript_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/text_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/url_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/vast_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/video_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/assets/webhook_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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/async_response_data.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,11 +1,11 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/brand_manifest.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
 
7
7
  from enum import Enum
8
- from typing import Annotated, Any
8
+ from typing import Annotated, Any, Literal
9
9
 
10
10
  from adcp.types.base import AdCPBaseModel
11
11
  from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field
@@ -47,6 +47,18 @@ class Asset(AdCPBaseModel):
47
47
  width: Annotated[int | None, Field(description='Image/video width in pixels')] = None
48
48
 
49
49
 
50
+ class Avatar(AdCPBaseModel):
51
+ avatar_id: Annotated[str | None, Field(description='Provider-specific avatar identifier')] = (
52
+ None
53
+ )
54
+ provider: Annotated[
55
+ str | None, Field(description="Avatar provider (e.g., 'd-id', 'heygen', 'synthesia')")
56
+ ] = None
57
+ settings: Annotated[
58
+ dict[str, Any] | None, Field(description='Provider-specific avatar settings')
59
+ ] = None
60
+
61
+
50
62
  class Colors(AdCPBaseModel):
51
63
  accent: Annotated[
52
64
  str | None, Field(description='Accent color (hex format)', pattern='^#[0-9A-Fa-f]{6}$')
@@ -115,9 +127,26 @@ class Metadata(AdCPBaseModel):
115
127
  version: Annotated[str | None, Field(description='Brand card version number')] = None
116
128
 
117
129
 
130
+ class AgenticCheckout(AdCPBaseModel):
131
+ endpoint: Annotated[
132
+ AnyUrl,
133
+ Field(
134
+ description='Base URL for checkout session API (e.g., https://merchant.com/api/checkout_sessions)'
135
+ ),
136
+ ]
137
+ spec: Annotated[
138
+ Literal['openai_agentic_checkout_v1'],
139
+ Field(description='Checkout API specification implemented by the endpoint'),
140
+ ]
141
+ supported_payment_providers: Annotated[
142
+ list[str] | None, Field(description='Payment providers supported by this checkout endpoint')
143
+ ] = None
144
+
145
+
118
146
  class FeedFormat(Enum):
119
147
  google_merchant_center = 'google_merchant_center'
120
148
  facebook_catalog = 'facebook_catalog'
149
+ openai_product_feed = 'openai_product_feed'
121
150
  custom = 'custom'
122
151
 
123
152
 
@@ -132,13 +161,22 @@ class ProductCatalog(AdCPBaseModel):
132
161
  model_config = ConfigDict(
133
162
  extra='allow',
134
163
  )
164
+ agentic_checkout: Annotated[
165
+ AgenticCheckout | None,
166
+ Field(
167
+ description='Agentic checkout endpoint configuration. Enables AI agents to complete purchases on behalf of users through a structured checkout API.'
168
+ ),
169
+ ] = None
135
170
  categories: Annotated[
136
171
  list[str] | None,
137
172
  Field(description='Product categories available in the catalog (for filtering)'),
138
173
  ] = None
139
- feed_format: Annotated[FeedFormat | None, Field(description='Format of the product feed')] = (
140
- FeedFormat.google_merchant_center
141
- )
174
+ feed_format: Annotated[
175
+ FeedFormat | None,
176
+ Field(
177
+ description="Format of the product feed. Use 'openai_product_feed' for feeds conforming to the OpenAI Commerce Product Feed specification."
178
+ ),
179
+ ] = FeedFormat.google_merchant_center
142
180
  feed_url: Annotated[AnyUrl, Field(description='URL to product catalog feed')]
143
181
  last_updated: Annotated[
144
182
  AwareDatetime | None, Field(description='When the product catalog was last updated')
@@ -148,6 +186,17 @@ class ProductCatalog(AdCPBaseModel):
148
186
  ] = None
149
187
 
150
188
 
189
+ class Voice(AdCPBaseModel):
190
+ provider: Annotated[
191
+ str | None, Field(description="TTS provider (e.g., 'elevenlabs', 'openai', 'amazon_polly')")
192
+ ] = None
193
+ settings: Annotated[
194
+ dict[str, Any] | None,
195
+ Field(description='Provider-specific voice settings (speed, pitch, etc.)'),
196
+ ] = None
197
+ voice_id: Annotated[str | None, Field(description='Provider-specific voice identifier')] = None
198
+
199
+
151
200
  class BrandManifest(AdCPBaseModel):
152
201
  model_config = ConfigDict(
153
202
  extra='allow',
@@ -158,6 +207,10 @@ class BrandManifest(AdCPBaseModel):
158
207
  description='Brand asset library with explicit assets and tags. Assets are referenced inline with URLs pointing to CDN-hosted files.'
159
208
  ),
160
209
  ] = None
210
+ avatar: Annotated[
211
+ Avatar | None,
212
+ Field(description='Brand avatar configuration for visual conversational experiences'),
213
+ ] = None
161
214
  colors: Annotated[Colors | None, Field(description='Brand color palette')] = None
162
215
  contact: Annotated[Contact | None, Field(description='Brand contact information')] = None
163
216
  disclaimers: Annotated[
@@ -177,6 +230,12 @@ class BrandManifest(AdCPBaseModel):
177
230
  ] = None
178
231
  metadata: Annotated[Metadata | None, Field(description='Additional brand metadata')] = None
179
232
  name: Annotated[str, Field(description='Brand or business name')]
233
+ privacy_policy_url: Annotated[
234
+ AnyUrl | None,
235
+ Field(
236
+ description="URL to the brand's privacy policy. Used for consumer consent flows when personal data may be shared with the advertiser. AI platforms can use this to present explicit privacy choices to users before data handoff."
237
+ ),
238
+ ] = None
180
239
  product_catalog: Annotated[
181
240
  ProductCatalog | None,
182
241
  Field(
@@ -199,3 +258,7 @@ class BrandManifest(AdCPBaseModel):
199
258
  description='Primary brand URL for context and asset discovery. Creative agents can infer brand information from this URL.'
200
259
  ),
201
260
  ] = None
261
+ voice: Annotated[
262
+ Voice | None,
263
+ Field(description='Brand voice configuration for audio/conversational experiences'),
264
+ ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/brand_manifest_ref.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/context.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_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
 
@@ -9,6 +9,7 @@ from typing import Annotated
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import ConfigDict, Field
11
11
 
12
+ from ..enums import creative_status
12
13
  from . import format_id as format_id_1
13
14
  from . import promoted_offerings
14
15
  from .assets import (
@@ -43,12 +44,6 @@ class CreativeAsset(AdCPBaseModel):
43
44
  model_config = ConfigDict(
44
45
  extra='allow',
45
46
  )
46
- approved: Annotated[
47
- bool | None,
48
- Field(
49
- description='For generative creatives: set to true to approve and finalize, false to request regeneration with updated assets/message. Omit for non-generative creatives.'
50
- ),
51
- ] = None
52
47
  assets: Annotated[
53
48
  dict[
54
49
  str,
@@ -87,6 +82,12 @@ class CreativeAsset(AdCPBaseModel):
87
82
  min_length=1,
88
83
  ),
89
84
  ] = None
85
+ status: Annotated[
86
+ creative_status.CreativeStatus | None,
87
+ Field(
88
+ description="For generative creatives: set to 'approved' to finalize, 'rejected' to request regeneration with updated assets/message. Omit for non-generative creatives (system will set based on processing state)."
89
+ ),
90
+ ] = None
90
91
  tags: Annotated[
91
92
  list[str] | None, Field(description='User-defined tags for organization and searchability')
92
93
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_assignment.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_filters.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
 
@@ -16,9 +16,6 @@ class CreativeFilters(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
17
  extra='allow',
18
18
  )
19
- assigned_to_package: Annotated[
20
- str | None, Field(description='Filter creatives assigned to this specific package')
21
- ] = None
22
19
  assigned_to_packages: Annotated[
23
20
  list[str] | None, Field(description='Filter creatives assigned to any of these packages')
24
21
  ] = None
@@ -39,12 +36,9 @@ class CreativeFilters(AdCPBaseModel):
39
36
  creative_ids: Annotated[
40
37
  list[str] | None, Field(description='Filter by specific creative IDs', max_length=100)
41
38
  ] = None
42
- format: Annotated[
43
- str | None,
44
- Field(description='Filter by creative format type (e.g., video, audio, display)'),
45
- ] = None
46
39
  formats: Annotated[
47
- list[str] | None, Field(description='Filter by multiple creative format types')
40
+ list[str] | None,
41
+ Field(description='Filter by creative format types (e.g., video, audio, display)'),
48
42
  ] = None
49
43
  has_performance_data: Annotated[
50
44
  bool | None, Field(description='Filter creatives that have performance data when true')
@@ -56,13 +50,9 @@ class CreativeFilters(AdCPBaseModel):
56
50
  str | None,
57
51
  Field(description='Filter by creative names containing this text (case-insensitive)'),
58
52
  ] = None
59
- status: Annotated[
60
- creative_status.CreativeStatus | None,
61
- Field(description='Filter by creative approval status'),
62
- ] = None
63
53
  statuses: Annotated[
64
54
  list[creative_status.CreativeStatus] | None,
65
- Field(description='Filter by multiple creative statuses'),
55
+ Field(description='Filter by creative approval statuses'),
66
56
  ] = None
67
57
  tags: Annotated[
68
58
  list[str] | None, Field(description='Filter by creative tags (all tags must match)')
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_manifest.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/creative_policy.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/delivery_metrics.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/deployment.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/destination.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/error.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/ext.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/format.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
 
@@ -66,7 +66,7 @@ class Asset(AdCPBaseModel):
66
66
  ] = None
67
67
 
68
68
 
69
- class Assets1(AdCPBaseModel):
69
+ class Assets5(AdCPBaseModel):
70
70
  asset_group_id: Annotated[
71
71
  str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
72
72
  ]
@@ -203,7 +203,8 @@ class Renders(AdCPBaseModel):
203
203
  ]
204
204
 
205
205
 
206
- Dimensions1 = Dimensions
206
+ class Dimensions1(Dimensions):
207
+ pass
207
208
 
208
209
 
209
210
  class Renders1(AdCPBaseModel):
@@ -269,7 +270,7 @@ class Format(AdCPBaseModel):
269
270
  ),
270
271
  ] = None
271
272
  assets: Annotated[
272
- list[Assets | Assets1] | None,
273
+ list[Assets | Assets5] | None,
273
274
  Field(
274
275
  description="Array of all assets supported for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Use the 'required' boolean on each asset to indicate whether it's mandatory. This field replaces the deprecated 'assets_required' and enables full asset discovery for buyers and AI agents."
275
276
  ),
@@ -278,7 +279,7 @@ class Format(AdCPBaseModel):
278
279
  list[AssetsRequired | AssetsRequired1] | None,
279
280
  Field(
280
281
  deprecated=True,
281
- description="DEPRECATED: Use 'assets' instead. Array of required assets or asset groups for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Can contain individual assets or repeatable asset sequences (e.g., carousel products, slideshow frames). This field is maintained for backward compatibility; new implementations should use 'assets' with the 'required' boolean on each asset."
282
+ description="DEPRECATED: Use 'assets' instead. Array of required assets or asset groups for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Can contain individual assets or repeatable asset sequences (e.g., carousel products, slideshow frames). This field is maintained for backward compatibility; new implementations should use 'assets' with the 'required' boolean on each asset.",
282
283
  ),
283
284
  ] = None
284
285
  delivery: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/format_id.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
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/frequency_cap.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