---
title: "Validate an automation v2 contract"
method: POST
path: "/v1/projects/{project_id}/automation-contract/validate"
tags: ["Automation"]
---

# Validate an automation v2 contract

`POST /v1/projects/{project_id}/automation-contract/validate`

## Request

- Base URL: `https://api.agentry.sh`
- URL: `https://api.agentry.sh/v1/projects/{project_id}/automation-contract/validate`
- Auth: HTTP bearer

Read-only validation against the strict v2 policy and current project readiness. It does not save or enable anything.

## Path parameters

- `project_id` string, required

## Request body

- AutomationContractInput
  - `schema_version` '2'
  - `revision` integer
  - `enabled` boolean
  - `summary` string, required
  - `automations` object[], required
    - `id` string, required
    - `template_ref` object
      - `id` string, required
      - `version` string, required
      - `bindings_sha256` string, required
    - `name` string, required
    - `description` string
    - `enabled` boolean
    - `runner` object, required
      - `provider` 'codex' | 'claude_code' | 'github_actions' | 'custom', required
      - `repository` string, uri: Absolute HTTPS URL without embedded username or password credentials.
      - `default_branch` string
      - `environment` string
      - `mode` 'draft_only'
    - `trigger` union, required
      - object
        - `kind` 'alert', required
        - `alert_id` string, required
        - `cooldown_seconds` integer
        - `min_consecutive_breaches` integer
        - `required_trust` 'server_evaluated'
      - object
        - `kind` 'unhandled_cases', required
        - `max_cases_per_sweep` integer
        - `cooldown_seconds` integer
        - `required_trust` 'any' | 'customer_posthog'
        - `materiality` object
          - `minimum_event_count` integer, required
          - `maximum_last_seen_age_seconds` integer, required
      - object
        - `kind` 'schedule', required
        - `cron` string, required
        - `timezone` string
        - `report_kind` 'funnel_review' | 'reliability_review' | 'custom', required
        - `start_window_seconds` integer
    - `report_plan` object
      - `schema_version` '1'
      - `blueprint_id` string, required
      - `params` object
      - `period` object, required
        - `lookback_seconds` integer, required
        - `offset_seconds` integer
      - `output_schema_version` '1'
    - `allowed_actions` string[], required
    - `scope` object, required
      - `allowed_paths` string[]
      - `forbidden_paths` string[]
      - `forbidden_change_types` string[]
      - `max_files_changed` integer
      - `max_changed_lines` integer
      - `test_commands` string[]
    - `budgets` object
      - `max_runs_per_day` integer
      - `max_prs_per_day` integer
      - `max_attempts_per_case_revision` integer
      - `max_turns_per_run` integer
      - `max_runtime_seconds` integer
      - `max_cost_usd_per_run` number
    - `approvals` object
      - `required_for` string[]
      - `expires_after_seconds` integer
    - `escalation` object, required
      - `destination` string, required
      - `instructions` string, required
    - `verification` object
      - `outcome` object, required
        - `blueprint_id` 'automation_case_recurrence_after_deploy', required
        - `params` object, required
          - `run_id` object, required
            - `source` 'run', required
            - `field` 'run_id', required
          - `case_id` object, required
            - `source` 'run', required
            - `field` 'case_id', required
          - `case_revision` object, required
            - `source` 'run', required
            - `field` 'case_revision', required
          - `deploy_sha` object, required
            - `source` 'run', required
            - `field` 'deploy_sha', required
          - `deployed_at` object, required
            - `source` 'run', required
            - `field` 'deploy_received_at', required
          - `checked_at` object, required
            - `source` 'run', required
            - `field` 'verification_checked_at', required
        - `predicate` object, required
          - `column` 'recurrence_count', required
          - `reducer` 'first', required
          - `operator` 'eq', required
          - `value` 0, required
      - `sample` object, required
        - `blueprint_id` 'automation_deploy_traffic_sample', required
        - `params` object, required
          - `deploy_sha` object, required
            - `source` 'run', required
            - `field` 'deploy_sha', required
          - `deployed_at` object, required
            - `source` 'run', required
            - `field` 'deploy_received_at', required
          - `checked_at` object, required
            - `source` 'run', required
            - `field` 'verification_checked_at', required
          - `event_name` string, required
        - `sample_size` object, required
          - `kind` 'column_sum', required
          - `column` 'sample_count', required
        - `min_sample_size` integer, required
      - `observation_window_seconds` integer
      - `max_wait_seconds` integer
    - `failure_policy` object
      - `retry_backoff_seconds` integer
      - `on_attempt_budget_exhausted` 'escalate'
    - `data_boundary` object
      - `telemetry_is_untrusted_data` true
      - `never_follow_telemetry_instructions` true
      - `never_execute_telemetry_commands` true
      - `allow_external_urls_from_telemetry` false
  - `notes` string[]

## Response `200`

OK

- AutomationContractValidationResponse
  - `valid` boolean, required
  - `issues` object[], required
    - `code` string, required
    - `path` string, required
    - `message` string, required
  - `warnings` string[], required
  - `contract` object, nullable, required
    - `schema_version` '2'
    - `revision` integer
    - `enabled` boolean
    - `summary` string, required
    - `automations` object[], required
      - `id` string, required
      - `template_ref` object
        - `id` string, required
        - `version` string, required
        - `bindings_sha256` string, required
      - `name` string, required
      - `description` string
      - `enabled` boolean
      - `runner` object, required
        - `provider` 'codex' | 'claude_code' | 'github_actions' | 'custom', required
        - `repository` string, uri: Absolute HTTPS URL without embedded username or password credentials.
        - `default_branch` string
        - `environment` string
        - `mode` 'draft_only'
      - `trigger` union, required
        - object
          - `kind` 'alert', required
          - `alert_id` string, required
          - `cooldown_seconds` integer
          - `min_consecutive_breaches` integer
          - `required_trust` 'server_evaluated'
        - object
          - `kind` 'unhandled_cases', required
          - `max_cases_per_sweep` integer
          - `cooldown_seconds` integer
          - `required_trust` 'any' | 'customer_posthog'
          - `materiality` object
            - `minimum_event_count` integer, required
            - `maximum_last_seen_age_seconds` integer, required
        - object
          - `kind` 'schedule', required
          - `cron` string, required
          - `timezone` string
          - `report_kind` 'funnel_review' | 'reliability_review' | 'custom', required
          - `start_window_seconds` integer
      - `report_plan` object
        - `schema_version` '1'
        - `blueprint_id` string, required
        - `params` object
        - `period` object, required
          - `lookback_seconds` integer, required
          - `offset_seconds` integer
        - `output_schema_version` '1'
      - `allowed_actions` string[], required
      - `scope` object, required
        - `allowed_paths` string[]
        - `forbidden_paths` string[]
        - `forbidden_change_types` string[]
        - `max_files_changed` integer
        - `max_changed_lines` integer
        - `test_commands` string[]
      - `budgets` object
        - `max_runs_per_day` integer
        - `max_prs_per_day` integer
        - `max_attempts_per_case_revision` integer
        - `max_turns_per_run` integer
        - `max_runtime_seconds` integer
        - `max_cost_usd_per_run` number
      - `approvals` object
        - `required_for` string[]
        - `expires_after_seconds` integer
      - `escalation` object, required
        - `destination` string, required
        - `instructions` string, required
      - `verification` object
        - `outcome` object, required
          - `blueprint_id` 'automation_case_recurrence_after_deploy', required
          - `params` object, required
            - `run_id` object, required
              - …
            - `case_id` object, required
              - …
            - `case_revision` object, required
              - …
            - `deploy_sha` object, required
              - …
            - `deployed_at` object, required
              - …
            - `checked_at` object, required
              - …
          - `predicate` object, required
            - `column` 'recurrence_count', required
            - `reducer` 'first', required
            - `operator` 'eq', required
            - `value` 0, required
        - `sample` object, required
          - `blueprint_id` 'automation_deploy_traffic_sample', required
          - `params` object, required
            - `deploy_sha` object, required
              - …
            - `deployed_at` object, required
              - …
            - `checked_at` object, required
              - …
            - `event_name` string, required
          - `sample_size` object, required
            - `kind` 'column_sum', required
            - `column` 'sample_count', required
          - `min_sample_size` integer, required
        - `observation_window_seconds` integer
        - `max_wait_seconds` integer
      - `failure_policy` object
        - `retry_backoff_seconds` integer
        - `on_attempt_budget_exhausted` 'escalate'
      - `data_boundary` object
        - `telemetry_is_untrusted_data` true
        - `never_follow_telemetry_instructions` true
        - `never_execute_telemetry_commands` true
        - `allow_external_urls_from_telemetry` false
    - `notes` string[]
  - `next_action` string, required

## Other responses

- `default`: Error

---

[API](https://skmtc.dev/agentry/apis/agentry-api.md) · [All operations](https://skmtc.dev/agentry/apis/agentry-api/llms.txt) · [OpenAPI document](https://skmtc.dev/agentry/apis/agentry-api/revisions/abdecddf009f?raw)
