Skip to main content

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 typeWho callsDiscriminating fieldsPurpose
IntentOrchestratortool + payloadValidates the intended action before sending to a seller. No budget committed.
ExecutionSellermedia_buy_id + planned_deliveryValidates what the seller will actually deliver. Budget is committed later via report_plan_outcome.
The governance agent maintains all state. Callers do not chain check IDs or track conversation history — they post the action, and the governance agent correlates by plan_id. On subsequent lifecycle checks, callers include governance_context from the prior response for continuity.

Check types

Intent checks (orchestrator)

The orchestrator calls check_governance with tool and payload before sending a tool call to a seller. The governance agent evaluates the intended action against the campaign plan.
  1. Orchestrator decides to call a seller tool (e.g., create_media_buy)
  2. Orchestrator calls check_governance with the tool name and full payload
  3. If approved, orchestrator sends the tool call to the seller
  4. If denied, orchestrator does not send the tool call
  5. If conditions, orchestrator adjusts the payload and re-calls check_governance
  6. If the governance agent needs human review, the task goes async and eventually resolves to approved or denied

Execution checks (seller)

The seller calls check_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:
PhaseWhenWhat’s checked
purchaseBefore confirming create_media_buyBudget, geo, channels, flight dates, policies
modificationBefore confirming update_media_buyChange magnitude, reallocation, new parameters
deliveryPeriodically during deliveryPacing, spend rate, geo drift, channel distribution
Sellers can adopt committed governance checks incrementally:
  • 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

StatusMeaningCaller action
approvedProceed as planned.Act before expires_at or re-call.
deniedDo not proceed.Return error to upstream caller.
conditionsApproved 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 is conditions, 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 exceeds authority_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 a check_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 of next_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)

{
  "tool": "check_governance",
  "arguments": {
    "plan_id": "plan_q1_2026_launch",
    "caller": "https://orchestrator.example.com",
    "tool": "create_media_buy",
    "payload": {
      "product_id": "premium_video_300k",
      "budget": 150000,
      "currency": "USD",
      "geo": { "countries": ["US"] },
      "channels": ["olv"],
      "flight": {
        "start": "2026-03-15T00:00:00Z",
        "end": "2026-06-15T00:00:00Z"
      }
    }
  }
}
On the first 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

{
  "tool": "check_governance",
  "arguments": {
    "plan_id": "plan_q1_2026_launch",
    "caller": "https://seller.example.com",
    "governance_context": "gc_from_buyer_envelope",
    "media_buy_id": "mb_seller_456",
    "phase": "purchase",
    "planned_delivery": {
      "geo": { "countries": ["US"] },
      "channels": ["olv"],
      "start_time": "2026-03-15T00:00:00Z",
      "end_time": "2026-06-15T00:00:00Z",
      "total_budget": 150000,
      "currency": "USD",
      "frequency_cap": { "max_impressions": 3, "per": "user", "window": { "interval": 1, "unit": "days" } },
      "audience_summary": "Adults 25-54, US, premium video inventory",
      "enforced_policies": ["us_coppa"]
    }
  }
}

Execution check — modification

{
  "tool": "check_governance",
  "arguments": {
    "plan_id": "plan_q1_2026_launch",
    "caller": "https://seller.example.com",
    "governance_context": "gc_from_buyer_envelope",
    "media_buy_id": "mb_seller_456",
    "phase": "modification",
    "modification_summary": "Budget increase from $150,000 to $200,000 and flight extension to 2026-07-15.",
    "planned_delivery": {
      "geo": { "countries": ["US"] },
      "channels": ["olv"],
      "start_time": "2026-03-15T00:00:00Z",
      "end_time": "2026-07-15T00:00:00Z",
      "total_budget": 200000,
      "currency": "USD",
      "frequency_cap": { "max_impressions": 3, "per": "user", "window": { "interval": 1, "unit": "days" } },
      "audience_summary": "Adults 25-54, US, premium video inventory",
      "enforced_policies": ["us_coppa"]
    }
  }
}

Execution check — delivery

{
  "tool": "check_governance",
  "arguments": {
    "plan_id": "plan_q1_2026_launch",
    "caller": "https://seller.example.com",
    "governance_context": "gc_from_buyer_envelope",
    "media_buy_id": "mb_seller_456",
    "phase": "delivery",
    "planned_delivery": {
      "geo": { "countries": ["US"] },
      "channels": ["olv"],
      "start_time": "2026-03-15T00:00:00Z",
      "end_time": "2026-06-15T00:00:00Z",
      "total_budget": 150000,
      "currency": "USD",
      "frequency_cap": { "max_impressions": 3, "per": "user", "window": { "interval": 1, "unit": "days" } },
      "audience_summary": "Adults 25-54, US, premium video inventory",
      "enforced_policies": ["us_coppa"]
    },
    "delivery_metrics": {
      "reporting_period": {
        "start": "2026-03-15T00:00:00Z",
        "end": "2026-03-22T00:00:00Z"
      },
      "spend": 12500,
      "cumulative_spend": 12500,
      "impressions": 850000,
      "cumulative_impressions": 850000,
      "geo_distribution": { "US": 100 },
      "channel_distribution": { "olv": 100 },
      "pacing": "on_track",
      "audience_distribution": {
        "baseline": "platform",
        "indices": {
          "age:18-24": 0.8,
          "age:25-34": 1.4,
          "age:35-44": 1.3,
          "age:45-54": 1.1,
          "gender:female": 1.05,
          "gender:male": 0.95
        },
        "cumulative_indices": {
          "age:18-24": 0.85,
          "age:25-34": 1.35,
          "age:35-44": 1.25,
          "age:45-54": 1.1,
          "gender:female": 1.03,
          "gender:male": 0.97
        }
      }
    }
  }
}

Response

approved (intent check)

{
  "check_id": "chk_001",
  "status": "approved",
  "plan_id": "plan_q1_2026_launch",
  "explanation": "Proposed create_media_buy is within plan parameters. Budget: $150,000 of $500,000 plan total. Geo: US (within plan). Channel: OLV (within 40-70% target range).",
  "categories_evaluated": ["budget_authority", "geo_compliance", "channel_compliance", "flight_compliance", "delegation_authority"],
  "policies_evaluated": ["us_coppa", "alcohol_advertising"],
  "expires_at": "2026-03-15T01:00:00Z"
}
The orchestrator proceeds to send the create_media_buy to the seller before expires_at.

approved (execution check — purchase with delivery opt-in)

{
  "check_id": "chk_002",
  "status": "approved",
  "plan_id": "plan_q1_2026_launch",
  "explanation": "Planned delivery is within plan parameters. Budget: $150,000 of $500,000 plan total. Geo: US (within plan). Channel: OLV (within 40-70% target range).",
  "expires_at": "2026-03-15T01:00:00Z",
  "next_check": "2026-03-22T00:00:00Z"
}
The seller proceeds with the media buy. The presence of next_check signals that the governance agent expects delivery reporting starting at that time.

approved (execution check — delivery)

{
  "check_id": "chk_003",
  "status": "approved",
  "plan_id": "plan_q1_2026_launch",
  "explanation": "Delivery on track. Week 1 spend: $12,500 of $150,000 (8.3%). Pacing is on target for 13-week flight. Geo and channel distribution match plan parameters.",
  "next_check": "2026-03-29T00:00:00Z"
}
The seller continues delivery and schedules the next governance check for next_check.

denied (intent check)

{
  "check_id": "chk_004",
  "status": "denied",
  "plan_id": "plan_q1_2026_launch",
  "explanation": "Proposed media buy targets CA (Canada) which is not within the plan's geography.",
  "findings": [
    {
      "category_id": "strategic_alignment",
      "severity": "critical",
      "explanation": "Geo targeting includes CA but plan only covers US.",
      "details": {
        "plan_countries": ["US"],
        "payload_countries": ["US", "CA"]
      }
    }
  ]
}
The orchestrator MUST NOT send the tool call to the seller.

denied (execution check — delivery geo drift)

{
  "check_id": "chk_005",
  "status": "denied",
  "plan_id": "plan_q1_2026_launch",
  "explanation": "Delivery has drifted outside plan parameters. 12% of impressions delivered in CA (Canada) which is not within the plan's geography.",
  "findings": [
    {
      "category_id": "strategic_alignment",
      "severity": "critical",
      "confidence": 0.98,
      "explanation": "Geo distribution shows 12% delivery in CA, but plan only covers US.",
      "details": {
        "plan_countries": ["US"],
        "actual_distribution": { "US": 88, "CA": 12 }
      }
    }
  ]
}
The seller MUST pause delivery immediately and correct the geo targeting before resuming.

conditions (execution check — purchase)

{
  "check_id": "chk_006",
  "status": "conditions",
  "plan_id": "plan_q1_2026_launch",
  "explanation": "Budget approved but frequency cap must be applied per brand policy.",
  "conditions": [
    {
      "field": "planned_delivery.frequency_cap",
      "required_value": { "max_impressions": 5, "per": "user", "window": { "interval": 1, "unit": "days" } },
      "reason": "Brand policy requires daily frequency cap of 5 or fewer impressions per user."
    }
  ],
  "expires_at": "2026-03-15T01:00:00Z"
}
The seller MUST adjust its planned delivery, then re-call check_governance with the updated parameters before proceeding.

conditions (execution check — delivery overpacing)

{
  "check_id": "chk_007",
  "status": "conditions",
  "plan_id": "plan_q1_2026_launch",
  "explanation": "Delivery is pacing 40% ahead of schedule. Cumulative spend of $42,000 after 2 weeks exceeds expected $23,000 for this point in the flight.",
  "conditions": [
    {
      "field": "pacing",
      "reason": "Reduce daily spend rate to align with the planned flight duration. At current pace, budget will be exhausted by week 7 of 13."
    }
  ],
  "next_check": "2026-03-31T00:00:00Z"
}
The seller MUST adjust pacing and re-call check_governance immediately. The next_check is set closer than normal so the governance agent can verify the correction.

Fields

Request

FieldTypeRequiredDescription
plan_idstringYesCampaign governance plan identifier.
callerstring (URI)YesURL of the agent making the request.
toolstringIntentThe AdCP tool being checked. Present on intent checks (orchestrator). The governance agent uses the presence of tool + payload to identify an intent check.
payloadobjectIntentFull tool arguments as they would be sent to the seller. Present on intent checks.
governance_contextstringNoOpaque governance context from a prior check_governance response. Include on subsequent lifecycle checks so the governance agent can maintain continuity.
media_buy_idstringExecutionSeller’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.
phaseenumExecutionpurchase, modification, or delivery. Defaults to purchase. Present on execution checks.
planned_deliveryobjectExecutionWhat will actually be delivered. Present on execution checks. See planned delivery.
delivery_metricsobjectDeliveryActual delivery performance data. Required when phase is delivery.
delivery_metrics.audience_distributionobjectNoAudience demographic composition relative to a baseline. Used for bias/fairness drift detection.
delivery_metrics.audience_distribution.baselineenumYesReference population: census (national population), platform (platform’s user base), or custom.
delivery_metrics.audience_distribution.baseline_descriptionstringNoDescription of the baseline when baseline is custom (e.g., “US adults 18+ with broadband access”).
delivery_metrics.audience_distribution.indicesobjectYesIndex 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_indicesobjectNoIndex values across all reporting periods. Same format as indices. Helps governance agents detect trends vs. one-period noise.
modification_summarystringNoHuman-readable summary of what changed. SHOULD be present for modification phase.

Delivery metrics

FieldTypeDescription
reporting_periodobjectReporting window with start and end timestamps (ISO 8601). Required.
spendnumberSpend during the reporting period.
cumulative_spendnumberTotal spend since the media buy started.
impressionsintegerImpressions during the reporting period.
cumulative_impressionsintegerTotal impressions since the media buy started.
geo_distributionobjectActual geographic distribution. Keys are ISO 3166-1 alpha-2 codes, values are percentages.
channel_distributionobjectActual channel distribution. Keys are values from the channels enum, values are percentages.
pacingenumahead, on_track, or behind.
audience_distributionobjectAudience 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

FieldTypeDescription
check_idstringUnique identifier for this governance check. Use in report_plan_outcome to link outcomes.
statusenumapproved, denied, or conditions.
plan_idstringEchoed from request.
explanationstringHuman-readable explanation of the decision.
findingsarrayPer-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.
conditionsarrayPresent when status is conditions. Adjustments the caller must make before re-calling.
categories_evaluatedstring[]Governance categories evaluated during this check (e.g., budget_authority, geo_compliance, channel_compliance). Useful for verifying which validations ran.
policies_evaluatedstring[]Registry policy IDs evaluated during this check.
expires_atstringPresent when status is approved or conditions. The caller must act before this time or re-call. A lapsed approval is no approval.
next_checkstringWhen the seller should next call check_governance with delivery metrics. Present when the governance agent expects ongoing delivery reporting.
governance_contextstringOpaque 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_remainingobjectBuyer-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

CodeRecoveryDescription
PLAN_NOT_FOUNDcorrectableNo plan with this ID. The buyer may not have synced the plan yet.
AMBIGUOUS_CHECK_TYPEcorrectableRequest contains both intent fields (tool + payload) and execution fields (media_buy_id + planned_delivery). Send one set or the other.
CAMPAIGN_SUSPENDEDcorrectableCampaign governance is suspended pending human review.
SELLER_NOT_RECOGNIZEDcorrectableThe caller URL is not in the plan’s approved_sellers list.