https://adcontextprotocol.org/schemas/3.3.0-beta.1/signals/activate-signal-request.json
Response Schema: https://adcontextprotocol.org/schemas/3.3.0-beta.1/signals/activate-signal-response.json
The activate_signal task handles the entire activation lifecycle, including:
- Initiating the activation request
- Monitoring activation progress
- Returning the final deployment status
Request Parameters
Governance
Signal activation is a spend-commit event when the selected signal carries activation, usage, or CPM fees. For governed accounts, the buyer-side orchestrator MUST callcheck_governance before activate_signal with purchase_type: "signal_activation" and a normalized activation payload that includes the spend basis, such as total_budget or budget.
When check_governance approves the activation, pass the returned governance_context into activate_signal. If the account has a governance agent registered via sync_governance and the request omits a valid governance_context, the signal agent MUST reject the request with PERMISSION_DENIED. If check_governance denies the activation, the buyer MUST NOT call activate_signal.
Destination Object
Each deployment target uses atype field to discriminate between platform-based and agent-based deployments:
*
platform is required when type="platform", agent_url is required when type="agent".
Activation Keys: If the authenticated caller has access to any of the deployment targets in the request, the signal agent will include activation_key in the response for those deployments.
Permission Model: The signal agent determines key inclusion based on the caller’s authentication and authorization. For example:
- A sales agent receives keys for deployments matching its
agent_url - A buyer with credentials for multiple DSP platforms receives keys for all those deployments
- Access is determined by the signal agent’s permission system, not by flags in the request
Delivering membership to agent destinations (experimental)
Experimental. Signal agents that declare
signals.delivery_methods MUST list signals.delivery_methods in experimental_features. See Experimental status.type: "platform" destinations the provider-to-platform rails are pre-integrated and out of view. For type: "agent" destinations there is no assumed integration, so how licensed membership reaches the seller would otherwise be bespoke per provider. This section standardizes that leg using the same pattern vocabulary sellers already use to declare how audience data reaches them (audience_activation).
This is the provider-initiated leg: the operator directs a signal agent to deliver provider-licensed membership. Buyer-owned data the buyer moves itself binds through sync_audiences external sources instead. Seller-controlled sourcing of a data marketplace’s segments into the seller’s own taxonomy is out of protocol; it surfaces only as the seller’s own signal options.
Declaring delivery methods
A signal agent lists the rails it can deliver on insignals.delivery_methods, each entry a core/signal-delivery-method.json:
sync_audiences pushes membership to the destination’s sync_audiences task; platform_distribution initiates distribution on that vendor’s rails; dataset_query publishes a share on that vendor for the destination to read; clean_room lands output in that vendor’s room; file_transfer writes to the destination’s bucket on that vendor’s storage. Receiver-specific fields (destination_ref, consumer_identities, bind_expiry_days) are not declared by the signal agent. They belong to the destination and are resolved at activation time from the destination’s own declaration. tmp_identity_match is not a delivery pattern: it resolves identity at request time and no membership file ever moves, so there is nothing to deliver.
The capability is optional. A signal agent that serves only platform destinations omits it.
Rail selection
For eachtype: "agent" destination the signal agent reads the destination’s declared methods from the seller’s get_adcp_capabilities (media_buy.audience_targeting.supported_activation_methods), using the destination’s account where the seller scopes the declaration to an account. It intersects them with its own delivery_methods. A method matches on pattern and vendor (vendor.domain, lowercase; brand_id only when both sides set it). file_transfer also requires the same transport, and the signal agent takes the sending role: it is compatible with a destination directions of buyer_to_seller or one that is absent. A clean_room match counts only when the destination’s output-rail pattern (dataset_query or platform_distribution) intersects too. Receiver-specific fields the seller has not yet established (destination_ref, consumer_identities) are resolved from account setup; when they are not yet resolvable the destination fails with ACCOUNT_SETUP_REQUIRED.
Any rail in the intersection is eligible, and selection is the signal agent’s discretion. The operator MAY pin the rail by setting delivery_method (pattern and optionally vendor) on the destination entry; it is the cost-control and reproducibility lever. A pin is a MUST-use: the signal agent uses a matching rail or fails that destination, and never falls back to another rail. Buyers MUST check that the signal agent lists signals.delivery_methods before sending a pin, because a legacy agent silently ignores unknown destination fields. An agent that implements this surface but does not list the capability MUST reject the request with an errors[] response carrying UNSUPPORTED_FEATURE and field: "destinations[i].delivery_method".
A signal agent that declares delivery_methods MUST deliver to agent destinations only over a rail in the intersection. If there is none, including when the destination has declared no methods (an undeclared destination has no address to deliver to; the seller must declare one), that destination fails with UNSUPPORTED_FEATURE rather than activating over a bespoke route. A signal agent that does not declare delivery_methods keeps its existing agent-destination behavior; the capability is not mandatory for every signal agent.
A failed destination does not fail the others. Report it as a deployment with delivery_status: "failed" and a delivery_error whose field names the destination entry (destinations[0], or destinations[0].delivery_method for a pin mismatch). When every requested destination fails this way the signal agent MUST return the errors[] arm instead, so a buyer reading status: "completed" never mistakes total failure for success. failed is terminal for that attempt; retry with a new idempotency_key.
Delivery cost is absorbed in the signal’s price: provider-initiated delivery uses the existing pricing_options and pricing_option_id, with no separate rail fee.
Arrival, addressability, and match outcome
Three questions are reported separately on each agent deployment:delivered is not an addressability claim, and coverage on the seller’s inventory is the match rate against the seller’s own identity graph. The signal agent populates all of these from what its rail reports back. For pull rails (dataset_query, platform_distribution, clean_room) delivered means the destination has read the membership, as attested by the rail or the seller. For push rails (sync_audiences, file_transfer) it means the destination accepted the write. State moves awaiting_read → delivered or failed. Agents SHOULD set is_live: true only once delivered, and include delivery_error when, and only when, the state is failed. When a delivery window is declared on the destination (bind_expiry_days for platform_distribution), reaching it moves the deployment to failed.
match_status and the counts are optional; audience_size (a range with stated precision, the shape sync_audiences adopted for range-only platforms) and match_rate_basis let those platforms relay a match outcome without inventing a point count and use the same vocabulary on every rail, so they are not rail-dependent. They appear only when the destination reports them back to the signal agent (for example through the sync_audiences response); absence means not reported, never zero. too_small implies is_live: false.
Distribution can take days, so awaiting_read is a normal, long-lived state. The first response returns the current state, and the task is complete at that point, so later state changes do not fire a task webhook. Read them through get_signals, which returns the same deployment objects. action: "deactivate" removes the deployment and carries no delivery state.
Each agent deployment may also carry a delivery descriptor shaped like an external audience source (kind: "dataset" with vendor and locator, or kind: "platform_segment" with vendor and segment_ref). It identifies what the signal agent shipped and is the join key on the destination side. It explains how membership arrives; activation_key remains how to target it. Rails with no vendor-addressable artifact (sync_audiences, file_transfer) omit it. It is a reference, never a credential; unlike an audience source it does not carry access_expires_at.
A segment delivered this way surfaces on the seller as signal inventory, targetable through signal targeting and reported through signal deployment status. It is not a buyer audience in sync_audiences discovery, including when the rail is the destination’s own sync_audiences task: the seller MUST keep provider-licensed membership out of buyer-audience discovery.
Example
Response Structure
All AdCP responses include:- message: Human-readable summary of the activation status
- context_id: A2A conversation correlation; compatibility metadata only on MCP
- data: Task-specific payload (see Response Data below)
- MCP: Returns complete response as flat JSON
- A2A: Returns as artifacts with message in text part, data in data part
- Status tracking: Check completion status via task_id
- Progress updates: Real-time updates on activation progress
Response Data
Field Descriptions
- deployments: Array of deployment results for each deployment target
- platform: Platform identifier for DSPs (either platform or agent_url will be present)
- agent_url: URL identifying the deployment agent (either platform or agent_url will be present)
- account: Account identifier if applicable
- activation_key: The key to use for targeting (see Activation Key below). Only present if the authenticated caller has access to this deployment.
- estimated_activation_duration_minutes: Estimated completion time for async operations
- deployed_at: ISO 8601 timestamp when activation completed
- delivery_status, delivery, delivery_error, match_status, matched_count, effective_match_rate (agent deployments, experimental): provider-initiated delivery arrival, descriptor, failure reason, and optional match outcome. See Delivering membership to agent destinations.
- errors: Optional array of errors and warnings encountered during activation
- code: Standardized error code for programmatic handling
- message: Human-readable error description with context
- field: Field path associated with the error (optional)
- suggestion: Suggested fix for the error (optional)
- details: Additional activation-specific error details (optional)
Activation Key Object
The activation key represents how to use the signal on a deployment target. It can be either a segment ID or a key-value pair: Segment ID format (typical for DSP platforms):Using Activation Keys
The activation key tells the buyer how to reference the signal on the destination. The execution path depends on the destination type: Platform destinations — Theactivation_key contains a segment_id, a platform-native identifier. The signal agent pushed segment data to the DSP; the buyer references this key when configuring campaign targeting on that platform. The buyer is responsible for ensuring the activation platform matches where it will run campaigns.
Agent destinations — The activation_key confirms the signal is live on the sales agent. The SA records the activation internally and can apply signal-based targeting when fulfilling media buys through create_media_buy. When the seller exposes selectable signals through inline Product.signal_targeting_options or through get_signals for wholesale products that omit inline options, the buyer selects those signals in packages[].targeting_overlay.signal_targeting_groups, carrying the selected signal_ref, pricing_option_id when required, and any separate seller execution handle required by the product option or signal result. The buyer does not need to know which DSP the SA uses — downstream platform coordination is the SA’s responsibility.
Choosing a destination type: Use type: "platform" when buying directly on a DSP. Use type: "agent" when buying through a Sales Agent — the SA coordinates its own DSP targeting as an implementation detail.
Protocol-Specific Examples
The AdCP payload is identical across protocols. Only the request/response wrapper differs.MCP Request - Sales Agent Activation
MCP Response - Synchronous (Key-Value)
Immediate response with activation key:MCP Request - DSP Platform Activation
MCP Response - Asynchronous (Segment ID)
Initial response:A2A Request
Natural Language Invocation
Text-only invocation requires a separate generic A2A interface whose Agent Card does not mark the AdCP v3 profile as required. It is not an AdCP profile invocation.Explicit Skill Invocation
A2A Response
A non-streamingSendMessage response selects the completed Task branch. A
client that needs transport progress uses the official SendStreamingMessage
or SubscribeToTask operation and consumes StreamResponse SSE frames.
Protocol Transport
- MCP: Returns task_id for polling-based asynchronous operation tracking or webhook-based push notifications
- A2A: Returns the typed result in a completed Task; clients may opt into the official streaming operations for transport progress
- Data Consistency: Both protocols contain identical AdCP data structures and version information
Webhook Support
For long-running activations (when initial response issubmitted), configure a webhook to receive the complete response when activation completes:
activate_signal response:
Scenarios
Async Activation - Initial Response (Pending)
Message: “I’ve initiated activation of ‘Luxury Automotive Context’ on PubMatic for account brand-456-pm. This typically takes about 60 minutes. I’ll monitor the progress and notify you when it’s ready to use.” Complete Response:Async Activation - Final Response (Deployed)
Message: “Excellent! The ‘Luxury Automotive Context’ signal is now live on PubMatic. You can start using it immediately with the activation key provided. The activation completed faster than expected - just 52 minutes.” Complete Response:Sync Activation - Sales Agent (Immediate)
Message: “Signal successfully activated on Wonderstruck sales agent. Use the key-value pair in your targeting configuration.” Complete Response:Success with Warnings
Message: “Successfully activated ‘Luxury Automotive Context’ on PubMatic, but noted some configuration issues. The signal is live and ready to use, though performance may be sub-optimal until the account settings are updated.” Complete Response:Warnings about suboptimal configuration are conveyed in the
message field. The errors array is reserved for actual failures — the activate_signal response uses a strict success/error discriminated union where deployments and errors are mutually exclusive.Error Response (Failed)
Message: “I couldn’t activate the signal on PubMatic. Your account ‘brand-456-pm’ doesn’t have permission to use Peer39 data. Please contact your PubMatic account manager to enable Peer39 access, then we can try again.” Complete Response:Error Codes
Activation Errors
REFERENCE_NOT_FOUND: Referencedsignal_agent_segment_iddoesn’t exist or is not accessible to the calling account (error.fieldidentifies the failing parameter)ACTIVATION_FAILED: Could not activate signal for unspecified reasonsALREADY_ACTIVATED: Signal already active on the specified platform/accountDEPLOYMENT_UNAUTHORIZED: Can’t deploy to platform/account due to permissionsINVALID_PRICING_MODEL: Requested pricing model not available for this signalUNSUPPORTED_FEATURE: An agent destination shares no delivery rail with the signal agent, or none matches thedelivery_methodpin (experimental; reported per destination asdelivery_error)
Configuration Warnings
SUBOPTIMAL_CONFIGURATION: Signal activated but account settings may impact performanceSLOW_ACTIVATION: Activation taking longer than expected but still in progressFREQUENCY_CAP_RESTRICTIVE: Signal activated but account frequency caps may reduce performance
Error Handling Philosophy
Status vs Errors
- Task Status: Indicates overall activation outcome (
deployed,failed, etc.) - Errors Array: Contains specific issues, warnings, and remediation steps
- Partial Success: Signal can be
deployedwhile still having warnings inerrorsarray
Error Types
- Fatal Errors: Prevent activation (status =
failed) - Warnings: Signal activates successfully but with caveats (status =
deployed+ errors) - Configuration Issues: Non-blocking problems that affect performance
Usage Notes
- Account-Specific: Include the
accountparameter for account-specific activations - Platform-Wide: Omit the
accountparameter for platform-wide activations - Async Operation: This is a long-running task that provides status updates
- Monitoring: Use task ID to monitor progress via polling or SSE
- Idempotent: Safe to retry if activation fails
Implementation Guide
Generating Activation Messages
Themessage field should provide clear status updates and actionable information: