{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://compo.kluchna24.ru/poster_engine/external_api_policy.schema.json",
  "title": "COMPO External API Policy",
  "type": "object",
  "additionalProperties": false,
  "required": ["policy_id", "auth", "tenant_isolation", "quotas", "idempotency", "secrets_excluded"],
  "properties": {
    "policy_id": {"type": "string", "pattern": "^api-policy-[a-z0-9-]+$"},
    "auth": {"$ref": "#/$defs/auth"},
    "tenant_isolation": {"$ref": "#/$defs/tenant"},
    "quotas": {"$ref": "#/$defs/quotas"},
    "idempotency": {"$ref": "#/$defs/idempotency"},
    "secrets_excluded": {"const": true}
  },
  "$defs": {
    "auth": {"type": "object", "additionalProperties": false, "required": ["scheme", "secret_transport", "rotation_required"], "properties": {"scheme": {"type": "string", "enum": ["owner_session", "api_key_reference", "oauth2_reference"]}, "secret_transport": {"type": "string", "enum": ["header", "server_side_secret_store", "external_identity_provider"]}, "rotation_required": {"type": "boolean"}}},
    "tenant": {"type": "object", "additionalProperties": false, "required": ["tenant_id_required", "cross_tenant_reads", "cross_tenant_writes"], "properties": {"tenant_id_required": {"const": true}, "cross_tenant_reads": {"const": false}, "cross_tenant_writes": {"const": false}}},
    "quotas": {"type": "object", "additionalProperties": false, "required": ["requests_per_minute", "max_concurrent_jobs", "max_asset_bytes"], "properties": {"requests_per_minute": {"type": "integer", "minimum": 1}, "max_concurrent_jobs": {"type": "integer", "minimum": 1}, "max_asset_bytes": {"type": "integer", "minimum": 1}}},
    "idempotency": {"type": "object", "additionalProperties": false, "required": ["required_for_mutating_requests", "replay_same_result", "key_ttl_seconds"], "properties": {"required_for_mutating_requests": {"const": true}, "replay_same_result": {"const": true}, "key_ttl_seconds": {"type": "integer", "minimum": 60}}}
  }
}
