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.
- adcp/ADCP_VERSION +1 -1
- adcp/__init__.py +6 -14
- adcp/__main__.py +94 -51
- adcp/adagents.py +91 -19
- adcp/client.py +865 -0
- adcp/protocols/a2a.py +84 -0
- adcp/protocols/base.py +101 -0
- adcp/protocols/mcp.py +87 -1
- adcp/server/__init__.py +49 -0
- adcp/server/base.py +368 -0
- adcp/server/content_standards.py +561 -0
- adcp/server/governance.py +491 -0
- adcp/server/mcp_tools.py +471 -0
- adcp/server/proposal.py +334 -0
- adcp/server/sponsored_intelligence.py +444 -0
- adcp/types/__init__.py +111 -23
- adcp/types/_ergonomic.py +35 -18
- adcp/types/_generated.py +419 -44
- adcp/types/aliases.py +13 -20
- adcp/types/base.py +1 -1
- adcp/types/generated_poc/adagents.py +103 -6
- adcp/types/generated_poc/content_standards/__init__.py +3 -0
- adcp/types/generated_poc/content_standards/artifact.py +208 -0
- adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
- adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
- adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
- adcp/types/generated_poc/content_standards/content_standards.py +66 -0
- adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
- adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
- adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
- adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
- adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
- adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
- adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
- adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
- adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
- adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
- adcp/types/generated_poc/core/activation_key.py +1 -1
- adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
- adcp/types/generated_poc/core/assets/css_asset.py +1 -1
- adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
- adcp/types/generated_poc/core/assets/html_asset.py +1 -1
- adcp/types/generated_poc/core/assets/image_asset.py +1 -1
- adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
- adcp/types/generated_poc/core/assets/text_asset.py +1 -1
- adcp/types/generated_poc/core/assets/url_asset.py +1 -1
- adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
- adcp/types/generated_poc/core/assets/video_asset.py +1 -1
- adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
- adcp/types/generated_poc/core/async_response_data.py +1 -1
- adcp/types/generated_poc/core/brand_manifest.py +68 -5
- adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
- adcp/types/generated_poc/core/context.py +1 -1
- adcp/types/generated_poc/core/creative_asset.py +8 -7
- adcp/types/generated_poc/core/creative_assignment.py +1 -1
- adcp/types/generated_poc/core/creative_filters.py +4 -14
- adcp/types/generated_poc/core/creative_manifest.py +1 -1
- adcp/types/generated_poc/core/creative_policy.py +1 -1
- adcp/types/generated_poc/core/delivery_metrics.py +1 -1
- adcp/types/generated_poc/core/deployment.py +1 -1
- adcp/types/generated_poc/core/destination.py +1 -1
- adcp/types/generated_poc/core/error.py +1 -1
- adcp/types/generated_poc/core/ext.py +1 -1
- adcp/types/generated_poc/core/format.py +6 -5
- adcp/types/generated_poc/core/format_id.py +1 -1
- adcp/types/generated_poc/core/frequency_cap.py +1 -1
- adcp/types/generated_poc/core/identifier.py +27 -0
- adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
- adcp/types/generated_poc/core/measurement.py +1 -1
- adcp/types/generated_poc/core/media_buy.py +1 -1
- adcp/types/generated_poc/core/media_buy_features.py +29 -0
- adcp/types/generated_poc/core/offering.py +80 -0
- adcp/types/generated_poc/core/package.py +1 -1
- adcp/types/generated_poc/core/performance_feedback.py +1 -1
- adcp/types/generated_poc/core/placement.py +1 -1
- adcp/types/generated_poc/core/pricing_option.py +8 -14
- adcp/types/generated_poc/core/product.py +1 -1
- adcp/types/generated_poc/core/product_allocation.py +48 -0
- adcp/types/generated_poc/core/product_filters.py +72 -7
- adcp/types/generated_poc/core/promoted_offerings.py +12 -21
- adcp/types/generated_poc/core/promoted_products.py +1 -1
- adcp/types/generated_poc/core/property.py +1 -1
- adcp/types/generated_poc/core/property_id.py +1 -1
- adcp/types/generated_poc/core/property_list_ref.py +26 -0
- adcp/types/generated_poc/core/property_tag.py +1 -1
- adcp/types/generated_poc/core/proposal.py +64 -0
- adcp/types/generated_poc/core/protocol_envelope.py +1 -1
- adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
- adcp/types/generated_poc/core/push_notification_config.py +1 -1
- adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
- adcp/types/generated_poc/core/reporting_webhook.py +70 -0
- adcp/types/generated_poc/core/response.py +1 -1
- adcp/types/generated_poc/core/signal_filters.py +1 -1
- adcp/types/generated_poc/core/start_timing.py +4 -4
- adcp/types/generated_poc/core/sub_asset.py +1 -1
- adcp/types/generated_poc/core/targeting.py +55 -14
- adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
- adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
- adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
- adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
- adcp/types/generated_poc/creative/preview_render.py +1 -1
- adcp/types/generated_poc/enums/adcp_domain.py +3 -1
- adcp/types/generated_poc/enums/asset_content_type.py +1 -1
- adcp/types/generated_poc/enums/auth_scheme.py +1 -1
- adcp/types/generated_poc/enums/available_metric.py +1 -1
- adcp/types/generated_poc/enums/channels.py +18 -8
- adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
- adcp/types/generated_poc/enums/creative_action.py +1 -1
- adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
- adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
- adcp/types/generated_poc/enums/creative_status.py +2 -1
- adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
- adcp/types/generated_poc/enums/daast_version.py +1 -1
- adcp/types/generated_poc/enums/delivery_type.py +1 -1
- adcp/types/generated_poc/enums/dimension_unit.py +1 -1
- adcp/types/generated_poc/enums/feed_format.py +1 -1
- adcp/types/generated_poc/enums/feedback_source.py +1 -1
- adcp/types/generated_poc/enums/format_category.py +1 -1
- adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
- adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
- adcp/types/generated_poc/enums/geo_level.py +14 -0
- adcp/types/generated_poc/enums/history_entry_type.py +1 -1
- adcp/types/generated_poc/enums/http_method.py +1 -1
- adcp/types/generated_poc/enums/identifier_types.py +1 -1
- adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
- adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
- adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
- adcp/types/generated_poc/enums/media_buy_status.py +1 -1
- adcp/types/generated_poc/enums/metric_type.py +1 -1
- adcp/types/generated_poc/enums/metro_system.py +15 -0
- adcp/types/generated_poc/enums/notification_type.py +1 -1
- adcp/types/generated_poc/enums/pacing.py +1 -1
- adcp/types/generated_poc/enums/postal_system.py +19 -0
- adcp/types/generated_poc/enums/preview_output_format.py +1 -1
- adcp/types/generated_poc/enums/pricing_model.py +1 -1
- adcp/types/generated_poc/enums/property_type.py +2 -1
- adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
- adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
- adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
- adcp/types/generated_poc/enums/sort_direction.py +1 -1
- adcp/types/generated_poc/enums/task_status.py +1 -1
- adcp/types/generated_poc/enums/task_type.py +7 -1
- adcp/types/generated_poc/enums/update_frequency.py +1 -1
- adcp/types/generated_poc/enums/url_asset_type.py +1 -1
- adcp/types/generated_poc/enums/validation_mode.py +1 -1
- adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
- adcp/types/generated_poc/enums/vast_version.py +1 -1
- adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
- adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
- adcp/types/generated_poc/extensions/__init__.py +3 -0
- adcp/types/generated_poc/extensions/extension_meta.py +58 -0
- adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
- adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
- 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 +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
- adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
- adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
- adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
- adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
- adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
- adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
- adcp/types/generated_poc/media_buy/package_request.py +15 -6
- adcp/types/generated_poc/media_buy/package_update.py +119 -0
- adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
- adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
- 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 +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
- 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 +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
- adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
- adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
- adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
- adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
- adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
- adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
- adcp/types/generated_poc/property/__init__.py +3 -0
- adcp/types/generated_poc/property/base_property_source.py +86 -0
- adcp/types/generated_poc/property/create_property_list_request.py +43 -0
- adcp/types/generated_poc/property/create_property_list_response.py +27 -0
- adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
- adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
- adcp/types/generated_poc/property/feature_requirement.py +42 -0
- adcp/types/generated_poc/property/get_property_list_request.py +34 -0
- adcp/types/generated_poc/property/get_property_list_response.py +61 -0
- adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
- adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
- adcp/types/generated_poc/property/property_error.py +33 -0
- adcp/types/generated_poc/property/property_feature.py +22 -0
- adcp/types/generated_poc/property/property_feature_definition.py +80 -0
- adcp/types/generated_poc/property/property_list.py +62 -0
- adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
- adcp/types/generated_poc/property/property_list_filters.py +47 -0
- adcp/types/generated_poc/property/update_property_list_request.py +46 -0
- adcp/types/generated_poc/property/update_property_list_response.py +21 -0
- adcp/types/generated_poc/protocol/__init__.py +3 -0
- adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
- adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
- adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
- adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
- adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
- adcp/types/generated_poc/signals/get_signals_request.py +1 -1
- adcp/types/generated_poc/signals/get_signals_response.py +1 -1
- adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
- adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
- adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
- adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
- adcp/utils/format_assets.py +5 -5
- adcp/utils/preview_cache.py +2 -2
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
- adcp-3.0.0.dist-info/RECORD +264 -0
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
- adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
- adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
- adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
- adcp-2.18.0.dist-info/RECORD +0 -195
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
- {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-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
46
|
+
deprecated=True,
|
|
47
|
+
description='DEPRECATED: Use get_adcp_capabilities response supported_protocols instead.',
|
|
35
48
|
min_length=1,
|
|
36
49
|
),
|
|
37
50
|
]
|
|
@@ -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
|