check_governance
Universal governance check for campaign actions. Both the orchestrator (buyer-side) and the seller call this task. The governance agent infers the check type from the fields present:| Check type | Who calls | Discriminating fields | Purpose |
|---|---|---|---|
| Intent | Orchestrator | tool + payload | Validates the intended action before sending to a seller. No budget committed. |
| Execution | Seller | media_buy_id + planned_delivery | Validates what the seller will actually deliver. Budget is committed later via report_plan_outcome. |
plan_id. On subsequent lifecycle checks, callers include governance_context from the prior response for continuity.
Check types
Intent checks (orchestrator)
The orchestrator callscheck_governance with tool and payload before sending a tool call to a seller. The governance agent evaluates the intended action against the campaign plan.
- Orchestrator decides to call a seller tool (e.g.,
create_media_buy) - Orchestrator calls
check_governancewith the tool name and full payload - If
approved, orchestrator sends the tool call to the seller - If
denied, orchestrator does not send the tool call - If
conditions, orchestrator adjusts the payload and re-callscheck_governance - If the governance agent needs human review, the task goes async and eventually resolves to
approvedordenied
Execution checks (seller)
The seller callscheck_governance with media_buy_id and planned_delivery when processing a request on an account that has governance_agents (set via sync_governance). Execution checks are always binding — if the governance agent denies, the seller must not proceed.
Execution checks cover the full media buy lifecycle through three phases:
| Phase | When | What’s checked |
|---|---|---|
purchase | Before confirming create_media_buy | Budget, geo, channels, flight dates, policies |
modification | Before confirming update_media_buy | Change magnitude, reallocation, new parameters |
delivery | Periodically during delivery | Pacing, spend rate, geo drift, channel distribution |
- Level 1: Purchase only — One call per
create_media_buy. The minimum viable integration. - Level 2: + Modification — One call per
update_media_buy. - Level 3: + Delivery reporting — Periodic calls during active delivery.
Status values
| Status | Meaning | Caller action |
|---|---|---|
approved | Proceed as planned. | Act before expires_at or re-call. |
denied | Do not proceed. | Return error to upstream caller. |
conditions | Approved if caller accepts adjustments. | Apply conditions, then re-call check_governance with adjusted parameters. |
Expiration
expires_at is present when the status is approved or conditions. A lapsed approval is no approval — the caller must re-call check_governance before proceeding.
Conditions
When the status isconditions, the caller MUST re-call check_governance with adjusted parameters before proceeding. Conditions with a required_value are machine-actionable — the caller can programmatically apply the value. Conditions without a required_value are advisory — the caller should interpret the reason and adjust accordingly.
Governance agents SHOULD return denied (not conditions) after 3 unsuccessful re-calls for the same action. This prevents infinite negotiation loops, particularly for seller-side checks where the seller has no visibility into the campaign plan.
Human review
When the governance agent determines that human review is required (e.g., the action exceedsauthority_level thresholds), it handles the escalation internally. The check_governance task goes async — the caller receives standard async task lifecycle statuses (submitted, working) and eventually gets approved or denied once the human acts. The caller does not need special handling for this case beyond supporting async tasks (see task lifecycle).
For committed checks (seller-side), the seller sets a timeout. If the governance agent does not respond within the timeout, the seller treats it as denied and returns an error to the orchestrator. The orchestrator can re-initiate the media buy after the governance agent resolves.
Linking to outcomes
The response includes acheck_id. Use this in report_plan_outcome to link outcomes to the governance check that authorized them.
When the governance agent is unavailable
If the governance agent is configured and the caller cannot reach it (timeout, network error), the caller MUST NOT proceed. Governance is a gate — when the gate is unreachable, the default is halt. The caller SHOULD retry with backoff and report the failure upstream.Delivery cadence
The presence ofnext_check in a response is the signal that the governance agent expects ongoing delivery reporting. The seller SHOULD call no later than the next_check time. The governance agent MAY treat a missed deadline as a finding on the next delivery check.
Request
Intent check (orchestrator checking before sending to seller)
check_governance call, the governance agent extracts what it needs from payload. The response includes an opaque governance_context string that the caller attaches to the protocol envelope and includes on all subsequent governance calls for this media buy.
Execution check — purchase
Execution check — modification
Execution check — delivery
Response
approved (intent check)
create_media_buy to the seller before expires_at.
approved (execution check — purchase with delivery opt-in)
next_check signals that the governance agent expects delivery reporting starting at that time.
approved (execution check — delivery)
next_check.
denied (intent check)
denied (execution check — delivery geo drift)
conditions (execution check — purchase)
check_governance with the updated parameters before proceeding.
conditions (execution check — delivery overpacing)
check_governance immediately. The next_check is set closer than normal so the governance agent can verify the correction.
Fields
Request
| Field | Type | Required | Description |
|---|---|---|---|
plan_id | string | Yes | Campaign governance plan identifier. |
caller | string (URI) | Yes | URL of the agent making the request. |
tool | string | Intent | The AdCP tool being checked. Present on intent checks (orchestrator). The governance agent uses the presence of tool + payload to identify an intent check. |
payload | object | Intent | Full tool arguments as they would be sent to the seller. Present on intent checks. |
governance_context | string | No | Opaque governance context from a prior check_governance response. Include on subsequent lifecycle checks so the governance agent can maintain continuity. |
media_buy_id | string | Execution | Seller’s media buy identifier. Present on execution checks (seller). The governance agent uses the presence of media_buy_id + planned_delivery to identify an execution check. |
phase | enum | Execution | purchase, modification, or delivery. Defaults to purchase. Present on execution checks. |
planned_delivery | object | Execution | What will actually be delivered. Present on execution checks. See planned delivery. |
delivery_metrics | object | Delivery | Actual delivery performance data. Required when phase is delivery. |
delivery_metrics.audience_distribution | object | No | Audience demographic composition relative to a baseline. Used for bias/fairness drift detection. |
delivery_metrics.audience_distribution.baseline | enum | Yes | Reference population: census (national population), platform (platform’s user base), or custom. |
delivery_metrics.audience_distribution.baseline_description | string | No | Description of the baseline when baseline is custom (e.g., “US adults 18+ with broadband access”). |
delivery_metrics.audience_distribution.indices | object | Yes | Index values for the current reporting period. Key format: dimension:value (e.g., age:25-34, gender:female). Value of 1.0 means parity with baseline; above 1.0 means over-indexed; below 1.0 means under-indexed. |
delivery_metrics.audience_distribution.cumulative_indices | object | No | Index values across all reporting periods. Same format as indices. Helps governance agents detect trends vs. one-period noise. |
modification_summary | string | No | Human-readable summary of what changed. SHOULD be present for modification phase. |
Delivery metrics
| Field | Type | Description |
|---|---|---|
reporting_period | object | Reporting window with start and end timestamps (ISO 8601). Required. |
spend | number | Spend during the reporting period. |
cumulative_spend | number | Total spend since the media buy started. |
impressions | integer | Impressions during the reporting period. |
cumulative_impressions | integer | Total impressions since the media buy started. |
geo_distribution | object | Actual geographic distribution. Keys are ISO 3166-1 alpha-2 codes, values are percentages. |
channel_distribution | object | Actual channel distribution. Keys are values from the channels enum, values are percentages. |
pacing | enum | ahead, on_track, or behind. |
audience_distribution | object | Audience composition relative to a baseline. Contains baseline (enum), optional baseline_description (string, for custom baselines), indices (current period), and optional cumulative_indices (all periods). Keys are dimension:value strings, values are index numbers (1.0 means parity). |
Response
| Field | Type | Description |
|---|---|---|
check_id | string | Unique identifier for this governance check. Use in report_plan_outcome to link outcomes. |
status | enum | approved, denied, or conditions. |
plan_id | string | Echoed from request. |
explanation | string | Human-readable explanation of the decision. |
findings | array | Per-category issues found. Present when status is denied or conditions. MAY also be present on approved for informational findings. Each finding has category_id, severity, explanation, and optionally policy_id, details, confidence (0-1), and uncertainty_reason. |
conditions | array | Present when status is conditions. Adjustments the caller must make before re-calling. |
categories_evaluated | string[] | Governance categories evaluated during this check (e.g., budget_authority, geo_compliance, channel_compliance). Useful for verifying which validations ran. |
policies_evaluated | string[] | Registry policy IDs evaluated during this check. |
expires_at | string | Present when status is approved or conditions. The caller must act before this time or re-call. A lapsed approval is no approval. |
next_check | string | When the seller should next call check_governance with delivery metrics. Present when the governance agent expects ongoing delivery reporting. |
governance_context | string | Opaque governance context for this media buy. Present when status is approved or conditions. Attach to the protocol envelope and include on all subsequent governance calls. Only the issuing governance agent interprets this value. |
authority_remaining | object | Buyer-side plan budget authority remaining after this check — not the seller’s allocated budget. Present when status is approved or conditions for execution checks. Contains budget_remaining (number), currency (string), and budget_used_pct (number, 0-100). Orchestrators use this to track plan-level spend against the media plan’s total authority. |
Error codes
| Code | Recovery | Description |
|---|---|---|
PLAN_NOT_FOUND | correctable | No plan with this ID. The buyer may not have synced the plan yet. |
AMBIGUOUS_CHECK_TYPE | correctable | Request contains both intent fields (tool + payload) and execution fields (media_buy_id + planned_delivery). Send one set or the other. |
CAMPAIGN_SUSPENDED | correctable | Campaign governance is suspended pending human review. |
SELLER_NOT_RECOGNIZED | correctable | The caller URL is not in the plan’s approved_sellers list. |
Related tasks
sync_plans— The plan this governance check validates againstreport_plan_outcome— Report what happened after the action was confirmedget_plan_audit_logs— View plan state and audit trail