adcp 3.1.0__py3-none-any.whl → 3.2.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.
- adcp/ADCP_VERSION +1 -1
- adcp/__init__.py +5 -5
- adcp/__main__.py +4 -4
- adcp/adagents.py +5 -9
- adcp/client.py +14 -12
- adcp/protocols/a2a.py +3 -3
- adcp/protocols/base.py +2 -2
- adcp/protocols/mcp.py +3 -3
- adcp/server/base.py +6 -10
- adcp/server/content_standards.py +17 -49
- adcp/server/governance.py +20 -59
- adcp/server/mcp_tools.py +8 -4
- adcp/server/proposal.py +1 -3
- adcp/server/sponsored_intelligence.py +10 -28
- adcp/simple.py +10 -10
- adcp/types/__init__.py +10 -6
- adcp/types/_generated.py +44 -27
- adcp/types/base.py +7 -7
- adcp/types/generated_poc/{protocols → a2ui}/__init__.py +1 -1
- adcp/types/generated_poc/a2ui/component.py +24 -0
- adcp/types/generated_poc/a2ui/surface.py +33 -0
- adcp/types/generated_poc/account/__init__.py +3 -0
- adcp/types/generated_poc/account/list_accounts_request.py +30 -0
- adcp/types/generated_poc/account/list_accounts_response.py +30 -0
- adcp/types/generated_poc/adagents.py +192 -195
- adcp/types/generated_poc/content_standards/artifact.py +69 -69
- adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +13 -13
- adcp/types/generated_poc/content_standards/calibrate_content_request.py +2 -2
- adcp/types/generated_poc/content_standards/calibrate_content_response.py +17 -17
- adcp/types/generated_poc/content_standards/content_standards.py +8 -8
- adcp/types/generated_poc/content_standards/create_content_standards_request.py +13 -13
- adcp/types/generated_poc/content_standards/create_content_standards_response.py +6 -6
- adcp/types/generated_poc/content_standards/get_content_standards_request.py +1 -1
- adcp/types/generated_poc/content_standards/get_content_standards_response.py +4 -4
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +14 -14
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +30 -30
- adcp/types/generated_poc/content_standards/list_content_standards_request.py +4 -4
- adcp/types/generated_poc/content_standards/list_content_standards_response.py +5 -5
- adcp/types/generated_poc/content_standards/update_content_standards_request.py +14 -14
- adcp/types/generated_poc/content_standards/update_content_standards_response.py +4 -4
- adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +13 -13
- adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +16 -16
- adcp/types/generated_poc/core/account.py +54 -0
- adcp/types/generated_poc/core/activation_key.py +8 -8
- adcp/types/generated_poc/core/assets/audio_asset.py +37 -8
- adcp/types/generated_poc/core/assets/css_asset.py +2 -2
- adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
- adcp/types/generated_poc/core/assets/html_asset.py +2 -2
- adcp/types/generated_poc/core/assets/image_asset.py +6 -6
- adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
- adcp/types/generated_poc/core/assets/text_asset.py +2 -2
- adcp/types/generated_poc/core/assets/url_asset.py +3 -3
- adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
- adcp/types/generated_poc/core/assets/video_asset.py +126 -10
- adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
- adcp/types/generated_poc/core/async_response_data.py +2 -2
- adcp/types/generated_poc/core/brand_manifest.py +66 -66
- adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
- adcp/types/generated_poc/core/context.py +1 -1
- adcp/types/generated_poc/core/creative_asset.py +12 -12
- adcp/types/generated_poc/core/creative_assignment.py +3 -3
- adcp/types/generated_poc/core/creative_filters.py +23 -17
- adcp/types/generated_poc/core/creative_manifest.py +4 -4
- adcp/types/generated_poc/core/creative_policy.py +4 -4
- adcp/types/generated_poc/core/delivery_metrics.py +32 -32
- adcp/types/generated_poc/core/deployment.py +20 -20
- adcp/types/generated_poc/core/destination.py +11 -11
- adcp/types/generated_poc/core/error.py +6 -6
- adcp/types/generated_poc/core/ext.py +1 -1
- adcp/types/generated_poc/core/format.py +49 -124
- adcp/types/generated_poc/core/format_id.py +5 -5
- adcp/types/generated_poc/core/frequency_cap.py +2 -2
- adcp/types/generated_poc/core/identifier.py +2 -2
- adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
- adcp/types/generated_poc/core/measurement.py +8 -8
- adcp/types/generated_poc/core/media_buy.py +12 -8
- adcp/types/generated_poc/core/media_buy_features.py +3 -3
- adcp/types/generated_poc/core/offering.py +9 -9
- adcp/types/generated_poc/core/package.py +8 -8
- adcp/types/generated_poc/core/performance_feedback.py +18 -18
- adcp/types/generated_poc/core/placement.py +4 -4
- adcp/types/generated_poc/core/pricing_option.py +1 -1
- adcp/types/generated_poc/core/product.py +27 -21
- adcp/types/generated_poc/core/product_allocation.py +5 -5
- adcp/types/generated_poc/core/product_filters.py +27 -27
- adcp/types/generated_poc/core/promoted_offerings.py +18 -18
- adcp/types/generated_poc/core/promoted_products.py +2 -2
- adcp/types/generated_poc/core/property.py +10 -10
- adcp/types/generated_poc/core/property_id.py +4 -4
- adcp/types/generated_poc/core/property_list_ref.py +4 -4
- adcp/types/generated_poc/core/property_tag.py +4 -4
- adcp/types/generated_poc/core/proposal.py +13 -13
- adcp/types/generated_poc/core/protocol_envelope.py +8 -8
- adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
- adcp/types/generated_poc/core/push_notification_config.py +5 -5
- adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
- adcp/types/generated_poc/core/reporting_webhook.py +10 -10
- adcp/types/generated_poc/core/response.py +4 -4
- adcp/types/generated_poc/core/signal_filters.py +5 -5
- adcp/types/generated_poc/core/start_timing.py +3 -3
- adcp/types/generated_poc/core/sub_asset.py +14 -14
- adcp/types/generated_poc/core/targeting.py +17 -10
- adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
- adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
- adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
- adcp/types/generated_poc/creative/preview_creative_response.py +28 -28
- adcp/types/generated_poc/creative/preview_render.py +25 -25
- adcp/types/generated_poc/enums/adcp_domain.py +4 -4
- adcp/types/generated_poc/enums/asset_content_type.py +13 -13
- adcp/types/generated_poc/enums/auth_scheme.py +2 -2
- adcp/types/generated_poc/enums/available_metric.py +9 -9
- adcp/types/generated_poc/enums/channels.py +19 -19
- adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
- adcp/types/generated_poc/enums/creative_action.py +5 -5
- adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
- adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
- adcp/types/generated_poc/enums/creative_status.py +5 -5
- adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
- adcp/types/generated_poc/enums/daast_version.py +2 -2
- adcp/types/generated_poc/enums/delivery_type.py +2 -2
- adcp/types/generated_poc/enums/dimension_unit.py +4 -4
- adcp/types/generated_poc/enums/feed_format.py +3 -3
- adcp/types/generated_poc/enums/feedback_source.py +4 -4
- adcp/types/generated_poc/enums/format_category.py +7 -7
- adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
- adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
- adcp/types/generated_poc/enums/geo_level.py +4 -4
- adcp/types/generated_poc/enums/history_entry_type.py +2 -2
- adcp/types/generated_poc/enums/http_method.py +2 -2
- adcp/types/generated_poc/enums/identifier_types.py +19 -19
- adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
- adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
- adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
- adcp/types/generated_poc/enums/media_buy_status.py +4 -4
- adcp/types/generated_poc/enums/metric_type.py +8 -8
- adcp/types/generated_poc/enums/metro_system.py +5 -5
- adcp/types/generated_poc/enums/notification_type.py +4 -4
- adcp/types/generated_poc/enums/pacing.py +3 -3
- adcp/types/generated_poc/enums/postal_system.py +9 -9
- adcp/types/generated_poc/enums/preview_output_format.py +2 -2
- adcp/types/generated_poc/enums/pricing_model.py +7 -7
- adcp/types/generated_poc/enums/property_type.py +8 -8
- adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
- adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
- adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
- adcp/types/generated_poc/enums/sort_direction.py +2 -2
- adcp/types/generated_poc/enums/task_status.py +9 -9
- adcp/types/generated_poc/enums/task_type.py +11 -12
- adcp/types/generated_poc/enums/update_frequency.py +4 -4
- adcp/types/generated_poc/enums/url_asset_type.py +3 -3
- adcp/types/generated_poc/enums/validation_mode.py +2 -2
- adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
- adcp/types/generated_poc/enums/vast_version.py +5 -5
- adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
- adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
- adcp/types/generated_poc/extensions/extension_meta.py +14 -14
- adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
- adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
- adcp/types/generated_poc/media_buy/create_media_buy_request.py +27 -21
- adcp/types/generated_poc/media_buy/create_media_buy_response.py +15 -8
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
- adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
- adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
- adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
- adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
- adcp/types/generated_poc/media_buy/get_products_response.py +5 -5
- adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
- adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
- adcp/types/generated_poc/media_buy/list_creatives_request.py +23 -23
- adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -49
- adcp/types/generated_poc/media_buy/package_request.py +8 -8
- adcp/types/generated_poc/media_buy/package_update.py +16 -16
- adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
- adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
- adcp/types/generated_poc/media_buy/sync_creatives_request.py +14 -8
- adcp/types/generated_poc/media_buy/sync_creatives_response.py +33 -29
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
- adcp/types/generated_poc/media_buy/update_media_buy_request.py +14 -14
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
- adcp/types/generated_poc/pricing_options/cpc_option.py +13 -26
- adcp/types/generated_poc/pricing_options/cpcv_option.py +13 -26
- adcp/types/generated_poc/pricing_options/cpm_option.py +13 -20
- adcp/types/generated_poc/pricing_options/cpp_option.py +19 -32
- adcp/types/generated_poc/pricing_options/cpv_option.py +19 -32
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +23 -36
- adcp/types/generated_poc/pricing_options/price_guidance.py +26 -0
- adcp/types/generated_poc/pricing_options/vcpm_option.py +13 -26
- adcp/types/generated_poc/property/base_property_source.py +15 -15
- adcp/types/generated_poc/property/create_property_list_request.py +4 -4
- adcp/types/generated_poc/property/create_property_list_response.py +3 -3
- adcp/types/generated_poc/property/delete_property_list_request.py +2 -2
- adcp/types/generated_poc/property/delete_property_list_response.py +3 -3
- adcp/types/generated_poc/property/feature_requirement.py +8 -8
- adcp/types/generated_poc/property/get_property_list_request.py +5 -5
- adcp/types/generated_poc/property/get_property_list_response.py +11 -11
- adcp/types/generated_poc/property/list_property_lists_request.py +5 -5
- adcp/types/generated_poc/property/list_property_lists_response.py +8 -8
- adcp/types/generated_poc/property/property_error.py +10 -10
- adcp/types/generated_poc/property/property_feature.py +4 -4
- adcp/types/generated_poc/property/property_feature_definition.py +18 -18
- adcp/types/generated_poc/property/property_list.py +11 -11
- adcp/types/generated_poc/property/property_list_changed_webhook.py +11 -11
- adcp/types/generated_poc/property/property_list_filters.py +7 -7
- adcp/types/generated_poc/property/update_property_list_request.py +8 -8
- adcp/types/generated_poc/property/update_property_list_response.py +2 -2
- adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +8 -6
- adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +59 -58
- adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
- adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
- adcp/types/generated_poc/signals/get_signals_request.py +8 -8
- adcp/types/generated_poc/signals/get_signals_response.py +15 -15
- adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +45 -30
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +4 -4
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +23 -23
- adcp/types/generated_poc/sponsored_intelligence/si_identity.py +16 -16
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +5 -5
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +7 -7
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +11 -11
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +37 -23
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +17 -17
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +15 -15
- adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +11 -11
- adcp/utils/format_assets.py +32 -32
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/METADATA +10 -5
- adcp-3.2.0.dist-info/RECORD +268 -0
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +0 -38
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +0 -84
- adcp/types/generated_poc/protocols/adcp_extension.py +0 -50
- adcp-3.1.0.dist-info/RECORD +0 -264
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
|
@@ -12,7 +12,7 @@ from pydantic import ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class PromotedProducts(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra="allow",
|
|
16
16
|
)
|
|
17
17
|
manifest_category: Annotated[
|
|
18
18
|
str | None,
|
|
@@ -28,7 +28,7 @@ class PromotedProducts(AdCPBaseModel):
|
|
|
28
28
|
] = None
|
|
29
29
|
manifest_skus: Annotated[
|
|
30
30
|
list[str] | None,
|
|
31
|
-
Field(description=
|
|
31
|
+
Field(description="Direct product SKU references from the brand manifest product catalog"),
|
|
32
32
|
] = None
|
|
33
33
|
manifest_tags: Annotated[
|
|
34
34
|
list[str] | None,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/property.json
|
|
3
|
-
# timestamp: 2026-
|
|
3
|
+
# timestamp: 2026-02-02T17:45:21+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -17,11 +17,11 @@ from . import property_tag
|
|
|
17
17
|
|
|
18
18
|
class Identifier(AdCPBaseModel):
|
|
19
19
|
model_config = ConfigDict(
|
|
20
|
-
extra=
|
|
20
|
+
extra="allow",
|
|
21
21
|
)
|
|
22
22
|
type: Annotated[
|
|
23
23
|
identifier_types.PropertyIdentifierTypes,
|
|
24
|
-
Field(description=
|
|
24
|
+
Field(description="Type of identifier for this property"),
|
|
25
25
|
]
|
|
26
26
|
value: Annotated[
|
|
27
27
|
str,
|
|
@@ -33,30 +33,30 @@ class Identifier(AdCPBaseModel):
|
|
|
33
33
|
|
|
34
34
|
class Property(AdCPBaseModel):
|
|
35
35
|
model_config = ConfigDict(
|
|
36
|
-
extra=
|
|
36
|
+
extra="allow",
|
|
37
37
|
)
|
|
38
38
|
identifiers: Annotated[
|
|
39
|
-
list[Identifier], Field(description=
|
|
39
|
+
list[Identifier], Field(description="Array of identifiers for this property", min_length=1)
|
|
40
40
|
]
|
|
41
|
-
name: Annotated[str, Field(description=
|
|
41
|
+
name: Annotated[str, Field(description="Human-readable property name")]
|
|
42
42
|
property_id: Annotated[
|
|
43
43
|
property_id_1.PropertyId | None,
|
|
44
44
|
Field(
|
|
45
|
-
description=
|
|
45
|
+
description="Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects."
|
|
46
46
|
),
|
|
47
47
|
] = None
|
|
48
48
|
property_type: Annotated[
|
|
49
|
-
property_type_1.PropertyType, Field(description=
|
|
49
|
+
property_type_1.PropertyType, Field(description="Type of advertising property")
|
|
50
50
|
]
|
|
51
51
|
publisher_domain: Annotated[
|
|
52
52
|
str | None,
|
|
53
53
|
Field(
|
|
54
|
-
description=
|
|
54
|
+
description="Domain where adagents.json should be checked for authorization validation. Optional in adagents.json (file location implies domain)."
|
|
55
55
|
),
|
|
56
56
|
] = None
|
|
57
57
|
tags: Annotated[
|
|
58
58
|
list[property_tag.PropertyTag] | None,
|
|
59
59
|
Field(
|
|
60
|
-
description=
|
|
60
|
+
description="Tags for categorization and grouping (e.g., network membership, content categories)"
|
|
61
61
|
),
|
|
62
62
|
] = None
|
|
@@ -13,9 +13,9 @@ class PropertyId(RootModel[str]):
|
|
|
13
13
|
root: Annotated[
|
|
14
14
|
str,
|
|
15
15
|
Field(
|
|
16
|
-
description=
|
|
17
|
-
examples=[
|
|
18
|
-
pattern=
|
|
19
|
-
title=
|
|
16
|
+
description="Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.",
|
|
17
|
+
examples=["cnn_ctv_app", "homepage", "mobile_ios", "instagram"],
|
|
18
|
+
pattern="^[a-z0-9_]+$",
|
|
19
|
+
title="Property ID",
|
|
20
20
|
),
|
|
21
21
|
]
|
|
@@ -12,15 +12,15 @@ from pydantic import AnyUrl, ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class PropertyListReference(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra="forbid",
|
|
16
16
|
)
|
|
17
|
-
agent_url: Annotated[AnyUrl, Field(description=
|
|
17
|
+
agent_url: Annotated[AnyUrl, Field(description="URL of the agent managing the property list")]
|
|
18
18
|
auth_token: Annotated[
|
|
19
19
|
str | None,
|
|
20
20
|
Field(
|
|
21
|
-
description=
|
|
21
|
+
description="JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access."
|
|
22
22
|
),
|
|
23
23
|
] = None
|
|
24
24
|
list_id: Annotated[
|
|
25
|
-
str, Field(description=
|
|
25
|
+
str, Field(description="Identifier for the property list within the agent", min_length=1)
|
|
26
26
|
]
|
|
@@ -13,9 +13,9 @@ class PropertyTag(RootModel[str]):
|
|
|
13
13
|
root: Annotated[
|
|
14
14
|
str,
|
|
15
15
|
Field(
|
|
16
|
-
description=
|
|
17
|
-
examples=[
|
|
18
|
-
pattern=
|
|
19
|
-
title=
|
|
16
|
+
description="Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.",
|
|
17
|
+
examples=["ctv", "premium", "news", "sports", "meta_network", "social_media"],
|
|
18
|
+
pattern="^[a-z0-9_]+$",
|
|
19
|
+
title="Property Tag",
|
|
20
20
|
),
|
|
21
21
|
]
|
|
@@ -15,50 +15,50 @@ from . import product_allocation
|
|
|
15
15
|
|
|
16
16
|
class TotalBudgetGuidance(AdCPBaseModel):
|
|
17
17
|
model_config = ConfigDict(
|
|
18
|
-
extra=
|
|
18
|
+
extra="allow",
|
|
19
19
|
)
|
|
20
|
-
currency: Annotated[str | None, Field(description=
|
|
20
|
+
currency: Annotated[str | None, Field(description="ISO 4217 currency code")] = None
|
|
21
21
|
max: Annotated[
|
|
22
|
-
float | None, Field(description=
|
|
22
|
+
float | None, Field(description="Maximum budget before diminishing returns", ge=0.0)
|
|
23
23
|
] = None
|
|
24
|
-
min: Annotated[float | None, Field(description=
|
|
24
|
+
min: Annotated[float | None, Field(description="Minimum recommended budget", ge=0.0)] = None
|
|
25
25
|
recommended: Annotated[
|
|
26
|
-
float | None, Field(description=
|
|
26
|
+
float | None, Field(description="Recommended budget for optimal performance", ge=0.0)
|
|
27
27
|
] = None
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class Proposal(AdCPBaseModel):
|
|
31
31
|
model_config = ConfigDict(
|
|
32
|
-
extra=
|
|
32
|
+
extra="allow",
|
|
33
33
|
)
|
|
34
34
|
allocations: Annotated[
|
|
35
35
|
list[product_allocation.ProductAllocation],
|
|
36
36
|
Field(
|
|
37
|
-
description=
|
|
37
|
+
description="Budget allocations across products. Allocation percentages MUST sum to 100. Publishers are responsible for ensuring the sum equals 100; buyers SHOULD validate this before execution.",
|
|
38
38
|
min_length=1,
|
|
39
39
|
),
|
|
40
40
|
]
|
|
41
41
|
brief_alignment: Annotated[
|
|
42
42
|
str | None,
|
|
43
|
-
Field(description=
|
|
43
|
+
Field(description="Explanation of how this proposal aligns with the campaign brief"),
|
|
44
44
|
] = None
|
|
45
45
|
description: Annotated[
|
|
46
|
-
str | None, Field(description=
|
|
46
|
+
str | None, Field(description="Explanation of the proposal strategy and what it achieves")
|
|
47
47
|
] = None
|
|
48
48
|
expires_at: Annotated[
|
|
49
49
|
AwareDatetime | None,
|
|
50
50
|
Field(
|
|
51
|
-
description=
|
|
51
|
+
description="When this proposal expires and can no longer be executed. After expiration, referenced products or pricing may no longer be available."
|
|
52
52
|
),
|
|
53
53
|
] = None
|
|
54
54
|
ext: ext_1.ExtensionObject | None = None
|
|
55
|
-
name: Annotated[str, Field(description=
|
|
55
|
+
name: Annotated[str, Field(description="Human-readable name for this media plan proposal")]
|
|
56
56
|
proposal_id: Annotated[
|
|
57
57
|
str,
|
|
58
58
|
Field(
|
|
59
|
-
description=
|
|
59
|
+
description="Unique identifier for this proposal. Used to refine the proposal in subsequent get_products calls or to execute it via create_media_buy."
|
|
60
60
|
),
|
|
61
61
|
]
|
|
62
62
|
total_budget_guidance: Annotated[
|
|
63
|
-
TotalBudgetGuidance | None, Field(description=
|
|
63
|
+
TotalBudgetGuidance | None, Field(description="Optional budget guidance for this proposal")
|
|
64
64
|
] = None
|
|
@@ -15,47 +15,47 @@ from . import push_notification_config as push_notification_config_1
|
|
|
15
15
|
|
|
16
16
|
class ProtocolEnvelope(AdCPBaseModel):
|
|
17
17
|
model_config = ConfigDict(
|
|
18
|
-
extra=
|
|
18
|
+
extra="allow",
|
|
19
19
|
)
|
|
20
20
|
context_id: Annotated[
|
|
21
21
|
str | None,
|
|
22
22
|
Field(
|
|
23
|
-
description=
|
|
23
|
+
description="Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context."
|
|
24
24
|
),
|
|
25
25
|
] = None
|
|
26
26
|
message: Annotated[
|
|
27
27
|
str | None,
|
|
28
28
|
Field(
|
|
29
|
-
description=
|
|
29
|
+
description="Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response."
|
|
30
30
|
),
|
|
31
31
|
] = None
|
|
32
32
|
payload: Annotated[
|
|
33
33
|
dict[str, Any],
|
|
34
34
|
Field(
|
|
35
|
-
description=
|
|
35
|
+
description="The actual task-specific response data. This is the content defined in individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). Contains only domain-specific data without protocol-level fields."
|
|
36
36
|
),
|
|
37
37
|
]
|
|
38
38
|
push_notification_config: Annotated[
|
|
39
39
|
push_notification_config_1.PushNotificationConfig | None,
|
|
40
40
|
Field(
|
|
41
|
-
description=
|
|
41
|
+
description="Push notification configuration for async task updates (A2A and REST protocols). Echoed from the request to confirm webhook settings. Specifies URL, authentication scheme (Bearer or HMAC-SHA256), and credentials. MCP uses progress notifications instead of webhooks."
|
|
42
42
|
),
|
|
43
43
|
] = None
|
|
44
44
|
status: Annotated[
|
|
45
45
|
task_status.TaskStatus,
|
|
46
46
|
Field(
|
|
47
|
-
description=
|
|
47
|
+
description="Current task execution state. Indicates whether the task is completed, in progress (working), submitted for async processing, failed, or requires user input. Managed by the protocol layer."
|
|
48
48
|
),
|
|
49
49
|
]
|
|
50
50
|
task_id: Annotated[
|
|
51
51
|
str | None,
|
|
52
52
|
Field(
|
|
53
|
-
description=
|
|
53
|
+
description="Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete."
|
|
54
54
|
),
|
|
55
55
|
] = None
|
|
56
56
|
timestamp: Annotated[
|
|
57
57
|
AwareDatetime | None,
|
|
58
58
|
Field(
|
|
59
|
-
description=
|
|
59
|
+
description="ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress."
|
|
60
60
|
),
|
|
61
61
|
] = None
|
|
@@ -14,26 +14,26 @@ from . import property_id, property_tag
|
|
|
14
14
|
|
|
15
15
|
class PublisherPropertySelector1(AdCPBaseModel):
|
|
16
16
|
model_config = ConfigDict(
|
|
17
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
18
18
|
)
|
|
19
19
|
publisher_domain: Annotated[
|
|
20
20
|
str,
|
|
21
21
|
Field(
|
|
22
22
|
description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
|
|
23
|
-
pattern=
|
|
23
|
+
pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
|
|
24
24
|
),
|
|
25
25
|
]
|
|
26
26
|
selection_type: Annotated[
|
|
27
|
-
Literal[
|
|
27
|
+
Literal["all"],
|
|
28
28
|
Field(
|
|
29
|
-
description=
|
|
29
|
+
description="Discriminator indicating all properties from this publisher are included"
|
|
30
30
|
),
|
|
31
31
|
]
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class PublisherPropertySelector2(AdCPBaseModel):
|
|
35
35
|
model_config = ConfigDict(
|
|
36
|
-
extra=
|
|
36
|
+
extra="allow",
|
|
37
37
|
)
|
|
38
38
|
property_ids: Annotated[
|
|
39
39
|
list[property_id.PropertyId],
|
|
@@ -43,18 +43,18 @@ class PublisherPropertySelector2(AdCPBaseModel):
|
|
|
43
43
|
str,
|
|
44
44
|
Field(
|
|
45
45
|
description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
|
|
46
|
-
pattern=
|
|
46
|
+
pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
|
|
47
47
|
),
|
|
48
48
|
]
|
|
49
49
|
selection_type: Annotated[
|
|
50
|
-
Literal[
|
|
51
|
-
Field(description=
|
|
50
|
+
Literal["by_id"],
|
|
51
|
+
Field(description="Discriminator indicating selection by specific property IDs"),
|
|
52
52
|
]
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
class PublisherPropertySelector3(AdCPBaseModel):
|
|
56
56
|
model_config = ConfigDict(
|
|
57
|
-
extra=
|
|
57
|
+
extra="allow",
|
|
58
58
|
)
|
|
59
59
|
property_tags: Annotated[
|
|
60
60
|
list[property_tag.PropertyTag],
|
|
@@ -67,11 +67,11 @@ class PublisherPropertySelector3(AdCPBaseModel):
|
|
|
67
67
|
str,
|
|
68
68
|
Field(
|
|
69
69
|
description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
|
|
70
|
-
pattern=
|
|
70
|
+
pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
|
|
71
71
|
),
|
|
72
72
|
]
|
|
73
73
|
selection_type: Annotated[
|
|
74
|
-
Literal[
|
|
74
|
+
Literal["by_tag"], Field(description="Discriminator indicating selection by property tags")
|
|
75
75
|
]
|
|
76
76
|
|
|
77
77
|
|
|
@@ -82,7 +82,7 @@ class PublisherPropertySelector(
|
|
|
82
82
|
PublisherPropertySelector1 | PublisherPropertySelector2 | PublisherPropertySelector3,
|
|
83
83
|
Field(
|
|
84
84
|
description="Selects properties from a publisher's adagents.json. Used for both product definitions and agent authorization. Supports three selection patterns: all properties, specific IDs, or by tags.",
|
|
85
|
-
discriminator=
|
|
86
|
-
title=
|
|
85
|
+
discriminator="selection_type",
|
|
86
|
+
title="Publisher Property Selector",
|
|
87
87
|
),
|
|
88
88
|
]
|
|
@@ -14,12 +14,12 @@ from ..enums import auth_scheme
|
|
|
14
14
|
|
|
15
15
|
class Authentication(AdCPBaseModel):
|
|
16
16
|
model_config = ConfigDict(
|
|
17
|
-
extra=
|
|
17
|
+
extra="forbid",
|
|
18
18
|
)
|
|
19
19
|
credentials: Annotated[
|
|
20
20
|
str,
|
|
21
21
|
Field(
|
|
22
|
-
description=
|
|
22
|
+
description="Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.",
|
|
23
23
|
min_length=32,
|
|
24
24
|
),
|
|
25
25
|
]
|
|
@@ -36,13 +36,13 @@ class Authentication(AdCPBaseModel):
|
|
|
36
36
|
class PushNotificationConfig(AdCPBaseModel):
|
|
37
37
|
authentication: Annotated[
|
|
38
38
|
Authentication,
|
|
39
|
-
Field(description=
|
|
39
|
+
Field(description="Authentication configuration for webhook delivery (A2A-compatible)"),
|
|
40
40
|
]
|
|
41
41
|
token: Annotated[
|
|
42
42
|
str | None,
|
|
43
43
|
Field(
|
|
44
|
-
description=
|
|
44
|
+
description="Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.",
|
|
45
45
|
min_length=16,
|
|
46
46
|
),
|
|
47
47
|
] = None
|
|
48
|
-
url: Annotated[AnyUrl, Field(description=
|
|
48
|
+
url: Annotated[AnyUrl, Field(description="Webhook endpoint URL for task status notifications")]
|
|
@@ -14,38 +14,38 @@ from ..enums import available_metric, reporting_frequency
|
|
|
14
14
|
|
|
15
15
|
class ReportingCapabilities(AdCPBaseModel):
|
|
16
16
|
model_config = ConfigDict(
|
|
17
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
18
18
|
)
|
|
19
19
|
available_metrics: Annotated[
|
|
20
20
|
list[available_metric.AvailableMetric],
|
|
21
21
|
Field(
|
|
22
|
-
description=
|
|
22
|
+
description="Metrics available in reporting. Impressions and spend are always implicitly included.",
|
|
23
23
|
examples=[
|
|
24
|
-
[
|
|
25
|
-
[
|
|
24
|
+
["impressions", "spend", "clicks", "video_completions"],
|
|
25
|
+
["impressions", "spend", "conversions"],
|
|
26
26
|
],
|
|
27
27
|
),
|
|
28
28
|
]
|
|
29
29
|
available_reporting_frequencies: Annotated[
|
|
30
30
|
list[reporting_frequency.ReportingFrequency],
|
|
31
|
-
Field(description=
|
|
31
|
+
Field(description="Supported reporting frequency options", min_length=1),
|
|
32
32
|
]
|
|
33
33
|
expected_delay_minutes: Annotated[
|
|
34
34
|
int,
|
|
35
35
|
Field(
|
|
36
|
-
description=
|
|
36
|
+
description="Expected delay in minutes before reporting data becomes available (e.g., 240 for 4-hour delay)",
|
|
37
37
|
examples=[240, 300, 1440],
|
|
38
38
|
ge=0,
|
|
39
39
|
),
|
|
40
40
|
]
|
|
41
41
|
supports_webhooks: Annotated[
|
|
42
42
|
bool,
|
|
43
|
-
Field(description=
|
|
43
|
+
Field(description="Whether this product supports webhook-based reporting notifications"),
|
|
44
44
|
]
|
|
45
45
|
timezone: Annotated[
|
|
46
46
|
str,
|
|
47
47
|
Field(
|
|
48
48
|
description="Timezone for reporting periods. Use 'UTC' or IANA timezone (e.g., 'America/New_York'). Critical for daily/monthly frequency alignment.",
|
|
49
|
-
examples=[
|
|
49
|
+
examples=["UTC", "America/New_York", "Europe/London", "America/Los_Angeles"],
|
|
50
50
|
),
|
|
51
51
|
]
|
|
@@ -15,12 +15,12 @@ from ..enums import auth_scheme, available_metric
|
|
|
15
15
|
|
|
16
16
|
class Authentication(AdCPBaseModel):
|
|
17
17
|
model_config = ConfigDict(
|
|
18
|
-
extra=
|
|
18
|
+
extra="forbid",
|
|
19
19
|
)
|
|
20
20
|
credentials: Annotated[
|
|
21
21
|
str,
|
|
22
22
|
Field(
|
|
23
|
-
description=
|
|
23
|
+
description="Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.",
|
|
24
24
|
min_length=32,
|
|
25
25
|
),
|
|
26
26
|
]
|
|
@@ -35,23 +35,23 @@ class Authentication(AdCPBaseModel):
|
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
class ReportingFrequency(Enum):
|
|
38
|
-
hourly =
|
|
39
|
-
daily =
|
|
40
|
-
monthly =
|
|
38
|
+
hourly = "hourly"
|
|
39
|
+
daily = "daily"
|
|
40
|
+
monthly = "monthly"
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
class ReportingWebhook(AdCPBaseModel):
|
|
44
44
|
model_config = ConfigDict(
|
|
45
|
-
extra=
|
|
45
|
+
extra="allow",
|
|
46
46
|
)
|
|
47
47
|
authentication: Annotated[
|
|
48
48
|
Authentication,
|
|
49
|
-
Field(description=
|
|
49
|
+
Field(description="Authentication configuration for webhook delivery (A2A-compatible)"),
|
|
50
50
|
]
|
|
51
51
|
reporting_frequency: Annotated[
|
|
52
52
|
ReportingFrequency,
|
|
53
53
|
Field(
|
|
54
|
-
description=
|
|
54
|
+
description="Frequency for automated reporting delivery. Must be supported by all products in the media buy."
|
|
55
55
|
),
|
|
56
56
|
]
|
|
57
57
|
requested_metrics: Annotated[
|
|
@@ -63,8 +63,8 @@ class ReportingWebhook(AdCPBaseModel):
|
|
|
63
63
|
token: Annotated[
|
|
64
64
|
str | None,
|
|
65
65
|
Field(
|
|
66
|
-
description=
|
|
66
|
+
description="Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.",
|
|
67
67
|
min_length=16,
|
|
68
68
|
),
|
|
69
69
|
] = None
|
|
70
|
-
url: Annotated[AnyUrl, Field(description=
|
|
70
|
+
url: Annotated[AnyUrl, Field(description="Webhook endpoint URL for reporting notifications")]
|
|
@@ -12,13 +12,13 @@ from pydantic import ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class ProtocolResponse(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra="allow",
|
|
16
16
|
)
|
|
17
|
-
context_id: Annotated[str | None, Field(description=
|
|
17
|
+
context_id: Annotated[str | None, Field(description="Session continuity identifier")] = None
|
|
18
18
|
data: Annotated[
|
|
19
19
|
Any | None,
|
|
20
20
|
Field(
|
|
21
|
-
description=
|
|
21
|
+
description="AdCP task-specific response data (see individual task response schemas)"
|
|
22
22
|
),
|
|
23
23
|
] = None
|
|
24
|
-
message: Annotated[str, Field(description=
|
|
24
|
+
message: Annotated[str, Field(description="Human-readable summary")]
|
|
@@ -14,16 +14,16 @@ from ..enums import signal_catalog_type
|
|
|
14
14
|
|
|
15
15
|
class SignalFilters(AdCPBaseModel):
|
|
16
16
|
model_config = ConfigDict(
|
|
17
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
18
18
|
)
|
|
19
19
|
catalog_types: Annotated[
|
|
20
20
|
list[signal_catalog_type.SignalCatalogType] | None,
|
|
21
|
-
Field(description=
|
|
21
|
+
Field(description="Filter by catalog type"),
|
|
22
22
|
] = None
|
|
23
23
|
data_providers: Annotated[
|
|
24
|
-
list[str] | None, Field(description=
|
|
24
|
+
list[str] | None, Field(description="Filter by specific data providers")
|
|
25
25
|
] = None
|
|
26
|
-
max_cpm: Annotated[float | None, Field(description=
|
|
26
|
+
max_cpm: Annotated[float | None, Field(description="Maximum CPM price filter", ge=0.0)] = None
|
|
27
27
|
min_coverage_percentage: Annotated[
|
|
28
|
-
float | None, Field(description=
|
|
28
|
+
float | None, Field(description="Minimum coverage requirement", ge=0.0, le=100.0)
|
|
29
29
|
] = None
|
|
@@ -9,10 +9,10 @@ from typing import Annotated, Literal
|
|
|
9
9
|
from pydantic import AwareDatetime, Field, RootModel
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
class StartTiming(RootModel[Literal[
|
|
12
|
+
class StartTiming(RootModel[Literal["asap"] | AwareDatetime]):
|
|
13
13
|
root: Annotated[
|
|
14
|
-
Literal[
|
|
14
|
+
Literal["asap"] | AwareDatetime,
|
|
15
15
|
Field(
|
|
16
|
-
description="Campaign start timing: 'asap' or ISO 8601 date-time", title=
|
|
16
|
+
description="Campaign start timing: 'asap' or ISO 8601 date-time", title="Start Timing"
|
|
17
17
|
),
|
|
18
18
|
]
|
|
@@ -12,45 +12,45 @@ from pydantic import AnyUrl, ConfigDict, Field, RootModel
|
|
|
12
12
|
|
|
13
13
|
class SubAsset1(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra="allow",
|
|
16
16
|
)
|
|
17
17
|
asset_id: Annotated[
|
|
18
|
-
str, Field(description=
|
|
18
|
+
str, Field(description="Unique identifier for the asset within the creative")
|
|
19
19
|
]
|
|
20
20
|
asset_kind: Annotated[
|
|
21
|
-
Literal[
|
|
22
|
-
Field(description=
|
|
21
|
+
Literal["media"],
|
|
22
|
+
Field(description="Discriminator indicating this is a media asset with content_uri"),
|
|
23
23
|
]
|
|
24
24
|
asset_type: Annotated[
|
|
25
25
|
str,
|
|
26
26
|
Field(
|
|
27
|
-
description=
|
|
27
|
+
description="Type of asset. Common types: thumbnail_image, product_image, featured_image, logo"
|
|
28
28
|
),
|
|
29
29
|
]
|
|
30
|
-
content_uri: Annotated[AnyUrl, Field(description=
|
|
30
|
+
content_uri: Annotated[AnyUrl, Field(description="URL for media assets (images, videos, etc.)")]
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class SubAsset2(AdCPBaseModel):
|
|
34
34
|
model_config = ConfigDict(
|
|
35
|
-
extra=
|
|
35
|
+
extra="allow",
|
|
36
36
|
)
|
|
37
37
|
asset_id: Annotated[
|
|
38
|
-
str, Field(description=
|
|
38
|
+
str, Field(description="Unique identifier for the asset within the creative")
|
|
39
39
|
]
|
|
40
40
|
asset_kind: Annotated[
|
|
41
|
-
Literal[
|
|
42
|
-
Field(description=
|
|
41
|
+
Literal["text"],
|
|
42
|
+
Field(description="Discriminator indicating this is a text asset with content"),
|
|
43
43
|
]
|
|
44
44
|
asset_type: Annotated[
|
|
45
45
|
str,
|
|
46
46
|
Field(
|
|
47
|
-
description=
|
|
47
|
+
description="Type of asset. Common types: headline, body_text, cta_text, price_text, sponsor_name, author_name, click_url"
|
|
48
48
|
),
|
|
49
49
|
]
|
|
50
50
|
content: Annotated[
|
|
51
51
|
str | list[str],
|
|
52
52
|
Field(
|
|
53
|
-
description=
|
|
53
|
+
description="Text content for text-based assets like headlines, body text, CTA text, etc."
|
|
54
54
|
),
|
|
55
55
|
]
|
|
56
56
|
|
|
@@ -59,7 +59,7 @@ class SubAsset(RootModel[SubAsset1 | SubAsset2]):
|
|
|
59
59
|
root: Annotated[
|
|
60
60
|
SubAsset1 | SubAsset2,
|
|
61
61
|
Field(
|
|
62
|
-
description=
|
|
63
|
-
title=
|
|
62
|
+
description="Sub-asset for multi-asset creative formats, including carousel images and native ad template variables",
|
|
63
|
+
title="Sub-Asset",
|
|
64
64
|
),
|
|
65
65
|
]
|