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,27 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: core/identifier.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 ..enums import identifier_types
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Identifier(AdCPBaseModel):
|
|
16
|
+
model_config = ConfigDict(
|
|
17
|
+
extra='forbid',
|
|
18
|
+
)
|
|
19
|
+
type: Annotated[
|
|
20
|
+
identifier_types.PropertyIdentifierTypes, Field(description='Type of identifier')
|
|
21
|
+
]
|
|
22
|
+
value: Annotated[
|
|
23
|
+
str,
|
|
24
|
+
Field(
|
|
25
|
+
description="The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain"
|
|
26
|
+
),
|
|
27
|
+
]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: core/media_buy_features.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 Field
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class MediaBuyFeatures(AdCPBaseModel):
|
|
14
|
+
content_standards: Annotated[
|
|
15
|
+
bool | None,
|
|
16
|
+
Field(
|
|
17
|
+
description='Full support for content_standards configuration including sampling rates and category filtering'
|
|
18
|
+
),
|
|
19
|
+
] = None
|
|
20
|
+
inline_creative_management: Annotated[
|
|
21
|
+
bool | None,
|
|
22
|
+
Field(description='Supports creatives provided inline in create_media_buy requests'),
|
|
23
|
+
] = None
|
|
24
|
+
property_list_filtering: Annotated[
|
|
25
|
+
bool | None,
|
|
26
|
+
Field(
|
|
27
|
+
description='Honors property_list parameter in get_products to filter results to buyer-approved properties'
|
|
28
|
+
),
|
|
29
|
+
] = None
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: core/offering.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Any
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
from . import ext as ext_1
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Offering(AdCPBaseModel):
|
|
16
|
+
model_config = ConfigDict(
|
|
17
|
+
extra='allow',
|
|
18
|
+
)
|
|
19
|
+
assets: Annotated[
|
|
20
|
+
list[dict[str, Any]] | None,
|
|
21
|
+
Field(description='Assets specific to this offering (images, videos, copy)'),
|
|
22
|
+
] = None
|
|
23
|
+
categories: Annotated[
|
|
24
|
+
list[str] | None,
|
|
25
|
+
Field(
|
|
26
|
+
description="Categories this offering belongs to (e.g., 'measurement', 'identity', 'programmatic')"
|
|
27
|
+
),
|
|
28
|
+
] = None
|
|
29
|
+
checkout_url: Annotated[
|
|
30
|
+
AnyUrl | None,
|
|
31
|
+
Field(
|
|
32
|
+
description="URL for checkout/purchase flow when the brand doesn't support agentic checkout."
|
|
33
|
+
),
|
|
34
|
+
] = None
|
|
35
|
+
description: Annotated[str | None, Field(description="Description of what's being offered")] = (
|
|
36
|
+
None
|
|
37
|
+
)
|
|
38
|
+
ext: ext_1.ExtensionObject | None = None
|
|
39
|
+
keywords: Annotated[
|
|
40
|
+
list[str] | None,
|
|
41
|
+
Field(
|
|
42
|
+
description='Keywords for matching this offering to user intent. Hosts use these for retrieval/relevance scoring.'
|
|
43
|
+
),
|
|
44
|
+
] = None
|
|
45
|
+
landing_url: Annotated[
|
|
46
|
+
AnyUrl | None, Field(description='Landing page URL for this offering.')
|
|
47
|
+
] = None
|
|
48
|
+
name: Annotated[
|
|
49
|
+
str,
|
|
50
|
+
Field(
|
|
51
|
+
description="Human-readable offering name (e.g., 'Winter Sale', 'Free Trial', 'Enterprise Platform')"
|
|
52
|
+
),
|
|
53
|
+
]
|
|
54
|
+
offering_id: Annotated[
|
|
55
|
+
str,
|
|
56
|
+
Field(
|
|
57
|
+
description='Unique identifier for this offering. Used by hosts to reference specific offerings in si_get_offering calls.'
|
|
58
|
+
),
|
|
59
|
+
]
|
|
60
|
+
portfolio_ref: Annotated[
|
|
61
|
+
AnyUrl | None,
|
|
62
|
+
Field(
|
|
63
|
+
description='Reference to a creative portfolio for this offering. Portfolios contain organized creative assets across formats, enabling consistent ad delivery for this specific offering.'
|
|
64
|
+
),
|
|
65
|
+
] = None
|
|
66
|
+
tagline: Annotated[
|
|
67
|
+
str | None, Field(description='Short promotional tagline for the offering')
|
|
68
|
+
] = None
|
|
69
|
+
valid_from: Annotated[
|
|
70
|
+
AwareDatetime | None,
|
|
71
|
+
Field(
|
|
72
|
+
description='When the offering becomes available. If not specified, offering is immediately available.'
|
|
73
|
+
),
|
|
74
|
+
] = None
|
|
75
|
+
valid_to: Annotated[
|
|
76
|
+
AwareDatetime | None,
|
|
77
|
+
Field(
|
|
78
|
+
description='When the offering expires. If not specified, offering has no expiration.'
|
|
79
|
+
),
|
|
80
|
+
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/pricing_option.json
|
|
3
|
-
# timestamp:
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -11,22 +11,18 @@ from pydantic import Field, RootModel
|
|
|
11
11
|
from ..pricing_options import (
|
|
12
12
|
cpc_option,
|
|
13
13
|
cpcv_option,
|
|
14
|
-
|
|
15
|
-
cpm_fixed_option,
|
|
14
|
+
cpm_option,
|
|
16
15
|
cpp_option,
|
|
17
16
|
cpv_option,
|
|
18
17
|
flat_rate_option,
|
|
19
|
-
|
|
20
|
-
vcpm_fixed_option,
|
|
18
|
+
vcpm_option,
|
|
21
19
|
)
|
|
22
20
|
|
|
23
21
|
|
|
24
22
|
class PricingOption(
|
|
25
23
|
RootModel[
|
|
26
|
-
|
|
27
|
-
|
|
|
28
|
-
| vcpm_fixed_option.VcpmFixedRatePricingOption
|
|
29
|
-
| vcpm_auction_option.VcpmAuctionPricingOption
|
|
24
|
+
cpm_option.CpmPricingOption
|
|
25
|
+
| vcpm_option.VcpmPricingOption
|
|
30
26
|
| cpc_option.CpcPricingOption
|
|
31
27
|
| cpcv_option.CpcvPricingOption
|
|
32
28
|
| cpv_option.CpvPricingOption
|
|
@@ -35,17 +31,15 @@ class PricingOption(
|
|
|
35
31
|
]
|
|
36
32
|
):
|
|
37
33
|
root: Annotated[
|
|
38
|
-
|
|
39
|
-
|
|
|
40
|
-
| vcpm_fixed_option.VcpmFixedRatePricingOption
|
|
41
|
-
| vcpm_auction_option.VcpmAuctionPricingOption
|
|
34
|
+
cpm_option.CpmPricingOption
|
|
35
|
+
| vcpm_option.VcpmPricingOption
|
|
42
36
|
| cpc_option.CpcPricingOption
|
|
43
37
|
| cpcv_option.CpcvPricingOption
|
|
44
38
|
| cpv_option.CpvPricingOption
|
|
45
39
|
| cpp_option.CppPricingOption
|
|
46
40
|
| flat_rate_option.FlatRatePricingOption,
|
|
47
41
|
Field(
|
|
48
|
-
description=
|
|
42
|
+
description="A pricing model option offered by a publisher for a product. Discriminated by pricing_model field. If fixed_price is present, it's fixed pricing. If absent, it's auction-based (floor_price and price_guidance optional).",
|
|
49
43
|
title='Pricing Option',
|
|
50
44
|
),
|
|
51
45
|
]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: core/product_allocation.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 . import ext as ext_1
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ProductAllocation(AdCPBaseModel):
|
|
16
|
+
model_config = ConfigDict(
|
|
17
|
+
extra='allow',
|
|
18
|
+
)
|
|
19
|
+
allocation_percentage: Annotated[
|
|
20
|
+
float,
|
|
21
|
+
Field(
|
|
22
|
+
description='Percentage of total budget allocated to this product (0-100)',
|
|
23
|
+
ge=0.0,
|
|
24
|
+
le=100.0,
|
|
25
|
+
),
|
|
26
|
+
]
|
|
27
|
+
ext: ext_1.ExtensionObject | None = None
|
|
28
|
+
pricing_option_id: Annotated[
|
|
29
|
+
str | None,
|
|
30
|
+
Field(description="Recommended pricing option ID from the product's pricing_options array"),
|
|
31
|
+
] = None
|
|
32
|
+
product_id: Annotated[
|
|
33
|
+
str, Field(description='ID of the product (must reference a product in the products array)')
|
|
34
|
+
]
|
|
35
|
+
rationale: Annotated[
|
|
36
|
+
str | None,
|
|
37
|
+
Field(description='Explanation of why this product and allocation are recommended'),
|
|
38
|
+
] = None
|
|
39
|
+
sequence: Annotated[
|
|
40
|
+
int | None,
|
|
41
|
+
Field(description='Optional ordering hint for multi-line-item plans (1-based)', ge=1),
|
|
42
|
+
] = None
|
|
43
|
+
tags: Annotated[
|
|
44
|
+
list[str] | None,
|
|
45
|
+
Field(
|
|
46
|
+
description="Categorical tags for this allocation (e.g., 'desktop', 'german', 'mobile') - useful for grouping/filtering allocations by dimension"
|
|
47
|
+
),
|
|
48
|
+
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/product_filters.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -8,12 +8,12 @@ from datetime import date
|
|
|
8
8
|
from typing import Annotated
|
|
9
9
|
|
|
10
10
|
from adcp.types.base import AdCPBaseModel
|
|
11
|
-
from pydantic import ConfigDict, Field, RootModel
|
|
11
|
+
from pydantic import AnyUrl, ConfigDict, Field, RootModel
|
|
12
12
|
|
|
13
13
|
from ..enums import channels as channels_1
|
|
14
14
|
from ..enums import delivery_type as delivery_type_1
|
|
15
|
-
from ..enums import format_category
|
|
16
|
-
from . import format_id
|
|
15
|
+
from ..enums import format_category, geo_level, metro_system
|
|
16
|
+
from . import format_id, media_buy_features
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class BudgetRange(AdCPBaseModel):
|
|
@@ -48,6 +48,38 @@ class Country(RootModel[str]):
|
|
|
48
48
|
root: Annotated[str, Field(pattern='^[A-Z]{2}$')]
|
|
49
49
|
|
|
50
50
|
|
|
51
|
+
class Metro(AdCPBaseModel):
|
|
52
|
+
model_config = ConfigDict(
|
|
53
|
+
extra='forbid',
|
|
54
|
+
)
|
|
55
|
+
code: Annotated[
|
|
56
|
+
str, Field(description="Metro code within the system (e.g., '501' for NYC DMA)")
|
|
57
|
+
]
|
|
58
|
+
system: Annotated[
|
|
59
|
+
metro_system.MetroAreaSystem, Field(description='Metro classification system')
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class Region(RootModel[str]):
|
|
64
|
+
root: Annotated[str, Field(pattern='^[A-Z]{2}-[A-Z0-9]+$')]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class RequiredGeoTargetingItem(AdCPBaseModel):
|
|
68
|
+
model_config = ConfigDict(
|
|
69
|
+
extra='forbid',
|
|
70
|
+
)
|
|
71
|
+
level: Annotated[
|
|
72
|
+
geo_level.GeographicTargetingLevel,
|
|
73
|
+
Field(description='Geographic targeting level (country, region, metro, postal_area)'),
|
|
74
|
+
]
|
|
75
|
+
system: Annotated[
|
|
76
|
+
str | None,
|
|
77
|
+
Field(
|
|
78
|
+
description="Classification system within the level. Required for metro (e.g., 'nielsen_dma') and postal_area (e.g., 'us_zip'). Not applicable for country/region which use ISO standards."
|
|
79
|
+
),
|
|
80
|
+
] = None
|
|
81
|
+
|
|
82
|
+
|
|
51
83
|
class ProductFilters(AdCPBaseModel):
|
|
52
84
|
model_config = ConfigDict(
|
|
53
85
|
extra='allow',
|
|
@@ -57,13 +89,13 @@ class ProductFilters(AdCPBaseModel):
|
|
|
57
89
|
Field(description='Budget range to filter appropriate products'),
|
|
58
90
|
] = None
|
|
59
91
|
channels: Annotated[
|
|
60
|
-
list[channels_1.
|
|
92
|
+
list[channels_1.MediaChannel] | None,
|
|
61
93
|
Field(description="Filter by advertising channels (e.g., ['display', 'video', 'dooh'])"),
|
|
62
94
|
] = None
|
|
63
95
|
countries: Annotated[
|
|
64
96
|
list[Country] | None,
|
|
65
97
|
Field(
|
|
66
|
-
description="Filter by
|
|
98
|
+
description="Filter by country coverage using ISO 3166-1 alpha-2 codes (e.g., ['US', 'CA', 'GB']). Works for all inventory types."
|
|
67
99
|
),
|
|
68
100
|
] = None
|
|
69
101
|
delivery_type: delivery_type_1.DeliveryType | None = None
|
|
@@ -80,12 +112,45 @@ class ProductFilters(AdCPBaseModel):
|
|
|
80
112
|
list[format_category.FormatCategory] | None, Field(description='Filter by format types')
|
|
81
113
|
] = None
|
|
82
114
|
is_fixed_price: Annotated[
|
|
83
|
-
bool | None,
|
|
115
|
+
bool | None,
|
|
116
|
+
Field(
|
|
117
|
+
description='Filter by pricing availability: true = products offering fixed pricing (at least one option with fixed_price), false = products offering auction pricing (at least one option without fixed_price). Products with both fixed and auction options match both true and false.'
|
|
118
|
+
),
|
|
119
|
+
] = None
|
|
120
|
+
metros: Annotated[
|
|
121
|
+
list[Metro] | None,
|
|
122
|
+
Field(
|
|
123
|
+
description='Filter by metro coverage for locally-bound inventory (radio, DOOH, local TV). Use when products have DMA/metro-specific coverage. For digital inventory where products have broad coverage, use required_geo_targeting instead to filter by seller capability.'
|
|
124
|
+
),
|
|
84
125
|
] = None
|
|
85
126
|
min_exposures: Annotated[
|
|
86
127
|
int | None,
|
|
87
128
|
Field(description='Minimum exposures/impressions needed for measurement validity', ge=1),
|
|
88
129
|
] = None
|
|
130
|
+
regions: Annotated[
|
|
131
|
+
list[Region] | None,
|
|
132
|
+
Field(
|
|
133
|
+
description="Filter by region coverage using ISO 3166-2 codes (e.g., ['US-NY', 'US-CA', 'GB-SCT']). Use for locally-bound inventory (regional OOH, local TV) where products have region-specific coverage."
|
|
134
|
+
),
|
|
135
|
+
] = None
|
|
136
|
+
required_axe_integrations: Annotated[
|
|
137
|
+
list[AnyUrl] | None,
|
|
138
|
+
Field(
|
|
139
|
+
description='Filter to products executable through specific agentic ad exchanges. URLs are canonical identifiers.'
|
|
140
|
+
),
|
|
141
|
+
] = None
|
|
142
|
+
required_features: Annotated[
|
|
143
|
+
media_buy_features.MediaBuyFeatures | None,
|
|
144
|
+
Field(
|
|
145
|
+
description='Filter to products from sellers supporting specific protocol features. Only features set to true are used for filtering.'
|
|
146
|
+
),
|
|
147
|
+
] = None
|
|
148
|
+
required_geo_targeting: Annotated[
|
|
149
|
+
list[RequiredGeoTargetingItem] | None,
|
|
150
|
+
Field(
|
|
151
|
+
description='Filter to products from sellers supporting specific geo targeting capabilities. Each entry specifies a targeting level (country, region, metro, postal_area) and optionally a system for levels that have multiple classification systems.'
|
|
152
|
+
),
|
|
153
|
+
] = None
|
|
89
154
|
standard_formats_only: Annotated[
|
|
90
155
|
bool | None, Field(description='Only return products accepting IAB standard formats')
|
|
91
156
|
] = None
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/promoted_offerings.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
7
|
from enum import Enum
|
|
8
|
-
from typing import Annotated
|
|
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 AnyUrl, ConfigDict, Field
|
|
12
12
|
|
|
13
|
-
from . import brand_manifest_ref, promoted_products
|
|
13
|
+
from . import brand_manifest_ref, offering, promoted_products
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class AssetType(Enum):
|
|
@@ -43,21 +43,6 @@ class AssetSelectors(AdCPBaseModel):
|
|
|
43
43
|
] = None
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
class Offering(AdCPBaseModel):
|
|
47
|
-
model_config = ConfigDict(
|
|
48
|
-
extra='allow',
|
|
49
|
-
)
|
|
50
|
-
assets: Annotated[
|
|
51
|
-
list[dict[str, Any]] | None, Field(description='Assets specific to this offering')
|
|
52
|
-
] = None
|
|
53
|
-
description: Annotated[str | None, Field(description="Description of what's being offered")] = (
|
|
54
|
-
None
|
|
55
|
-
)
|
|
56
|
-
name: Annotated[
|
|
57
|
-
str, Field(description="Offering name (e.g., 'Winter Sale', 'New Product Launch')")
|
|
58
|
-
]
|
|
59
|
-
|
|
60
|
-
|
|
61
46
|
class PromotedOfferings(AdCPBaseModel):
|
|
62
47
|
model_config = ConfigDict(
|
|
63
48
|
extra='allow',
|
|
@@ -73,9 +58,9 @@ class PromotedOfferings(AdCPBaseModel):
|
|
|
73
58
|
),
|
|
74
59
|
]
|
|
75
60
|
offerings: Annotated[
|
|
76
|
-
list[Offering] | None,
|
|
61
|
+
list[offering.Offering] | None,
|
|
77
62
|
Field(
|
|
78
|
-
description='
|
|
63
|
+
description='Offerings available for promotion. Each offering can include creative assets (via portfolio_ref or inline assets) for traditional ads. When si_agent_url is set at the parent level, hosts can offer conversational experiences about any of these offerings.'
|
|
79
64
|
),
|
|
80
65
|
] = None
|
|
81
66
|
product_selectors: Annotated[
|
|
@@ -84,3 +69,9 @@ class PromotedOfferings(AdCPBaseModel):
|
|
|
84
69
|
description='Selectors to choose which products/offerings from the brand manifest product catalog to promote'
|
|
85
70
|
),
|
|
86
71
|
] = None
|
|
72
|
+
si_agent_url: Annotated[
|
|
73
|
+
AnyUrl | None,
|
|
74
|
+
Field(
|
|
75
|
+
description="MCP endpoint URL for the brand's SI agent. When present, hosts can connect users to conversational experiences about any of the offerings. The agent handles si_get_offering lookups and full conversations."
|
|
76
|
+
),
|
|
77
|
+
] = None
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: core/property_list_ref.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, ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PropertyListReference(AdCPBaseModel):
|
|
14
|
+
model_config = ConfigDict(
|
|
15
|
+
extra='forbid',
|
|
16
|
+
)
|
|
17
|
+
agent_url: Annotated[AnyUrl, Field(description='URL of the agent managing the property list')]
|
|
18
|
+
auth_token: Annotated[
|
|
19
|
+
str | None,
|
|
20
|
+
Field(
|
|
21
|
+
description='JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.'
|
|
22
|
+
),
|
|
23
|
+
] = None
|
|
24
|
+
list_id: Annotated[
|
|
25
|
+
str, Field(description='Identifier for the property list within the agent', min_length=1)
|
|
26
|
+
]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: core/proposal.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import AwareDatetime, ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
from . import ext as ext_1
|
|
13
|
+
from . import product_allocation
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TotalBudgetGuidance(AdCPBaseModel):
|
|
17
|
+
model_config = ConfigDict(
|
|
18
|
+
extra='allow',
|
|
19
|
+
)
|
|
20
|
+
currency: Annotated[str | None, Field(description='ISO 4217 currency code')] = None
|
|
21
|
+
max: Annotated[
|
|
22
|
+
float | None, Field(description='Maximum budget before diminishing returns', ge=0.0)
|
|
23
|
+
] = None
|
|
24
|
+
min: Annotated[float | None, Field(description='Minimum recommended budget', ge=0.0)] = None
|
|
25
|
+
recommended: Annotated[
|
|
26
|
+
float | None, Field(description='Recommended budget for optimal performance', ge=0.0)
|
|
27
|
+
] = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class Proposal(AdCPBaseModel):
|
|
31
|
+
model_config = ConfigDict(
|
|
32
|
+
extra='allow',
|
|
33
|
+
)
|
|
34
|
+
allocations: Annotated[
|
|
35
|
+
list[product_allocation.ProductAllocation],
|
|
36
|
+
Field(
|
|
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
|
+
min_length=1,
|
|
39
|
+
),
|
|
40
|
+
]
|
|
41
|
+
brief_alignment: Annotated[
|
|
42
|
+
str | None,
|
|
43
|
+
Field(description='Explanation of how this proposal aligns with the campaign brief'),
|
|
44
|
+
] = None
|
|
45
|
+
description: Annotated[
|
|
46
|
+
str | None, Field(description='Explanation of the proposal strategy and what it achieves')
|
|
47
|
+
] = None
|
|
48
|
+
expires_at: Annotated[
|
|
49
|
+
AwareDatetime | None,
|
|
50
|
+
Field(
|
|
51
|
+
description='When this proposal expires and can no longer be executed. After expiration, referenced products or pricing may no longer be available.'
|
|
52
|
+
),
|
|
53
|
+
] = None
|
|
54
|
+
ext: ext_1.ExtensionObject | None = None
|
|
55
|
+
name: Annotated[str, Field(description='Human-readable name for this media plan proposal')]
|
|
56
|
+
proposal_id: Annotated[
|
|
57
|
+
str,
|
|
58
|
+
Field(
|
|
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
|
+
),
|
|
61
|
+
]
|
|
62
|
+
total_budget_guidance: Annotated[
|
|
63
|
+
TotalBudgetGuidance | None, Field(description='Optional budget guidance for this proposal')
|
|
64
|
+
] = None
|