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,353 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: protocol/get_adcp_capabilities_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
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import AnyUrl, AwareDatetime, ConfigDict, 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 ..core import media_buy_features
17
+ from ..enums import channels
18
+ from ..sponsored_intelligence import si_capabilities
19
+
20
+
21
+ class MajorVersion(RootModel[int]):
22
+ root: Annotated[int, Field(ge=1)]
23
+
24
+
25
+ class Adcp(AdCPBaseModel):
26
+ major_versions: Annotated[
27
+ list[MajorVersion],
28
+ Field(
29
+ description='AdCP major versions supported by this seller. Major versions indicate breaking changes.',
30
+ min_length=1,
31
+ ),
32
+ ]
33
+
34
+
35
+ class ExtensionsSupportedItem(RootModel[str]):
36
+ root: Annotated[
37
+ str,
38
+ Field(
39
+ description="Extension namespace (lowercase alphanumeric with underscores, e.g., 'scope3', 'garm', 'iab_tcf')",
40
+ pattern='^[a-z][a-z0-9_]*$',
41
+ ),
42
+ ]
43
+
44
+
45
+ class Range(AdCPBaseModel):
46
+ max: Annotated[float, Field(description='Maximum value')]
47
+ min: Annotated[float, Field(description='Minimum value')]
48
+
49
+
50
+ class Type(Enum):
51
+ binary = 'binary'
52
+ quantitative = 'quantitative'
53
+ categorical = 'categorical'
54
+
55
+
56
+ class PropertyFeature(AdCPBaseModel):
57
+ categories: Annotated[
58
+ list[str] | None, Field(description='For categorical features, the valid values')
59
+ ] = None
60
+ description: Annotated[
61
+ str | None, Field(description='Human-readable description of what this feature measures')
62
+ ] = None
63
+ feature_id: Annotated[
64
+ str,
65
+ Field(
66
+ description="Unique identifier for this feature (e.g., 'consent_quality', 'coppa_certified', 'carbon_score')"
67
+ ),
68
+ ]
69
+ methodology_url: Annotated[
70
+ AnyUrl | None,
71
+ Field(
72
+ description='URL to documentation explaining how this feature is calculated or measured. Helps buyers understand and compare methodologies across vendors.'
73
+ ),
74
+ ] = None
75
+ range: Annotated[
76
+ Range | None, Field(description='For quantitative features, the valid range')
77
+ ] = None
78
+ type: Annotated[
79
+ Type,
80
+ Field(
81
+ description="Data type: 'binary' for yes/no, 'quantitative' for numeric scores, 'categorical' for enum values"
82
+ ),
83
+ ]
84
+
85
+
86
+ class Governance(AdCPBaseModel):
87
+ property_features: Annotated[
88
+ list[PropertyFeature] | None,
89
+ Field(
90
+ description='Property features this governance agent can evaluate. Each feature describes a score, rating, or certification the agent can provide for properties.'
91
+ ),
92
+ ] = None
93
+
94
+
95
+ class MraidVersion(RootModel[str]):
96
+ root: Annotated[str, Field(pattern='^[0-9]+\\.[0-9]+$')]
97
+
98
+
99
+ class VastVersion(MraidVersion):
100
+ pass
101
+
102
+
103
+ class CreativeSpecs(AdCPBaseModel):
104
+ mraid_versions: Annotated[
105
+ list[MraidVersion] | None,
106
+ Field(description='MRAID versions supported for rich media mobile creatives'),
107
+ ] = None
108
+ simid: Annotated[bool | None, Field(description='SIMID support for interactive video ads')] = (
109
+ None
110
+ )
111
+ vast_versions: Annotated[
112
+ list[VastVersion] | None, Field(description='VAST versions supported for video creatives')
113
+ ] = None
114
+ vpaid: Annotated[bool | None, Field(description='VPAID support for interactive video ads')] = (
115
+ None
116
+ )
117
+
118
+
119
+ class GeoMetros(AdCPBaseModel):
120
+ eurostat_nuts2: Annotated[
121
+ bool | None, Field(description='Supports Eurostat NUTS Level 2 regions (EU)')
122
+ ] = None
123
+ nielsen_dma: Annotated[
124
+ bool | None,
125
+ Field(description="Supports Nielsen DMA codes (US market, e.g., '501' for NYC)"),
126
+ ] = None
127
+ uk_itl1: Annotated[bool | None, Field(description='Supports UK ITL Level 1 regions')] = None
128
+ uk_itl2: Annotated[bool | None, Field(description='Supports UK ITL Level 2 regions')] = None
129
+
130
+
131
+ class GeoPostalAreas(AdCPBaseModel):
132
+ au_postcode: Annotated[
133
+ bool | None, Field(description="Australian postcode, 4 digits (e.g., '2000')")
134
+ ] = None
135
+ ca_fsa: Annotated[
136
+ bool | None, Field(description="Canadian Forward Sortation Area (e.g., 'K1A')")
137
+ ] = None
138
+ ca_full: Annotated[
139
+ bool | None, Field(description="Canadian full postal code (e.g., 'K1A 0B1')")
140
+ ] = None
141
+ de_plz: Annotated[
142
+ bool | None, Field(description="German Postleitzahl, 5 digits (e.g., '10115')")
143
+ ] = None
144
+ fr_code_postal: Annotated[
145
+ bool | None, Field(description="French code postal, 5 digits (e.g., '75001')")
146
+ ] = None
147
+ gb_full: Annotated[bool | None, Field(description="UK full postcode (e.g., 'SW1A 1AA')")] = None
148
+ gb_outward: Annotated[
149
+ bool | None, Field(description="UK postcode district / outward code (e.g., 'SW1', 'EC1')")
150
+ ] = None
151
+ us_zip: Annotated[bool | None, Field(description="US 5-digit ZIP codes (e.g., '10001')")] = None
152
+ us_zip_plus_four: Annotated[
153
+ bool | None, Field(description="US 9-digit ZIP+4 codes (e.g., '10001-1234')")
154
+ ] = None
155
+
156
+
157
+ class Targeting(AdCPBaseModel):
158
+ geo_countries: Annotated[
159
+ bool | None,
160
+ Field(
161
+ description="Supports country-level geo targeting using ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')"
162
+ ),
163
+ ] = None
164
+ geo_metros: Annotated[
165
+ GeoMetros | None,
166
+ Field(
167
+ description='Metro area targeting support. Specifies which classification systems are supported.'
168
+ ),
169
+ ] = None
170
+ geo_postal_areas: Annotated[
171
+ GeoPostalAreas | None,
172
+ Field(
173
+ description='Postal area targeting support. Specifies which postal code systems are supported. System names encode country and precision.'
174
+ ),
175
+ ] = None
176
+ geo_regions: Annotated[
177
+ bool | None,
178
+ Field(
179
+ description="Supports region/state-level geo targeting using ISO 3166-2 subdivision codes (e.g., 'US-NY', 'GB-SCT', 'DE-BY')"
180
+ ),
181
+ ] = None
182
+
183
+
184
+ class Execution(AdCPBaseModel):
185
+ axe_integrations: Annotated[
186
+ list[AnyUrl] | None,
187
+ Field(
188
+ description='Agentic ad exchange (AXE) integrations supported. URLs are canonical identifiers for exchanges this seller can execute through.'
189
+ ),
190
+ ] = None
191
+ creative_specs: Annotated[
192
+ CreativeSpecs | None, Field(description='Creative specification support')
193
+ ] = None
194
+ targeting: Annotated[
195
+ Targeting | None,
196
+ Field(
197
+ description='Targeting capabilities. If declared true/supported, buyer can use these targeting parameters and seller MUST honor them.'
198
+ ),
199
+ ] = None
200
+
201
+
202
+ class PrimaryCountry(RootModel[str]):
203
+ root: Annotated[str, Field(pattern='^[A-Z]{2}$')]
204
+
205
+
206
+ class PublisherDomain(RootModel[str]):
207
+ root: Annotated[
208
+ str, Field(pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$')
209
+ ]
210
+
211
+
212
+ class Portfolio(AdCPBaseModel):
213
+ advertising_policies: Annotated[
214
+ str | None,
215
+ Field(
216
+ description='Advertising content policies, restrictions, and guidelines',
217
+ max_length=10000,
218
+ ),
219
+ ] = None
220
+ description: Annotated[
221
+ str | None,
222
+ Field(
223
+ description='Markdown-formatted description of the inventory portfolio', max_length=5000
224
+ ),
225
+ ] = None
226
+ primary_channels: Annotated[
227
+ list[channels.MediaChannel] | None,
228
+ Field(description='Primary advertising channels in this portfolio'),
229
+ ] = None
230
+ primary_countries: Annotated[
231
+ list[PrimaryCountry] | None,
232
+ Field(description='Primary countries (ISO 3166-1 alpha-2) where inventory is concentrated'),
233
+ ] = None
234
+ publisher_domains: Annotated[
235
+ list[PublisherDomain],
236
+ Field(
237
+ description="Publisher domains this seller is authorized to represent. Buyers should fetch each publisher's adagents.json for property definitions.",
238
+ min_length=1,
239
+ ),
240
+ ]
241
+
242
+
243
+ class Signals(AdCPBaseModel):
244
+ features: Annotated[
245
+ dict[str, bool] | None, Field(description='Optional signals features supported')
246
+ ] = None
247
+
248
+
249
+ class Preferred(Enum):
250
+ mcp = 'mcp'
251
+ a2a = 'a2a'
252
+
253
+
254
+ class Transport(AdCPBaseModel):
255
+ model_config = ConfigDict(
256
+ extra='allow',
257
+ )
258
+ type: Annotated[Preferred, Field(description='Protocol transport type')]
259
+ url: Annotated[AnyUrl, Field(description='Agent endpoint URL for this transport')]
260
+
261
+
262
+ class Endpoint(AdCPBaseModel):
263
+ preferred: Annotated[
264
+ Preferred | None, Field(description='Preferred transport when host supports multiple')
265
+ ] = None
266
+ transports: Annotated[
267
+ list[Transport],
268
+ Field(
269
+ description='Available protocol transports. Hosts select based on their capabilities.',
270
+ min_length=1,
271
+ ),
272
+ ]
273
+
274
+
275
+ class SupportedProtocol(Enum):
276
+ media_buy = 'media_buy'
277
+ signals = 'signals'
278
+ governance = 'governance'
279
+ sponsored_intelligence = 'sponsored_intelligence'
280
+
281
+
282
+ class MediaBuy(AdCPBaseModel):
283
+ execution: Annotated[
284
+ Execution | None, Field(description='Technical execution capabilities for media buying')
285
+ ] = None
286
+ features: media_buy_features.MediaBuyFeatures | None = None
287
+ portfolio: Annotated[
288
+ Portfolio | None,
289
+ Field(description="Information about the seller's media inventory portfolio"),
290
+ ] = None
291
+
292
+
293
+ class SponsoredIntelligence(AdCPBaseModel):
294
+ brand_manifest_url: Annotated[
295
+ AnyUrl | None, Field(description='URL to brand manifest with colors, fonts, logos, tone')
296
+ ] = None
297
+ capabilities: Annotated[
298
+ si_capabilities.SiCapabilities,
299
+ Field(description='Modalities, components, and commerce capabilities'),
300
+ ]
301
+ endpoint: Annotated[Endpoint, Field(description='SI agent endpoint configuration')]
302
+
303
+
304
+ class GetAdcpCapabilitiesResponse(AdCPBaseModel):
305
+ model_config = ConfigDict(
306
+ extra='allow',
307
+ )
308
+ adcp: Annotated[Adcp, Field(description='Core AdCP protocol information')]
309
+ context: context_1.ContextObject | None = None
310
+ errors: Annotated[
311
+ list[error.Error] | None, Field(description='Task-specific errors and warnings')
312
+ ] = None
313
+ ext: ext_1.ExtensionObject | None = None
314
+ extensions_supported: Annotated[
315
+ list[ExtensionsSupportedItem] | None,
316
+ Field(
317
+ description='Extension namespaces this agent supports. Buyers can expect meaningful data in ext.{namespace} fields on responses from this agent. Extension schemas are published in the AdCP extension registry.'
318
+ ),
319
+ ] = None
320
+ governance: Annotated[
321
+ Governance | None,
322
+ Field(
323
+ description='Governance protocol capabilities. Only present if governance is in supported_protocols. Governance agents provide property data like compliance scores, brand safety ratings, and sustainability metrics.'
324
+ ),
325
+ ] = None
326
+ last_updated: Annotated[
327
+ AwareDatetime | None,
328
+ Field(
329
+ description='ISO 8601 timestamp of when capabilities were last updated. Buyers can use this for cache invalidation.'
330
+ ),
331
+ ] = None
332
+ media_buy: Annotated[
333
+ MediaBuy | None,
334
+ Field(
335
+ description='Media-buy protocol capabilities. Only present if media_buy is in supported_protocols.'
336
+ ),
337
+ ] = None
338
+ signals: Annotated[
339
+ Signals | None,
340
+ Field(
341
+ description='Signals protocol capabilities. Only present if signals is in supported_protocols. Reserved for future use.'
342
+ ),
343
+ ] = None
344
+ sponsored_intelligence: Annotated[
345
+ SponsoredIntelligence | None,
346
+ Field(
347
+ description='Sponsored Intelligence protocol capabilities. Only present if sponsored_intelligence is in supported_protocols. SI agents handle conversational brand experiences.'
348
+ ),
349
+ ] = None
350
+ supported_protocols: Annotated[
351
+ list[SupportedProtocol],
352
+ Field(description='Which AdCP domain protocols this seller supports', min_length=1),
353
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: protocols/adcp_extension.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
 
@@ -8,7 +8,11 @@ from enum import Enum
8
8
  from typing import Annotated
9
9
 
10
10
  from adcp.types.base import AdCPBaseModel
11
- from pydantic import ConfigDict, Field
11
+ from pydantic import ConfigDict, Field, RootModel
12
+
13
+
14
+ class ExtensionsSupportedItem(RootModel[str]):
15
+ root: Annotated[str, Field(pattern='^[a-z][a-z0-9_]*$')]
12
16
 
13
17
 
14
18
  class ProtocolsSupportedEnum(Enum):
@@ -17,21 +21,30 @@ class ProtocolsSupportedEnum(Enum):
17
21
  signals = 'signals'
18
22
 
19
23
 
20
- class AdcpAgentCardExtension(AdCPBaseModel):
24
+ class AdcpAgentCardExtensionParamsDeprecated(AdCPBaseModel):
21
25
  model_config = ConfigDict(
22
26
  extra='allow',
23
27
  )
24
28
  adcp_version: Annotated[
25
29
  str,
26
30
  Field(
27
- description="Semantic version of the AdCP specification this agent implements (e.g., '2.4.0')",
31
+ deprecated=True,
32
+ description='DEPRECATED: Use get_adcp_capabilities response adcp.major_versions instead.',
28
33
  pattern='^\\d+\\.\\d+\\.\\d+$',
29
34
  ),
30
35
  ]
36
+ extensions_supported: Annotated[
37
+ list[ExtensionsSupportedItem] | None,
38
+ Field(
39
+ deprecated=True,
40
+ description='DEPRECATED: Typed extensions can be declared in get_adcp_capabilities ext field.',
41
+ ),
42
+ ] = None
31
43
  protocols_supported: Annotated[
32
44
  list[ProtocolsSupportedEnum],
33
45
  Field(
34
- description='AdCP protocol domains supported by this agent. At least one must be specified.',
46
+ deprecated=True,
47
+ description='DEPRECATED: Use get_adcp_capabilities response supported_protocols instead.',
35
48
  min_length=1,
36
49
  ),
37
50
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: signals/activate_signal_request.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: signals/activate_signal_response.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: signals/get_signals_request.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: signals/get_signals_response.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
 
@@ -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,102 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_capabilities.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 ConfigDict, Field
12
+
13
+
14
+ class Commerce(AdCPBaseModel):
15
+ model_config = ConfigDict(
16
+ extra='allow',
17
+ )
18
+ acp_checkout: Annotated[
19
+ bool | None, Field(description='Supports ACP (Agentic Commerce Protocol) checkout handoff')
20
+ ] = None
21
+
22
+
23
+ class StandardEnum(Enum):
24
+ text = 'text'
25
+ link = 'link'
26
+ image = 'image'
27
+ product_card = 'product_card'
28
+ carousel = 'carousel'
29
+ action_button = 'action_button'
30
+
31
+
32
+ class Components(AdCPBaseModel):
33
+ model_config = ConfigDict(
34
+ extra='allow',
35
+ )
36
+ extensions: Annotated[
37
+ dict[str, Any] | None,
38
+ Field(description='Platform-specific extensions (chatgpt_apps_sdk, maps, forms, etc.)'),
39
+ ] = None
40
+ standard: Annotated[
41
+ list[StandardEnum] | None,
42
+ Field(description='Standard components that all SI hosts must render'),
43
+ ] = None
44
+
45
+
46
+ class Avatar(AdCPBaseModel):
47
+ model_config = ConfigDict(
48
+ extra='allow',
49
+ )
50
+ avatar_id: Annotated[str | None, Field(description='Brand avatar identifier')] = None
51
+ provider: Annotated[
52
+ str | None, Field(description='Avatar provider (d-id, heygen, synthesia, etc.)')
53
+ ] = None
54
+
55
+
56
+ class Video(AdCPBaseModel):
57
+ model_config = ConfigDict(
58
+ extra='allow',
59
+ )
60
+ formats: Annotated[
61
+ list[str] | None, Field(description='Supported video formats (mp4, webm, etc.)')
62
+ ] = None
63
+ max_duration_seconds: Annotated[int | None, Field(description='Maximum video duration')] = None
64
+
65
+
66
+ class Voice(AdCPBaseModel):
67
+ model_config = ConfigDict(
68
+ extra='allow',
69
+ )
70
+ provider: Annotated[
71
+ str | None, Field(description='TTS provider (elevenlabs, openai, etc.)')
72
+ ] = None
73
+ voice_id: Annotated[str | None, Field(description='Brand voice identifier')] = None
74
+
75
+
76
+ class Modalities(AdCPBaseModel):
77
+ model_config = ConfigDict(
78
+ extra='allow',
79
+ )
80
+ avatar: Annotated[
81
+ bool | Avatar | None, Field(description='Animated video presence with brand avatar')
82
+ ] = None
83
+ conversational: Annotated[
84
+ bool | None, Field(description='Pure text exchange - the baseline modality')
85
+ ] = True
86
+ video: Annotated[bool | Video | None, Field(description='Brand video content playback')] = None
87
+ voice: Annotated[
88
+ bool | Voice | None, Field(description='Audio-based interaction using brand voice')
89
+ ] = None
90
+
91
+
92
+ class SiCapabilities(AdCPBaseModel):
93
+ model_config = ConfigDict(
94
+ extra='allow',
95
+ )
96
+ commerce: Annotated[Commerce | None, Field(description='Commerce capabilities')] = None
97
+ components: Annotated[Components | None, Field(description='Visual components supported')] = (
98
+ None
99
+ )
100
+ modalities: Annotated[
101
+ Modalities | None, Field(description='Interaction modalities supported')
102
+ ] = None
@@ -0,0 +1,34 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_get_offering_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 ext as ext_1
13
+
14
+
15
+ class SiGetOfferingRequest(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='allow',
18
+ )
19
+ context: Annotated[
20
+ str | None,
21
+ Field(
22
+ description="Optional natural language context about user intent for personalized results (e.g., 'mens size 14 near Cincinnati'). Must be anonymous - no PII."
23
+ ),
24
+ ] = None
25
+ ext: ext_1.ExtensionObject | None = None
26
+ include_products: Annotated[
27
+ bool | None, Field(description='Whether to include matching products in the response')
28
+ ] = False
29
+ offering_id: Annotated[
30
+ str, Field(description='Offering identifier from promoted offerings to get details for')
31
+ ]
32
+ product_limit: Annotated[
33
+ int | None, Field(description='Maximum number of matching products to return', ge=1, le=50)
34
+ ] = 5
@@ -0,0 +1,100 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_get_offering_response.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 AnyUrl, AwareDatetime, ConfigDict, Field
11
+
12
+ from ..core import error
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class MatchingProduct(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='allow',
19
+ )
20
+ availability_summary: Annotated[
21
+ str | None,
22
+ Field(
23
+ description="Brief availability info (e.g., 'In stock', 'Size 14 available', '3 left')"
24
+ ),
25
+ ] = None
26
+ image_url: Annotated[AnyUrl | None, Field(description='Product image')] = None
27
+ name: Annotated[str, Field(description='Product name')]
28
+ original_price: Annotated[str | None, Field(description='Original price if on sale')] = None
29
+ price: Annotated[str | None, Field(description="Display price (e.g., '$129', '$89.99')")] = None
30
+ product_id: Annotated[str, Field(description='Product identifier')]
31
+ url: Annotated[AnyUrl | None, Field(description='Product detail page URL')] = None
32
+
33
+
34
+ class Offering(AdCPBaseModel):
35
+ model_config = ConfigDict(
36
+ extra='allow',
37
+ )
38
+ expires_at: Annotated[AwareDatetime | None, Field(description='When this offering expires')] = (
39
+ None
40
+ )
41
+ image_url: Annotated[AnyUrl | None, Field(description='Hero image for the offering')] = None
42
+ landing_url: Annotated[AnyUrl | None, Field(description='Landing page URL')] = None
43
+ offering_id: Annotated[str | None, Field(description='Offering identifier')] = None
44
+ price_hint: Annotated[
45
+ str | None, Field(description="Price indication (e.g., 'from $199', '50% off')")
46
+ ] = None
47
+ summary: Annotated[str | None, Field(description='Brief summary of the offering')] = None
48
+ tagline: Annotated[str | None, Field(description='Short promotional tagline')] = None
49
+ title: Annotated[str | None, Field(description='Offering title')] = None
50
+
51
+
52
+ class SiGetOfferingResponse(AdCPBaseModel):
53
+ model_config = ConfigDict(
54
+ extra='allow',
55
+ )
56
+ alternative_offering_ids: Annotated[
57
+ list[str] | None,
58
+ Field(description='Alternative offerings to consider if this one is unavailable'),
59
+ ] = None
60
+ available: Annotated[bool, Field(description='Whether the offering is currently available')]
61
+ checked_at: Annotated[
62
+ AwareDatetime | None, Field(description='When this offering information was retrieved')
63
+ ] = None
64
+ errors: Annotated[
65
+ list[error.Error] | None, Field(description='Errors during offering lookup')
66
+ ] = None
67
+ ext: ext_1.ExtensionObject | None = None
68
+ matching_products: Annotated[
69
+ list[MatchingProduct] | None,
70
+ Field(
71
+ description='Products matching the request context. Only included if include_products was true.'
72
+ ),
73
+ ] = None
74
+ offering: Annotated[Offering | None, Field(description='Offering details')] = None
75
+ offering_token: Annotated[
76
+ str | None,
77
+ Field(
78
+ description="Token to pass to si_initiate_session for session continuity. Brand stores the full query context server-side (products shown, order, context) so they can resolve references like 'the second one' when the session starts."
79
+ ),
80
+ ] = None
81
+ total_matching: Annotated[
82
+ int | None,
83
+ Field(
84
+ description='Total number of products matching the context (may be more than returned in matching_products)',
85
+ ge=0,
86
+ ),
87
+ ] = None
88
+ ttl_seconds: Annotated[
89
+ int | None,
90
+ Field(
91
+ description='How long this offering information is valid (seconds). Host should re-fetch after TTL expires.',
92
+ ge=0,
93
+ ),
94
+ ] = None
95
+ unavailable_reason: Annotated[
96
+ str | None,
97
+ Field(
98
+ description="If not available, why (e.g., 'expired', 'sold_out', 'region_restricted')"
99
+ ),
100
+ ] = None