adcp 2.19.0__py3-none-any.whl → 3.1.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 +14 -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 +84 -0
- 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 +115 -23
- adcp/types/_ergonomic.py +35 -14
- adcp/types/_generated.py +346 -52
- adcp/types/aliases.py +68 -20
- adcp/types/base.py +1 -1
- adcp/types/generated_poc/adagents.py +196 -189
- 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 +9 -9
- adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
- adcp/types/generated_poc/core/assets/css_asset.py +3 -3
- adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
- adcp/types/generated_poc/core/assets/html_asset.py +3 -3
- adcp/types/generated_poc/core/assets/image_asset.py +7 -7
- adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
- adcp/types/generated_poc/core/assets/text_asset.py +3 -3
- adcp/types/generated_poc/core/assets/url_asset.py +4 -4
- adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
- adcp/types/generated_poc/core/assets/video_asset.py +8 -8
- adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
- adcp/types/generated_poc/core/async_response_data.py +3 -3
- adcp/types/generated_poc/core/brand_manifest.py +122 -59
- adcp/types/generated_poc/core/brand_manifest_ref.py +10 -10
- adcp/types/generated_poc/core/context.py +2 -2
- adcp/types/generated_poc/core/creative_asset.py +20 -19
- adcp/types/generated_poc/core/creative_assignment.py +4 -4
- adcp/types/generated_poc/core/creative_filters.py +18 -28
- adcp/types/generated_poc/core/creative_manifest.py +3 -3
- adcp/types/generated_poc/core/creative_policy.py +5 -5
- adcp/types/generated_poc/core/delivery_metrics.py +33 -33
- adcp/types/generated_poc/core/deployment.py +21 -21
- adcp/types/generated_poc/core/destination.py +12 -12
- adcp/types/generated_poc/core/error.py +7 -7
- adcp/types/generated_poc/core/ext.py +2 -2
- adcp/types/generated_poc/core/format.py +66 -66
- adcp/types/generated_poc/core/format_id.py +6 -6
- adcp/types/generated_poc/core/frequency_cap.py +3 -3
- adcp/types/generated_poc/core/identifier.py +3 -3
- adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
- adcp/types/generated_poc/core/measurement.py +9 -9
- adcp/types/generated_poc/core/media_buy.py +8 -8
- 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 +9 -9
- adcp/types/generated_poc/core/performance_feedback.py +19 -19
- adcp/types/generated_poc/core/placement.py +5 -5
- adcp/types/generated_poc/core/pricing_option.py +9 -15
- adcp/types/generated_poc/core/product.py +21 -21
- adcp/types/generated_poc/core/product_allocation.py +48 -0
- adcp/types/generated_poc/core/product_filters.py +89 -24
- adcp/types/generated_poc/core/promoted_offerings.py +29 -38
- adcp/types/generated_poc/core/promoted_products.py +3 -3
- adcp/types/generated_poc/core/property.py +10 -10
- adcp/types/generated_poc/core/property_id.py +5 -5
- adcp/types/generated_poc/core/property_list_ref.py +5 -5
- adcp/types/generated_poc/core/property_tag.py +5 -5
- adcp/types/generated_poc/core/proposal.py +64 -0
- adcp/types/generated_poc/core/protocol_envelope.py +9 -9
- adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
- adcp/types/generated_poc/core/push_notification_config.py +6 -6
- adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
- adcp/types/generated_poc/core/reporting_webhook.py +70 -0
- adcp/types/generated_poc/core/response.py +5 -5
- adcp/types/generated_poc/core/signal_filters.py +6 -6
- adcp/types/generated_poc/core/start_timing.py +4 -4
- adcp/types/generated_poc/core/sub_asset.py +15 -15
- adcp/types/generated_poc/core/targeting.py +59 -18
- adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
- adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
- adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
- adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
- adcp/types/generated_poc/creative/preview_render.py +26 -26
- adcp/types/generated_poc/enums/adcp_domain.py +5 -5
- adcp/types/generated_poc/enums/asset_content_type.py +14 -14
- adcp/types/generated_poc/enums/auth_scheme.py +3 -3
- adcp/types/generated_poc/enums/available_metric.py +10 -10
- adcp/types/generated_poc/enums/channels.py +21 -11
- adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
- adcp/types/generated_poc/enums/creative_action.py +6 -6
- adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
- adcp/types/generated_poc/enums/creative_sort_field.py +7 -7
- adcp/types/generated_poc/enums/creative_status.py +6 -5
- adcp/types/generated_poc/enums/daast_tracking_event.py +12 -12
- adcp/types/generated_poc/enums/daast_version.py +3 -3
- adcp/types/generated_poc/enums/delivery_type.py +3 -3
- adcp/types/generated_poc/enums/dimension_unit.py +5 -5
- adcp/types/generated_poc/enums/feed_format.py +4 -4
- adcp/types/generated_poc/enums/feedback_source.py +5 -5
- adcp/types/generated_poc/enums/format_category.py +8 -8
- adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
- adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
- adcp/types/generated_poc/enums/geo_level.py +14 -0
- adcp/types/generated_poc/enums/history_entry_type.py +3 -3
- adcp/types/generated_poc/enums/http_method.py +3 -3
- adcp/types/generated_poc/enums/identifier_types.py +20 -20
- adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
- adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
- adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
- adcp/types/generated_poc/enums/media_buy_status.py +5 -5
- adcp/types/generated_poc/enums/metric_type.py +9 -9
- adcp/types/generated_poc/enums/metro_system.py +15 -0
- adcp/types/generated_poc/enums/notification_type.py +5 -5
- adcp/types/generated_poc/enums/pacing.py +4 -4
- adcp/types/generated_poc/enums/postal_system.py +19 -0
- adcp/types/generated_poc/enums/preview_output_format.py +3 -3
- adcp/types/generated_poc/enums/pricing_model.py +8 -8
- adcp/types/generated_poc/enums/property_type.py +9 -8
- adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
- adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
- adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
- adcp/types/generated_poc/enums/sort_direction.py +3 -3
- adcp/types/generated_poc/enums/task_status.py +10 -10
- adcp/types/generated_poc/enums/task_type.py +12 -12
- adcp/types/generated_poc/enums/update_frequency.py +5 -5
- adcp/types/generated_poc/enums/url_asset_type.py +4 -4
- adcp/types/generated_poc/enums/validation_mode.py +3 -3
- adcp/types/generated_poc/enums/vast_tracking_event.py +17 -17
- adcp/types/generated_poc/enums/vast_version.py +6 -6
- adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
- adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
- adcp/types/generated_poc/extensions/extension_meta.py +20 -12
- adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
- adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
- adcp/types/generated_poc/media_buy/create_media_buy_request.py +65 -37
- adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
- adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
- adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
- adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
- adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
- adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
- adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
- adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
- adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
- adcp/types/generated_poc/media_buy/list_creatives_response.py +54 -57
- adcp/types/generated_poc/media_buy/package_request.py +12 -12
- adcp/types/generated_poc/media_buy/package_update.py +119 -0
- adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
- adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
- adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
- adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
- adcp/types/generated_poc/media_buy/update_media_buy_request.py +28 -124
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
- adcp/types/generated_poc/pricing_options/cpc_option.py +40 -15
- adcp/types/generated_poc/pricing_options/cpcv_option.py +41 -16
- adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
- adcp/types/generated_poc/pricing_options/cpp_option.py +46 -23
- adcp/types/generated_poc/pricing_options/cpv_option.py +45 -26
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +53 -47
- adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
- adcp/types/generated_poc/property/base_property_source.py +16 -16
- adcp/types/generated_poc/property/create_property_list_request.py +5 -5
- adcp/types/generated_poc/property/create_property_list_response.py +4 -4
- adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
- adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
- adcp/types/generated_poc/property/feature_requirement.py +8 -8
- adcp/types/generated_poc/property/get_property_list_request.py +6 -6
- adcp/types/generated_poc/property/get_property_list_response.py +12 -12
- adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
- adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
- adcp/types/generated_poc/property/property_error.py +11 -11
- adcp/types/generated_poc/property/property_feature.py +5 -5
- adcp/types/generated_poc/property/property_feature_definition.py +19 -19
- adcp/types/generated_poc/property/property_list.py +12 -12
- adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
- adcp/types/generated_poc/property/property_list_filters.py +9 -9
- adcp/types/generated_poc/property/update_property_list_request.py +9 -9
- adcp/types/generated_poc/property/update_property_list_response.py +3 -3
- 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 +14 -17
- adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
- adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
- adcp/types/generated_poc/signals/get_signals_request.py +9 -9
- adcp/types/generated_poc/signals/get_signals_response.py +16 -16
- 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.19.0.dist-info → adcp-3.1.0.dist-info}/METADATA +1 -1
- adcp-3.1.0.dist-info/RECORD +264 -0
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/WHEEL +1 -1
- adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
- adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
- adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
- adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
- adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
- adcp/types/generated_poc/property/list_property_features_request.py +0 -25
- adcp/types/generated_poc/property/list_property_features_response.py +0 -24
- adcp-2.19.0.dist-info/RECORD +0 -220
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/publisher_property_selector.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -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
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/push_notification_config.json
|
|
3
|
-
# timestamp:
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -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')]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/reporting_capabilities.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -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
|
]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: core/reporting_webhook.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, ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
from ..enums import auth_scheme, available_metric
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Authentication(AdCPBaseModel):
|
|
17
|
+
model_config = ConfigDict(
|
|
18
|
+
extra='forbid',
|
|
19
|
+
)
|
|
20
|
+
credentials: Annotated[
|
|
21
|
+
str,
|
|
22
|
+
Field(
|
|
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
|
+
min_length=32,
|
|
25
|
+
),
|
|
26
|
+
]
|
|
27
|
+
schemes: Annotated[
|
|
28
|
+
list[auth_scheme.AuthenticationScheme],
|
|
29
|
+
Field(
|
|
30
|
+
description="Array of authentication schemes. Supported: ['Bearer'] for simple token auth, ['HMAC-SHA256'] for signature verification (recommended for production)",
|
|
31
|
+
max_length=1,
|
|
32
|
+
min_length=1,
|
|
33
|
+
),
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ReportingFrequency(Enum):
|
|
38
|
+
hourly = 'hourly'
|
|
39
|
+
daily = 'daily'
|
|
40
|
+
monthly = 'monthly'
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ReportingWebhook(AdCPBaseModel):
|
|
44
|
+
model_config = ConfigDict(
|
|
45
|
+
extra='allow',
|
|
46
|
+
)
|
|
47
|
+
authentication: Annotated[
|
|
48
|
+
Authentication,
|
|
49
|
+
Field(description='Authentication configuration for webhook delivery (A2A-compatible)'),
|
|
50
|
+
]
|
|
51
|
+
reporting_frequency: Annotated[
|
|
52
|
+
ReportingFrequency,
|
|
53
|
+
Field(
|
|
54
|
+
description='Frequency for automated reporting delivery. Must be supported by all products in the media buy.'
|
|
55
|
+
),
|
|
56
|
+
]
|
|
57
|
+
requested_metrics: Annotated[
|
|
58
|
+
list[available_metric.AvailableMetric] | None,
|
|
59
|
+
Field(
|
|
60
|
+
description="Optional list of metrics to include in webhook notifications. If omitted, all available metrics are included. Must be subset of product's available_metrics."
|
|
61
|
+
),
|
|
62
|
+
] = None
|
|
63
|
+
token: Annotated[
|
|
64
|
+
str | None,
|
|
65
|
+
Field(
|
|
66
|
+
description='Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.',
|
|
67
|
+
min_length=16,
|
|
68
|
+
),
|
|
69
|
+
] = None
|
|
70
|
+
url: Annotated[AnyUrl, Field(description='Webhook endpoint URL for reporting notifications')]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/response.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -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')]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/signal_filters.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/start_timing.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -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
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/sub_asset.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -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
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/targeting.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -9,45 +9,86 @@ from typing import Annotated
|
|
|
9
9
|
from adcp.types.base import AdCPBaseModel
|
|
10
10
|
from pydantic import ConfigDict, Field, RootModel
|
|
11
11
|
|
|
12
|
+
from ..enums import metro_system, postal_system
|
|
12
13
|
from . import frequency_cap as frequency_cap_1
|
|
13
14
|
|
|
14
15
|
|
|
15
|
-
class
|
|
16
|
-
root: Annotated[str, Field(pattern=
|
|
16
|
+
class GeoCountry(RootModel[str]):
|
|
17
|
+
root: Annotated[str, Field(pattern='^[A-Z]{2}$')]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GeoMetro(AdCPBaseModel):
|
|
21
|
+
model_config = ConfigDict(
|
|
22
|
+
extra='forbid',
|
|
23
|
+
)
|
|
24
|
+
system: Annotated[
|
|
25
|
+
metro_system.MetroAreaSystem,
|
|
26
|
+
Field(description="Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"),
|
|
27
|
+
]
|
|
28
|
+
values: Annotated[
|
|
29
|
+
list[str],
|
|
30
|
+
Field(
|
|
31
|
+
description="Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)",
|
|
32
|
+
min_length=1,
|
|
33
|
+
),
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class GeoPostalArea(AdCPBaseModel):
|
|
38
|
+
model_config = ConfigDict(
|
|
39
|
+
extra='forbid',
|
|
40
|
+
)
|
|
41
|
+
system: Annotated[
|
|
42
|
+
postal_system.PostalCodeSystem,
|
|
43
|
+
Field(
|
|
44
|
+
description="Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision."
|
|
45
|
+
),
|
|
46
|
+
]
|
|
47
|
+
values: Annotated[
|
|
48
|
+
list[str],
|
|
49
|
+
Field(
|
|
50
|
+
description="Postal codes within the system (e.g., ['10001', '10002'] for us_zip)",
|
|
51
|
+
min_length=1,
|
|
52
|
+
),
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class GeoRegion(RootModel[str]):
|
|
57
|
+
root: Annotated[str, Field(pattern='^[A-Z]{2}-[A-Z0-9]{1,3}$')]
|
|
17
58
|
|
|
18
59
|
|
|
19
60
|
class TargetingOverlay(AdCPBaseModel):
|
|
20
61
|
model_config = ConfigDict(
|
|
21
|
-
extra=
|
|
62
|
+
extra='allow',
|
|
22
63
|
)
|
|
23
64
|
axe_exclude_segment: Annotated[
|
|
24
|
-
str | None, Field(description=
|
|
65
|
+
str | None, Field(description='AXE segment ID to exclude from targeting')
|
|
25
66
|
] = None
|
|
26
67
|
axe_include_segment: Annotated[
|
|
27
|
-
str | None, Field(description=
|
|
68
|
+
str | None, Field(description='AXE segment ID to include for targeting')
|
|
28
69
|
] = None
|
|
29
70
|
frequency_cap: frequency_cap_1.FrequencyCap | None = None
|
|
30
|
-
|
|
31
|
-
list[
|
|
71
|
+
geo_countries: Annotated[
|
|
72
|
+
list[GeoCountry] | None,
|
|
32
73
|
Field(
|
|
33
|
-
description="Restrict delivery to specific countries
|
|
74
|
+
description="Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."
|
|
34
75
|
),
|
|
35
76
|
] = None
|
|
36
|
-
|
|
37
|
-
list[
|
|
77
|
+
geo_metros: Annotated[
|
|
78
|
+
list[GeoMetro] | None,
|
|
38
79
|
Field(
|
|
39
|
-
description=
|
|
80
|
+
description='Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.'
|
|
40
81
|
),
|
|
41
82
|
] = None
|
|
42
|
-
|
|
43
|
-
list[
|
|
83
|
+
geo_postal_areas: Annotated[
|
|
84
|
+
list[GeoPostalArea] | None,
|
|
44
85
|
Field(
|
|
45
|
-
description=
|
|
86
|
+
description='Restrict delivery to specific postal areas. Each entry specifies the postal system and target values. Seller must declare supported systems in get_adcp_capabilities.'
|
|
46
87
|
),
|
|
47
88
|
] = None
|
|
48
|
-
|
|
49
|
-
list[
|
|
89
|
+
geo_regions: Annotated[
|
|
90
|
+
list[GeoRegion] | None,
|
|
50
91
|
Field(
|
|
51
|
-
description="Restrict delivery to specific regions/states.
|
|
92
|
+
description="Restrict delivery to specific regions/states. ISO 3166-2 subdivision codes (e.g., 'US-CA', 'GB-SCT')."
|
|
52
93
|
),
|
|
53
94
|
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: creative/list_creative_formats_request.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -16,25 +16,25 @@ from ..core import format_id
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class AssetType(Enum):
|
|
19
|
-
image =
|
|
20
|
-
video =
|
|
21
|
-
audio =
|
|
22
|
-
text =
|
|
23
|
-
html =
|
|
24
|
-
javascript =
|
|
25
|
-
url =
|
|
19
|
+
image = 'image'
|
|
20
|
+
video = 'video'
|
|
21
|
+
audio = 'audio'
|
|
22
|
+
text = 'text'
|
|
23
|
+
html = 'html'
|
|
24
|
+
javascript = 'javascript'
|
|
25
|
+
url = 'url'
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class Type(Enum):
|
|
29
|
-
audio =
|
|
30
|
-
video =
|
|
31
|
-
display =
|
|
32
|
-
dooh =
|
|
29
|
+
audio = 'audio'
|
|
30
|
+
video = 'video'
|
|
31
|
+
display = 'display'
|
|
32
|
+
dooh = 'dooh'
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class ListCreativeFormatsRequestCreativeAgent(AdCPBaseModel):
|
|
36
36
|
model_config = ConfigDict(
|
|
37
|
-
extra=
|
|
37
|
+
extra='allow',
|
|
38
38
|
)
|
|
39
39
|
asset_types: Annotated[
|
|
40
40
|
list[AssetType] | None,
|
|
@@ -45,44 +45,44 @@ class ListCreativeFormatsRequestCreativeAgent(AdCPBaseModel):
|
|
|
45
45
|
context: context_1.ContextObject | None = None
|
|
46
46
|
ext: ext_1.ExtensionObject | None = None
|
|
47
47
|
format_ids: Annotated[
|
|
48
|
-
list[format_id.FormatId] | None, Field(description=
|
|
48
|
+
list[format_id.FormatId] | None, Field(description='Return only these specific format IDs')
|
|
49
49
|
] = None
|
|
50
50
|
is_responsive: Annotated[
|
|
51
51
|
bool | None,
|
|
52
52
|
Field(
|
|
53
|
-
description=
|
|
53
|
+
description='Filter for responsive formats that adapt to container size. When true, returns formats without fixed dimensions.'
|
|
54
54
|
),
|
|
55
55
|
] = None
|
|
56
56
|
max_height: Annotated[
|
|
57
57
|
int | None,
|
|
58
58
|
Field(
|
|
59
|
-
description=
|
|
59
|
+
description='Maximum height in pixels (inclusive). Returns formats with height <= this value. Omit for responsive/fluid formats.'
|
|
60
60
|
),
|
|
61
61
|
] = None
|
|
62
62
|
max_width: Annotated[
|
|
63
63
|
int | None,
|
|
64
64
|
Field(
|
|
65
|
-
description=
|
|
65
|
+
description='Maximum width in pixels (inclusive). Returns formats with width <= this value. Omit for responsive/fluid formats.'
|
|
66
66
|
),
|
|
67
67
|
] = None
|
|
68
68
|
min_height: Annotated[
|
|
69
69
|
int | None,
|
|
70
70
|
Field(
|
|
71
|
-
description=
|
|
71
|
+
description='Minimum height in pixels (inclusive). Returns formats with height >= this value.'
|
|
72
72
|
),
|
|
73
73
|
] = None
|
|
74
74
|
min_width: Annotated[
|
|
75
75
|
int | None,
|
|
76
76
|
Field(
|
|
77
|
-
description=
|
|
77
|
+
description='Minimum width in pixels (inclusive). Returns formats with width >= this value.'
|
|
78
78
|
),
|
|
79
79
|
] = None
|
|
80
80
|
name_search: Annotated[
|
|
81
|
-
str | None, Field(description=
|
|
81
|
+
str | None, Field(description='Search for formats by name (case-insensitive partial match)')
|
|
82
82
|
] = None
|
|
83
83
|
type: Annotated[
|
|
84
84
|
Type | None,
|
|
85
85
|
Field(
|
|
86
|
-
description=
|
|
86
|
+
description='Filter by format type (technical categories with distinct requirements)'
|
|
87
87
|
),
|
|
88
88
|
] = None
|