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
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: adagents.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-26T13:22:19+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,39 +14,39 @@ from .core import property, property_id, property_tag, publisher_property_select
14
14
 
15
15
  class AuthorizedSalesAgents1(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra="allow",
17
+ extra='allow',
18
18
  )
19
19
  field_schema: Annotated[
20
20
  str | None,
21
- Field(alias="$schema", description="JSON Schema identifier for this adagents.json file"),
21
+ Field(alias='$schema', description='JSON Schema identifier for this adagents.json file'),
22
22
  ] = None
23
23
  authoritative_location: Annotated[
24
24
  AnyUrl,
25
25
  Field(
26
- description="HTTPS URL of the authoritative adagents.json file. When present, this file is a reference and the authoritative location contains the actual agent authorization data."
26
+ description='HTTPS URL of the authoritative adagents.json file. When present, this file is a reference and the authoritative location contains the actual agent authorization data.'
27
27
  ),
28
28
  ]
29
29
  last_updated: Annotated[
30
30
  AwareDatetime | None,
31
- Field(description="ISO 8601 timestamp indicating when this reference was last updated"),
31
+ Field(description='ISO 8601 timestamp indicating when this reference was last updated'),
32
32
  ] = None
33
33
 
34
34
 
35
35
  class Contact(AdCPBaseModel):
36
36
  model_config = ConfigDict(
37
- extra="allow",
37
+ extra='allow',
38
38
  )
39
39
  domain: Annotated[
40
40
  str | None,
41
41
  Field(
42
- description="Primary domain of the entity managing this file",
43
- pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
42
+ description='Primary domain of the entity managing this file',
43
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
44
44
  ),
45
45
  ] = None
46
46
  email: Annotated[
47
47
  EmailStr | None,
48
48
  Field(
49
- description="Contact email for questions or issues with this authorization file",
49
+ description='Contact email for questions or issues with this authorization file',
50
50
  max_length=255,
51
51
  min_length=1,
52
52
  ),
@@ -59,10 +59,16 @@ class Contact(AdCPBaseModel):
59
59
  min_length=1,
60
60
  ),
61
61
  ]
62
+ privacy_policy_url: Annotated[
63
+ AnyUrl | None,
64
+ Field(
65
+ description="URL to the entity's privacy policy. Used for consumer consent flows when interacting with this sales agent."
66
+ ),
67
+ ] = None
62
68
  seller_id: Annotated[
63
69
  str | None,
64
70
  Field(
65
- description="Seller ID from IAB Tech Lab sellers.json (if applicable)",
71
+ description='Seller ID from IAB Tech Lab sellers.json (if applicable)',
66
72
  max_length=255,
67
73
  min_length=1,
68
74
  ),
@@ -70,7 +76,7 @@ class Contact(AdCPBaseModel):
70
76
  tag_id: Annotated[
71
77
  str | None,
72
78
  Field(
73
- description="TAG Certified Against Fraud ID for verification (if applicable)",
79
+ description='TAG Certified Against Fraud ID for verification (if applicable)',
74
80
  max_length=100,
75
81
  min_length=1,
76
82
  ),
@@ -79,7 +85,7 @@ class Contact(AdCPBaseModel):
79
85
 
80
86
  class PropertyFeature(AdCPBaseModel):
81
87
  model_config = ConfigDict(
82
- extra="allow",
88
+ extra='allow',
83
89
  )
84
90
  features: Annotated[
85
91
  list[str],
@@ -95,7 +101,7 @@ class PropertyFeature(AdCPBaseModel):
95
101
  ),
96
102
  ]
97
103
  publisher_id: Annotated[
98
- str | None, Field(description="Optional publisher identifier at this agent (for lookup)")
104
+ str | None, Field(description='Optional publisher identifier at this agent (for lookup)')
99
105
  ] = None
100
106
  url: Annotated[
101
107
  AnyUrl,
@@ -105,24 +111,24 @@ class PropertyFeature(AdCPBaseModel):
105
111
 
106
112
  class Tags(AdCPBaseModel):
107
113
  model_config = ConfigDict(
108
- extra="allow",
114
+ extra='allow',
109
115
  )
110
- description: Annotated[str, Field(description="Description of what this tag represents")]
111
- name: Annotated[str, Field(description="Human-readable name for this tag")]
116
+ description: Annotated[str, Field(description='Description of what this tag represents')]
117
+ name: Annotated[str, Field(description='Human-readable name for this tag')]
112
118
 
113
119
 
114
120
  class AuthorizedAgents(AdCPBaseModel):
115
121
  model_config = ConfigDict(
116
- extra="allow",
122
+ extra='allow',
117
123
  )
118
124
  authorization_type: Annotated[
119
- Literal["property_ids"],
120
- Field(description="Discriminator indicating authorization by specific property IDs"),
125
+ Literal['property_ids'],
126
+ Field(description='Discriminator indicating authorization by specific property IDs'),
121
127
  ]
122
128
  authorized_for: Annotated[
123
129
  str,
124
130
  Field(
125
- description="Human-readable description of what this agent is authorized to sell",
131
+ description='Human-readable description of what this agent is authorized to sell',
126
132
  max_length=500,
127
133
  min_length=1,
128
134
  ),
@@ -130,7 +136,7 @@ class AuthorizedAgents(AdCPBaseModel):
130
136
  property_ids: Annotated[
131
137
  list[property_id.PropertyId],
132
138
  Field(
133
- description="Property IDs this agent is authorized for. Resolved against the top-level properties array in this file",
139
+ description='Property IDs this agent is authorized for. Resolved against the top-level properties array in this file',
134
140
  min_length=1,
135
141
  ),
136
142
  ]
@@ -139,16 +145,16 @@ class AuthorizedAgents(AdCPBaseModel):
139
145
 
140
146
  class AuthorizedAgents1(AdCPBaseModel):
141
147
  model_config = ConfigDict(
142
- extra="allow",
148
+ extra='allow',
143
149
  )
144
150
  authorization_type: Annotated[
145
- Literal["property_tags"],
146
- Field(description="Discriminator indicating authorization by property tags"),
151
+ Literal['property_tags'],
152
+ Field(description='Discriminator indicating authorization by property tags'),
147
153
  ]
148
154
  authorized_for: Annotated[
149
155
  str,
150
156
  Field(
151
- description="Human-readable description of what this agent is authorized to sell",
157
+ description='Human-readable description of what this agent is authorized to sell',
152
158
  max_length=500,
153
159
  min_length=1,
154
160
  ),
@@ -156,7 +162,7 @@ class AuthorizedAgents1(AdCPBaseModel):
156
162
  property_tags: Annotated[
157
163
  list[property_tag.PropertyTag],
158
164
  Field(
159
- description="Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching",
165
+ description='Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching',
160
166
  min_length=1,
161
167
  ),
162
168
  ]
@@ -165,18 +171,18 @@ class AuthorizedAgents1(AdCPBaseModel):
165
171
 
166
172
  class AuthorizedAgents3(AdCPBaseModel):
167
173
  model_config = ConfigDict(
168
- extra="allow",
174
+ extra='allow',
169
175
  )
170
176
  authorization_type: Annotated[
171
- Literal["publisher_properties"],
177
+ Literal['publisher_properties'],
172
178
  Field(
173
- description="Discriminator indicating authorization for properties from other publisher domains"
179
+ description='Discriminator indicating authorization for properties from other publisher domains'
174
180
  ),
175
181
  ]
176
182
  authorized_for: Annotated[
177
183
  str,
178
184
  Field(
179
- description="Human-readable description of what this agent is authorized to sell",
185
+ description='Human-readable description of what this agent is authorized to sell',
180
186
  max_length=500,
181
187
  min_length=1,
182
188
  ),
@@ -184,7 +190,7 @@ class AuthorizedAgents3(AdCPBaseModel):
184
190
  publisher_properties: Annotated[
185
191
  list[publisher_property_selector.PublisherPropertySelector],
186
192
  Field(
187
- description="Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell",
193
+ description='Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell',
188
194
  min_length=1,
189
195
  ),
190
196
  ]
@@ -193,16 +199,16 @@ class AuthorizedAgents3(AdCPBaseModel):
193
199
 
194
200
  class AuthorizedAgents2(AdCPBaseModel):
195
201
  model_config = ConfigDict(
196
- extra="allow",
202
+ extra='allow',
197
203
  )
198
204
  authorization_type: Annotated[
199
- Literal["inline_properties"],
200
- Field(description="Discriminator indicating authorization by inline property definitions"),
205
+ Literal['inline_properties'],
206
+ Field(description='Discriminator indicating authorization by inline property definitions'),
201
207
  ]
202
208
  authorized_for: Annotated[
203
209
  str,
204
210
  Field(
205
- description="Human-readable description of what this agent is authorized to sell",
211
+ description='Human-readable description of what this agent is authorized to sell',
206
212
  max_length=500,
207
213
  min_length=1,
208
214
  ),
@@ -210,7 +216,7 @@ class AuthorizedAgents2(AdCPBaseModel):
210
216
  properties: Annotated[
211
217
  list[property.Property],
212
218
  Field(
213
- description="Specific properties this agent is authorized for (alternative to property_ids/property_tags)",
219
+ description='Specific properties this agent is authorized for (alternative to property_ids/property_tags)',
214
220
  min_length=1,
215
221
  ),
216
222
  ]
@@ -219,33 +225,33 @@ class AuthorizedAgents2(AdCPBaseModel):
219
225
 
220
226
  class AuthorizedSalesAgents2(AdCPBaseModel):
221
227
  model_config = ConfigDict(
222
- extra="allow",
228
+ extra='allow',
223
229
  )
224
230
  field_schema: Annotated[
225
231
  str | None,
226
- Field(alias="$schema", description="JSON Schema identifier for this adagents.json file"),
232
+ Field(alias='$schema', description='JSON Schema identifier for this adagents.json file'),
227
233
  ] = None
228
234
  authorized_agents: Annotated[
229
235
  list[AuthorizedAgents | AuthorizedAgents1 | AuthorizedAgents2 | AuthorizedAgents3],
230
236
  Field(
231
- description="Array of sales agents authorized to sell inventory for properties in this file",
237
+ description='Array of sales agents authorized to sell inventory for properties in this file',
232
238
  min_length=1,
233
239
  ),
234
240
  ]
235
241
  contact: Annotated[
236
242
  Contact | None,
237
243
  Field(
238
- description="Contact information for the entity managing this adagents.json file (may be publisher or third-party operator)"
244
+ description='Contact information for the entity managing this adagents.json file (may be publisher or third-party operator)'
239
245
  ),
240
246
  ] = None
241
247
  last_updated: Annotated[
242
248
  AwareDatetime | None,
243
- Field(description="ISO 8601 timestamp indicating when this file was last updated"),
249
+ Field(description='ISO 8601 timestamp indicating when this file was last updated'),
244
250
  ] = None
245
251
  properties: Annotated[
246
252
  list[property.Property] | None,
247
253
  Field(
248
- description="Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.",
254
+ description='Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.',
249
255
  min_length=1,
250
256
  ),
251
257
  ] = None
@@ -258,7 +264,7 @@ class AuthorizedSalesAgents2(AdCPBaseModel):
258
264
  tags: Annotated[
259
265
  dict[str, Tags] | None,
260
266
  Field(
261
- description="Metadata for each tag referenced by properties. Provides human-readable context for property tag values."
267
+ description='Metadata for each tag referenced by properties. Provides human-readable context for property tag values.'
262
268
  ),
263
269
  ] = None
264
270
 
@@ -267,231 +273,232 @@ class AuthorizedSalesAgents(RootModel[AuthorizedSalesAgents1 | AuthorizedSalesAg
267
273
  root: Annotated[
268
274
  AuthorizedSalesAgents1 | AuthorizedSalesAgents2,
269
275
  Field(
270
- description="Declaration of authorized sales agents for advertising inventory. Hosted at /.well-known/adagents.json on publisher domains. Can either contain the full structure inline or reference an authoritative URL.",
276
+ description='Declaration of authorized sales agents for advertising inventory. Hosted at /.well-known/adagents.json on publisher domains. Can either contain the full structure inline or reference an authoritative URL.',
271
277
  examples=[
272
278
  {
273
- "$schema": "/schemas/2.6.0/adagents.json",
274
- "authoritative_location": "https://cdn.example.com/adagents/v2/adagents.json",
275
- "last_updated": "2025-01-15T10:00:00Z",
279
+ '$schema': '/schemas/3.0.0-beta.1/adagents.json',
280
+ 'authoritative_location': 'https://cdn.example.com/adagents/v2/adagents.json',
281
+ 'last_updated': '2025-01-15T10:00:00Z',
276
282
  },
277
283
  {
278
- "$schema": "/schemas/2.6.0/adagents.json",
279
- "authorized_agents": [
284
+ '$schema': '/schemas/3.0.0-beta.1/adagents.json',
285
+ 'authorized_agents': [
280
286
  {
281
- "authorization_type": "property_tags",
282
- "authorized_for": "Official sales agent",
283
- "property_tags": ["all"],
284
- "url": "https://agent.example.com",
287
+ 'authorization_type': 'property_tags',
288
+ 'authorized_for': 'Official sales agent',
289
+ 'property_tags': ['all'],
290
+ 'url': 'https://agent.example.com',
285
291
  }
286
292
  ],
287
- "last_updated": "2025-01-10T12:00:00Z",
288
- "properties": [
293
+ 'last_updated': '2025-01-10T12:00:00Z',
294
+ 'properties': [
289
295
  {
290
- "identifiers": [{"type": "domain", "value": "example.com"}],
291
- "name": "Example Site",
292
- "property_type": "website",
293
- "publisher_domain": "example.com",
296
+ 'identifiers': [{'type': 'domain', 'value': 'example.com'}],
297
+ 'name': 'Example Site',
298
+ 'property_type': 'website',
299
+ 'publisher_domain': 'example.com',
294
300
  }
295
301
  ],
296
- "tags": {
297
- "all": {
298
- "description": "All properties in this file",
299
- "name": "All Properties",
302
+ 'tags': {
303
+ 'all': {
304
+ 'description': 'All properties in this file',
305
+ 'name': 'All Properties',
300
306
  }
301
307
  },
302
308
  },
303
309
  {
304
- "$schema": "/schemas/2.6.0/adagents.json",
305
- "authorized_agents": [
310
+ '$schema': '/schemas/3.0.0-beta.1/adagents.json',
311
+ 'authorized_agents': [
306
312
  {
307
- "authorization_type": "property_tags",
308
- "authorized_for": "All Meta properties",
309
- "property_tags": ["meta_network"],
310
- "url": "https://meta-ads.com",
313
+ 'authorization_type': 'property_tags',
314
+ 'authorized_for': 'All Meta properties',
315
+ 'property_tags': ['meta_network'],
316
+ 'url': 'https://meta-ads.com',
311
317
  }
312
318
  ],
313
- "contact": {
314
- "domain": "meta.com",
315
- "email": "adops@meta.com",
316
- "name": "Meta Advertising Operations",
317
- "seller_id": "pub-meta-12345",
318
- "tag_id": "12345",
319
+ 'contact': {
320
+ 'domain': 'meta.com',
321
+ 'email': 'adops@meta.com',
322
+ 'name': 'Meta Advertising Operations',
323
+ 'privacy_policy_url': 'https://www.meta.com/privacy/policy',
324
+ 'seller_id': 'pub-meta-12345',
325
+ 'tag_id': '12345',
319
326
  },
320
- "last_updated": "2025-01-10T15:30:00Z",
321
- "properties": [
327
+ 'last_updated': '2025-01-10T15:30:00Z',
328
+ 'properties': [
322
329
  {
323
- "identifiers": [
324
- {"type": "ios_bundle", "value": "com.burbn.instagram"},
325
- {"type": "android_package", "value": "com.instagram.android"},
330
+ 'identifiers': [
331
+ {'type': 'ios_bundle', 'value': 'com.burbn.instagram'},
332
+ {'type': 'android_package', 'value': 'com.instagram.android'},
326
333
  ],
327
- "name": "Instagram",
328
- "property_type": "mobile_app",
329
- "publisher_domain": "instagram.com",
330
- "tags": ["meta_network", "social_media"],
334
+ 'name': 'Instagram',
335
+ 'property_type': 'mobile_app',
336
+ 'publisher_domain': 'instagram.com',
337
+ 'tags': ['meta_network', 'social_media'],
331
338
  },
332
339
  {
333
- "identifiers": [
334
- {"type": "ios_bundle", "value": "com.facebook.Facebook"},
335
- {"type": "android_package", "value": "com.facebook.katana"},
340
+ 'identifiers': [
341
+ {'type': 'ios_bundle', 'value': 'com.facebook.Facebook'},
342
+ {'type': 'android_package', 'value': 'com.facebook.katana'},
336
343
  ],
337
- "name": "Facebook",
338
- "property_type": "mobile_app",
339
- "publisher_domain": "facebook.com",
340
- "tags": ["meta_network", "social_media"],
344
+ 'name': 'Facebook',
345
+ 'property_type': 'mobile_app',
346
+ 'publisher_domain': 'facebook.com',
347
+ 'tags': ['meta_network', 'social_media'],
341
348
  },
342
349
  {
343
- "identifiers": [
344
- {"type": "ios_bundle", "value": "net.whatsapp.WhatsApp"},
345
- {"type": "android_package", "value": "com.whatsapp"},
350
+ 'identifiers': [
351
+ {'type': 'ios_bundle', 'value': 'net.whatsapp.WhatsApp'},
352
+ {'type': 'android_package', 'value': 'com.whatsapp'},
346
353
  ],
347
- "name": "WhatsApp",
348
- "property_type": "mobile_app",
349
- "publisher_domain": "whatsapp.com",
350
- "tags": ["meta_network", "messaging"],
354
+ 'name': 'WhatsApp',
355
+ 'property_type': 'mobile_app',
356
+ 'publisher_domain': 'whatsapp.com',
357
+ 'tags': ['meta_network', 'messaging'],
351
358
  },
352
359
  ],
353
- "tags": {
354
- "messaging": {
355
- "description": "Messaging and communication apps",
356
- "name": "Messaging Apps",
360
+ 'tags': {
361
+ 'messaging': {
362
+ 'description': 'Messaging and communication apps',
363
+ 'name': 'Messaging Apps',
357
364
  },
358
- "meta_network": {
359
- "description": "All Meta-owned properties",
360
- "name": "Meta Network",
365
+ 'meta_network': {
366
+ 'description': 'All Meta-owned properties',
367
+ 'name': 'Meta Network',
361
368
  },
362
- "social_media": {
363
- "description": "Social networking applications",
364
- "name": "Social Media Apps",
369
+ 'social_media': {
370
+ 'description': 'Social networking applications',
371
+ 'name': 'Social Media Apps',
365
372
  },
366
373
  },
367
374
  },
368
375
  {
369
- "$schema": "/schemas/2.6.0/adagents.json",
370
- "authorized_agents": [
376
+ '$schema': '/schemas/3.0.0-beta.1/adagents.json',
377
+ 'authorized_agents': [
371
378
  {
372
- "authorization_type": "property_tags",
373
- "authorized_for": "Tumblr corporate properties only",
374
- "property_tags": ["corporate"],
375
- "url": "https://tumblr-sales.com",
379
+ 'authorization_type': 'property_tags',
380
+ 'authorized_for': 'Tumblr corporate properties only',
381
+ 'property_tags': ['corporate'],
382
+ 'url': 'https://tumblr-sales.com',
376
383
  }
377
384
  ],
378
- "contact": {"name": "Tumblr Advertising"},
379
- "last_updated": "2025-01-10T16:00:00Z",
380
- "properties": [
385
+ 'contact': {'name': 'Tumblr Advertising'},
386
+ 'last_updated': '2025-01-10T16:00:00Z',
387
+ 'properties': [
381
388
  {
382
- "identifiers": [{"type": "domain", "value": "tumblr.com"}],
383
- "name": "Tumblr Corporate",
384
- "property_type": "website",
385
- "publisher_domain": "tumblr.com",
386
- "tags": ["corporate"],
389
+ 'identifiers': [{'type': 'domain', 'value': 'tumblr.com'}],
390
+ 'name': 'Tumblr Corporate',
391
+ 'property_type': 'website',
392
+ 'publisher_domain': 'tumblr.com',
393
+ 'tags': ['corporate'],
387
394
  }
388
395
  ],
389
- "tags": {
390
- "corporate": {
391
- "description": "Tumblr-owned corporate properties (not user blogs)",
392
- "name": "Corporate Properties",
396
+ 'tags': {
397
+ 'corporate': {
398
+ 'description': 'Tumblr-owned corporate properties (not user blogs)',
399
+ 'name': 'Corporate Properties',
393
400
  }
394
401
  },
395
402
  },
396
403
  {
397
- "$schema": "/schemas/2.6.0/adagents.json",
398
- "authorized_agents": [
404
+ '$schema': '/schemas/3.0.0-beta.1/adagents.json',
405
+ 'authorized_agents': [
399
406
  {
400
- "authorization_type": "publisher_properties",
401
- "authorized_for": "CNN CTV properties via publisher authorization",
402
- "publisher_properties": [
407
+ 'authorization_type': 'publisher_properties',
408
+ 'authorized_for': 'CNN CTV properties via publisher authorization',
409
+ 'publisher_properties': [
403
410
  {
404
- "property_ids": ["cnn_ctv_app"],
405
- "publisher_domain": "cnn.com",
406
- "selection_type": "by_id",
411
+ 'property_ids': ['cnn_ctv_app'],
412
+ 'publisher_domain': 'cnn.com',
413
+ 'selection_type': 'by_id',
407
414
  }
408
415
  ],
409
- "url": "https://agent.example/api",
416
+ 'url': 'https://agent.example/api',
410
417
  },
411
418
  {
412
- "authorization_type": "publisher_properties",
413
- "authorized_for": "All CTV properties from multiple publishers",
414
- "publisher_properties": [
419
+ 'authorization_type': 'publisher_properties',
420
+ 'authorized_for': 'All CTV properties from multiple publishers',
421
+ 'publisher_properties': [
415
422
  {
416
- "property_tags": ["ctv"],
417
- "publisher_domain": "cnn.com",
418
- "selection_type": "by_tag",
423
+ 'property_tags': ['ctv'],
424
+ 'publisher_domain': 'cnn.com',
425
+ 'selection_type': 'by_tag',
419
426
  },
420
427
  {
421
- "property_tags": ["ctv"],
422
- "publisher_domain": "espn.com",
423
- "selection_type": "by_tag",
428
+ 'property_tags': ['ctv'],
429
+ 'publisher_domain': 'espn.com',
430
+ 'selection_type': 'by_tag',
424
431
  },
425
432
  ],
426
- "url": "https://agent.example/api",
433
+ 'url': 'https://agent.example/api',
427
434
  },
428
435
  ],
429
- "contact": {
430
- "domain": "agent.example",
431
- "email": "sales@agent.example",
432
- "name": "Example Third-Party Sales Agent",
436
+ 'contact': {
437
+ 'domain': 'agent.example',
438
+ 'email': 'sales@agent.example',
439
+ 'name': 'Example Third-Party Sales Agent',
433
440
  },
434
- "last_updated": "2025-01-10T17:00:00Z",
441
+ 'last_updated': '2025-01-10T17:00:00Z',
435
442
  },
436
443
  {
437
- "$schema": "/schemas/2.6.0/adagents.json",
438
- "authorized_agents": [
444
+ '$schema': '/schemas/3.0.0-beta.1/adagents.json',
445
+ 'authorized_agents': [
439
446
  {
440
- "authorization_type": "property_tags",
441
- "authorized_for": "All news properties",
442
- "property_tags": ["news"],
443
- "url": "https://sales.news.example.com",
447
+ 'authorization_type': 'property_tags',
448
+ 'authorized_for': 'All news properties',
449
+ 'property_tags': ['news'],
450
+ 'url': 'https://sales.news.example.com',
444
451
  }
445
452
  ],
446
- "contact": {
447
- "domain": "news.example.com",
448
- "email": "adops@news.example.com",
449
- "name": "Premium News Publisher",
453
+ 'contact': {
454
+ 'domain': 'news.example.com',
455
+ 'email': 'adops@news.example.com',
456
+ 'name': 'Premium News Publisher',
450
457
  },
451
- "last_updated": "2025-01-10T18:00:00Z",
452
- "properties": [
458
+ 'last_updated': '2025-01-10T18:00:00Z',
459
+ 'properties': [
453
460
  {
454
- "identifiers": [{"type": "domain", "value": "news.example.com"}],
455
- "name": "News Example",
456
- "property_type": "website",
457
- "publisher_domain": "news.example.com",
458
- "tags": ["premium", "news"],
461
+ 'identifiers': [{'type': 'domain', 'value': 'news.example.com'}],
462
+ 'name': 'News Example',
463
+ 'property_type': 'website',
464
+ 'publisher_domain': 'news.example.com',
465
+ 'tags': ['premium', 'news'],
459
466
  }
460
467
  ],
461
- "property_features": [
468
+ 'property_features': [
462
469
  {
463
- "features": ["carbon_score", "sustainability_grade"],
464
- "name": "Scope3",
465
- "publisher_id": "pub_news_12345",
466
- "url": "https://api.scope3.com",
470
+ 'features': ['carbon_score', 'sustainability_grade'],
471
+ 'name': 'Scope3',
472
+ 'publisher_id': 'pub_news_12345',
473
+ 'url': 'https://api.scope3.com',
467
474
  },
468
475
  {
469
- "features": [
470
- "tag_certified_against_fraud",
471
- "tag_brand_safety_certified",
476
+ 'features': [
477
+ 'tag_certified_against_fraud',
478
+ 'tag_brand_safety_certified',
472
479
  ],
473
- "name": "TAG",
474
- "url": "https://api.tagtoday.net",
480
+ 'name': 'TAG',
481
+ 'url': 'https://api.tagtoday.net',
475
482
  },
476
483
  {
477
- "features": ["gdpr_compliant", "tcf_registered", "ccpa_compliant"],
478
- "name": "OneTrust",
479
- "publisher_id": "ot_news_67890",
480
- "url": "https://api.onetrust.com",
484
+ 'features': ['gdpr_compliant', 'tcf_registered', 'ccpa_compliant'],
485
+ 'name': 'OneTrust',
486
+ 'publisher_id': 'ot_news_67890',
487
+ 'url': 'https://api.onetrust.com',
481
488
  },
482
489
  ],
483
- "tags": {
484
- "news": {
485
- "description": "News and journalism content",
486
- "name": "News Properties",
490
+ 'tags': {
491
+ 'news': {
492
+ 'description': 'News and journalism content',
493
+ 'name': 'News Properties',
487
494
  },
488
- "premium": {
489
- "description": "High-quality, brand-safe properties",
490
- "name": "Premium Properties",
495
+ 'premium': {
496
+ 'description': 'High-quality, brand-safe properties',
497
+ 'name': 'Premium Properties',
491
498
  },
492
499
  },
493
500
  },
494
501
  ],
495
- title="Authorized Sales Agents",
502
+ title='Authorized Sales Agents',
496
503
  ),
497
504
  ]