{
  "$defs": {
    "AdUnit": {
      "additionalProperties": false,
      "description": "A single ad unit (e.g. \"rewarded video on iOS\").",
      "properties": {
        "format": {
          "$ref": "#/$defs/AdUnitFormat"
        },
        "platform": {
          "$ref": "#/$defs/ConnectorPlatform"
        },
        "unit_id": {
          "type": "string"
        }
      },
      "required": [
        "format",
        "platform",
        "unit_id"
      ],
      "type": "object"
    },
    "AdUnitFormat": {
      "description": "Ad-unit format on an ad-network connector.",
      "enum": [
        "banner",
        "interstitial",
        "rewarded",
        "rewarded-interstitial",
        "app-open",
        "native"
      ],
      "type": "string"
    },
    "Aggregation": {
      "description": "Aggregation method for pipeline field mappings.",
      "enum": [
        "sum",
        "avg",
        "count",
        "first",
        "last",
        "max",
        "min",
        "median",
        "p50",
        "p95",
        "p99",
        "percentile",
        "ratio",
        "stddev",
        "variance"
      ],
      "type": "string"
    },
    "AuthMethod": {
      "description": "Authentication method.",
      "enum": [
        "api_key",
        "oauth2",
        "basic",
        "mtls",
        "ssh",
        "none"
      ],
      "type": "string"
    },
    "AuthModel": {
      "description": "Authentication model for a Supabase connector.",
      "oneOf": [
        {
          "properties": {
            "method": {
              "const": "email",
              "type": "string"
            }
          },
          "required": [
            "method"
          ],
          "type": "object"
        },
        {
          "properties": {
            "method": {
              "const": "phone",
              "type": "string"
            }
          },
          "required": [
            "method"
          ],
          "type": "object"
        },
        {
          "properties": {
            "method": {
              "const": "o-auth",
              "type": "string"
            },
            "providers": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "required": [
            "method",
            "providers"
          ],
          "type": "object"
        },
        {
          "properties": {
            "method": {
              "const": "web-authn",
              "type": "string"
            }
          },
          "required": [
            "method"
          ],
          "type": "object"
        },
        {
          "properties": {
            "method": {
              "const": "anonymous",
              "type": "string"
            }
          },
          "required": [
            "method"
          ],
          "type": "object"
        },
        {
          "properties": {
            "method": {
              "const": "multiple",
              "type": "string"
            }
          },
          "required": [
            "method"
          ],
          "type": "object"
        }
      ]
    },
    "ConnectorConfig": {
      "description": "Typed connector-specific configuration. Internally tagged on `kind`.\n\nMatches the Cockpit `TypedConnectorConfig` union verbatim (see\n`cockpit/src/components/onboarding/connectors/connector-types.ts`).\nConnectors not yet typed (Stripe, HubSpot, Linear, PostHog, Cloudflare,\nSegment, Mixpanel) remain on `Integration.config: serde_json::Value`\nuntil each earns a variant here.",
      "oneOf": [
        {
          "additionalProperties": false,
          "description": "Google AdMob mediation and waterfall configuration.",
          "properties": {
            "ad_units": {
              "description": "Declared ad units.",
              "items": {
                "$ref": "#/$defs/AdUnit"
              },
              "type": "array"
            },
            "android_app_id": {
              "description": "Android `com.google.android.gms.ads.APPLICATION_ID` manifest value.",
              "type": [
                "string",
                "null"
              ]
            },
            "att_copy_ios": {
              "description": "App Tracking Transparency prompt copy shown to iOS users.",
              "type": [
                "string",
                "null"
              ]
            },
            "ios_app_id": {
              "description": "iOS GADApplicationIdentifier (Info.plist).",
              "type": [
                "string",
                "null"
              ]
            },
            "kill_switch_flag": {
              "description": "Feature-flag name that disables ad serving entirely at runtime.",
              "type": [
                "string",
                "null"
              ]
            },
            "kind": {
              "const": "admob",
              "type": "string"
            },
            "publisher_id": {
              "description": "AdMob publisher id (e.g. `pub-1234567890123456`).",
              "type": "string"
            },
            "skadnetwork_ids": {
              "description": "Registered SKAdNetwork ids (iOS attribution).",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "required": [
            "kind",
            "publisher_id"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "Apple App Store Connect configuration.",
          "properties": {
            "age_rating": {
              "description": "Age rating (e.g. `\"4+\"`, `\"12+\"`, `\"17+\"`).",
              "type": [
                "string",
                "null"
              ]
            },
            "app_name": {
              "description": "App name as stored on App Store Connect.",
              "type": "string"
            },
            "bundle_id": {
              "description": "App bundle id (e.g. `com.kickgeist.app`).",
              "type": "string"
            },
            "category": {
              "description": "Primary App Store category.",
              "type": [
                "string",
                "null"
              ]
            },
            "ci_workflow_ref": {
              "description": "PathRef-like reference to the CI workflow file that ships builds.",
              "type": [
                "string",
                "null"
              ]
            },
            "content_rating": {
              "description": "Content rating descriptor text.",
              "type": [
                "string",
                "null"
              ]
            },
            "display_name": {
              "description": "Localised display name shown on the home screen.",
              "type": [
                "string",
                "null"
              ]
            },
            "fastlane_path": {
              "description": "Fastlane Fastfile path within the repo, if deploys are fastlane-driven.",
              "type": [
                "string",
                "null"
              ]
            },
            "kind": {
              "const": "appstoreconnect",
              "type": "string"
            },
            "team_id": {
              "description": "Apple developer team id (10 chars).",
              "type": "string"
            },
            "territories": {
              "description": "Territories where the app is available (ISO country codes).",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "required": [
            "kind",
            "team_id",
            "bundle_id",
            "app_name"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "Google Play Console configuration.",
          "properties": {
            "age_signals": {
              "description": "Required age signals (e.g. `[\"coppa\", \"gdpr-k\"]`).",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "ci_workflow_ref": {
              "description": "PathRef-like reference to the CI workflow file that ships builds.",
              "type": [
                "string",
                "null"
              ]
            },
            "compile_sdk": {
              "format": "int64",
              "minimum": 1,
              "type": [
                "integer",
                "null"
              ]
            },
            "content_rating": {
              "description": "Play Console content rating (e.g. `\"Everyone\"`, `\"Teen\"`).",
              "type": [
                "string",
                "null"
              ]
            },
            "fastlane_path": {
              "description": "Fastlane Fastfile path for Play releases.",
              "type": [
                "string",
                "null"
              ]
            },
            "kind": {
              "const": "googleplay",
              "type": "string"
            },
            "min_sdk": {
              "format": "int64",
              "minimum": 1,
              "type": [
                "integer",
                "null"
              ]
            },
            "package_name": {
              "description": "Application id (e.g. `com.kickgeist.app`).",
              "type": "string"
            },
            "target_sdk": {
              "format": "int64",
              "minimum": 1,
              "type": [
                "integer",
                "null"
              ]
            }
          },
          "required": [
            "kind",
            "package_name"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "Supabase project configuration.",
          "properties": {
            "auth_model": {
              "$ref": "#/$defs/AuthModel"
            },
            "edge_functions": {
              "items": {
                "$ref": "#/$defs/EdgeFunction"
              },
              "type": "array"
            },
            "jwt_expiry_secs": {
              "format": "int64",
              "minimum": 60,
              "type": "integer"
            },
            "kind": {
              "const": "supabase",
              "type": "string"
            },
            "postgres_major": {
              "format": "int64",
              "minimum": 11,
              "type": "integer"
            },
            "project_id": {
              "type": "string"
            },
            "project_ref": {
              "type": "string"
            },
            "realtime_enabled": {
              "type": "boolean"
            },
            "region": {
              "type": "string"
            },
            "rls_enabled": {
              "type": "boolean"
            },
            "storage_enabled": {
              "type": "boolean"
            }
          },
          "required": [
            "kind",
            "project_ref",
            "project_id",
            "region",
            "postgres_major",
            "auth_model",
            "jwt_expiry_secs",
            "realtime_enabled",
            "storage_enabled",
            "rls_enabled"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "Sportmonks football data API configuration.",
          "properties": {
            "api_token_env_var": {
              "description": "Env var that holds the API token at runtime. Duplicated here\n(alongside `Integration.secret_bindings`) because Sportmonks SDK\nusage treats the env var name as configuration, not as a secret.",
              "type": "string"
            },
            "kill_switch_flags": {
              "description": "Kill-switch flag names that can cut traffic to this connector\nwithout a redeploy.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "kind": {
              "const": "sportmonks",
              "type": "string"
            },
            "rate_limit_policy": {
              "description": "Rate-limit strategy text (e.g. `\"3000 requests / hour, burst 10/s\"`).",
              "type": [
                "string",
                "null"
              ]
            },
            "schedules": {
              "description": "Scheduled ingest jobs.",
              "items": {
                "$ref": "#/$defs/ScheduleBinding"
              },
              "type": "array"
            }
          },
          "required": [
            "kind",
            "api_token_env_var"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "GitHub repository configuration.",
          "properties": {
            "ci_workflows": {
              "description": "Relative paths to CI workflow files (e.g.\n`[\".github/workflows/validate.yml\"]`).",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "default_branch": {
              "type": [
                "string",
                "null"
              ]
            },
            "kind": {
              "const": "github",
              "type": "string"
            },
            "owner": {
              "type": "string"
            },
            "repo": {
              "type": "string"
            },
            "topics": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "required": [
            "kind",
            "owner",
            "repo"
          ],
          "type": "object"
        }
      ]
    },
    "ConnectorPlatform": {
      "description": "Target platform for a connector binding.",
      "enum": [
        "ios",
        "android",
        "web",
        "mac-os",
        "windows",
        "linux"
      ],
      "type": "string"
    },
    "DataContract": {
      "description": "Data contract.",
      "properties": {
        "freshness": {
          "$ref": "#/$defs/Freshness"
        },
        "owner": {
          "$ref": "#/$defs/PathRef"
        },
        "quality": {
          "anyOf": [
            {
              "$ref": "#/$defs/DataQuality"
            },
            {
              "type": "null"
            }
          ],
          "description": "Data quality expectations. Strongly recommended; absence means no\nquality checks have been declared for this contract."
        },
        "schema": {
          "$ref": "#/$defs/DataSchema"
        },
        "sla": {
          "anyOf": [
            {
              "$ref": "#/$defs/Sla"
            },
            {
              "type": "null"
            }
          ],
          "description": "Service level agreement. Strongly recommended; absence means no SLA\nhas been declared for this contract."
        }
      },
      "required": [
        "owner",
        "freshness",
        "schema"
      ],
      "type": "object"
    },
    "DataField": {
      "description": "Data contract field definition.",
      "properties": {
        "enum": {
          "default": [],
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "name": {
          "type": "string"
        },
        "required": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "type": {
          "type": "string"
        }
      },
      "required": [
        "name",
        "type"
      ],
      "type": "object"
    },
    "DataQuality": {
      "description": "Data quality constraints declared by the contract owner.",
      "properties": {
        "completeness": {
          "description": "Expected completeness of the dataset, expressed as a percentage\n(0-100). 100 means every required field is populated in every record.",
          "format": "double",
          "maximum": 100.0,
          "minimum": 0.0,
          "type": [
            "number",
            "null"
          ]
        },
        "uniqueness": {
          "default": [],
          "description": "Field names whose values must be unique across the dataset\n(e.g. `[\"id\"]` for a primary key, `[\"user_id\", \"event_id\"]` for a\ncomposite key).",
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      },
      "type": "object"
    },
    "DataSchema": {
      "description": "Data contract schema.",
      "properties": {
        "fields": {
          "items": {
            "$ref": "#/$defs/DataField"
          },
          "type": "array"
        }
      },
      "required": [
        "fields"
      ],
      "type": "object"
    },
    "EdgeFunction": {
      "additionalProperties": false,
      "description": "A Supabase edge function binding.",
      "properties": {
        "name": {
          "type": "string"
        },
        "schedule": {
          "description": "Cron expression when the function runs on a schedule. `None` for\nrequest-triggered functions.",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "FieldMapping": {
      "description": "Maps a source field to a CorpoSpec metric via aggregation.",
      "properties": {
        "aggregation": {
          "$ref": "#/$defs/Aggregation"
        },
        "breakdown_by": {
          "description": "Dimension to break down by (e.g. `country`, `product_id`). When set,\nthe aggregation is computed per distinct value of this field and the\nresulting metric snapshot is tagged with that dimension value.",
          "type": [
            "string",
            "null"
          ]
        },
        "denominator_field": {
          "type": [
            "string",
            "null"
          ]
        },
        "percentile": {
          "description": "Percentile value in `[0.0, 1.0]` used when `aggregation` is\n`percentile`. Ignored by all other aggregations.",
          "format": "double",
          "maximum": 1.0,
          "minimum": 0.0,
          "type": [
            "number",
            "null"
          ]
        },
        "source_field": {
          "type": "string"
        },
        "target": {
          "$ref": "#/$defs/PathRef"
        }
      },
      "required": [
        "source_field",
        "target",
        "aggregation"
      ],
      "type": "object"
    },
    "Freshness": {
      "description": "Freshness requirements.",
      "properties": {
        "max_staleness_minutes": {
          "format": "int64",
          "minimum": 1,
          "type": "integer"
        },
        "schedule": {
          "type": "string"
        }
      },
      "required": [
        "schedule",
        "max_staleness_minutes"
      ],
      "type": "object"
    },
    "InputPort": {
      "additionalProperties": false,
      "description": "Input port configuration.",
      "properties": {
        "authentication": {
          "$ref": "#/$defs/AuthMethod",
          "description": "Authentication method used to reach the endpoint."
        },
        "endpoint": {
          "description": "Base URL or host of the input port. Optional because some connectors\ntarget local resources (e.g. a Git working copy) or session-scoped\nendpoints (e.g. WebRTC rooms) where a single base URL does not apply.\nWhen present it must be a valid URI.",
          "format": "uri",
          "type": [
            "string",
            "null"
          ]
        },
        "name": {
          "description": "Short identifier for this port (e.g. `stripe-api`, `local-git-repo`).",
          "type": "string"
        },
        "protocols": {
          "description": "Transport(s) or API style(s) the port speaks. Multi-protocol ports\n(e.g. Supabase speaks REST + WebSocket + Postgres simultaneously)\ndeclare every transport they accept. Empty = unspecified; authors\nshould populate at least one.",
          "items": {
            "$ref": "#/$defs/Protocol"
          },
          "type": "array"
        },
        "version": {
          "description": "API version the connector targets (e.g. `\"2024-06-20\"` for Stripe,\n`\"v3\"` for Sportmonks). Distinct from `protocols`, which captures the\ntransport(s).",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "name",
        "authentication"
      ],
      "type": "object"
    },
    "IntegrationStatus": {
      "description": "Integration lifecycle status.",
      "enum": [
        "draft",
        "planned",
        "development",
        "testing",
        "active",
        "sunset",
        "retired"
      ],
      "type": "string"
    },
    "IntegrationType": {
      "description": "Integration direction type.",
      "enum": [
        "source",
        "destination",
        "bidirectional"
      ],
      "type": "string"
    },
    "PathRef": {
      "description": "Path-based cross-reference relative to .corpospec/ root.\nPattern: `^[a-z0-9_-]+(/[a-z0-9_.-]+)+$`",
      "pattern": "^[a-z0-9_-]+(/[a-z0-9_.-]+)+$",
      "type": "string"
    },
    "Pipeline": {
      "description": "Pipeline configuration: how raw records are transformed into metric snapshots.",
      "properties": {
        "date_field": {
          "description": "Field name in the source data that represents the event/row timestamp.\nUsed to bucket records into the reporting period of each metric snapshot.",
          "type": "string"
        },
        "mappings": {
          "description": "Ordered list of field-to-metric mappings applied to every record.",
          "items": {
            "$ref": "#/$defs/FieldMapping"
          },
          "type": "array"
        }
      },
      "required": [
        "date_field",
        "mappings"
      ],
      "type": "object"
    },
    "Protocol": {
      "description": "Transport or API style declared on an input port.\n\nInternally tagged on `kind`. The `Other` variant carries a free-form label\nfor bespoke protocols (e.g. `\"Git CLI\"`, `\"WebRTC\"`) that don't map onto\none of the canonical transports. Prefer the named variants when they fit.",
      "oneOf": [
        {
          "properties": {
            "kind": {
              "const": "rest",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "graphql",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "grpc",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "websocket",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "webhook",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "postgres",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "s3",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "ftp",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "smtp",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "mqtt",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "git",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "webrtc",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "properties": {
            "kind": {
              "const": "other",
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "kind",
            "name"
          ],
          "type": "object"
        }
      ]
    },
    "ScheduleBinding": {
      "additionalProperties": false,
      "description": "A cron-style schedule bound to a connector task\n(e.g. Sportmonks daily-ingest).",
      "properties": {
        "name": {
          "type": "string"
        },
        "schedule": {
          "type": "string"
        }
      },
      "required": [
        "name",
        "schedule"
      ],
      "type": "object"
    },
    "SecretBinding": {
      "additionalProperties": false,
      "description": "Declaration of a credential required by an integration.\n\nCaptures the environment-variable / vault binding without embedding the\nsecret itself. Distinct from connector-specific `config:` because bindings\nare deployment-environment concerns; config is integration shape.",
      "properties": {
        "env_var": {
          "description": "Environment variable name the connector reads at runtime\n(e.g. `SPORTMONKS_API_TOKEN`). Required even when `source` is\n`vault-ref` — the deploy layer materialises the binding into the\nnamed env var.",
          "type": "string"
        },
        "notes": {
          "description": "Optional human description (e.g. who holds the production secret,\nrotation cadence, link to runbook).",
          "type": [
            "string",
            "null"
          ]
        },
        "role": {
          "description": "Short label describing the role of this credential\n(e.g. `\"api-token\"`, `\"service-account-json\"`, `\"webhook-signing-key\"`).",
          "type": "string"
        },
        "source": {
          "$ref": "#/$defs/SecretSource",
          "description": "Where the secret comes from at deployment time."
        }
      },
      "required": [
        "env_var",
        "source",
        "role"
      ],
      "type": "object"
    },
    "SecretSource": {
      "description": "Source of a secret referenced by an integration.",
      "oneOf": [
        {
          "description": "Environment variable (e.g. `SPORTMONKS_API_TOKEN` read from the\nprocess environment).",
          "properties": {
            "kind": {
              "const": "environment",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "description": "External secret manager (Vault, AWS Secrets Manager, GCP Secret\nManager). `ref` is the provider-specific path or name.",
          "properties": {
            "kind": {
              "const": "vault-ref",
              "type": "string"
            },
            "reference": {
              "type": "string"
            }
          },
          "required": [
            "kind",
            "reference"
          ],
          "type": "object"
        },
        {
          "description": "OAuth token negotiated at runtime. No static secret is bound.",
          "properties": {
            "kind": {
              "const": "oauth",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        },
        {
          "description": "Managed by a cloud provider IAM (e.g. AWS role, GCP workload identity).",
          "properties": {
            "kind": {
              "const": "cloud-iam",
              "type": "string"
            }
          },
          "required": [
            "kind"
          ],
          "type": "object"
        }
      ]
    },
    "Sla": {
      "description": "Service level agreement offered by the source system for this contract.",
      "properties": {
        "availability": {
          "description": "Target availability as a percentage (0-100), e.g. `99.9` for three nines.",
          "format": "double",
          "maximum": 100.0,
          "minimum": 0.0,
          "type": [
            "number",
            "null"
          ]
        },
        "support_response_hours": {
          "description": "Maximum time in hours between a support request and a first response.",
          "format": "int64",
          "minimum": 1,
          "type": [
            "integer",
            "null"
          ]
        }
      },
      "type": "object"
    }
  },
  "$id": "https://corpospec.com/schemas/v0.10.3/integration.schema.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "description": "Integration data contract aligned with ODPS input ports and ODCS contract concepts.",
  "properties": {
    "config": {
      "description": "Connector-specific opaque configuration for untyped connectors\n(Stripe, HubSpot, Linear, PostHog, Cloudflare, Segment, Mixpanel, etc.).\nTyped connectors (AdMob, App Store Connect, Google Play, Supabase,\nSportmonks, GitHub) populate `typed_config` instead and leave this\nfield empty. Mutually exclusive with `typed_config` in practice;\neither may be present, never both."
    },
    "data_contract": {
      "anyOf": [
        {
          "$ref": "#/$defs/DataContract"
        },
        {
          "type": "null"
        }
      ]
    },
    "id": {
      "$ref": "#/$defs/PathRef"
    },
    "input_port": {
      "anyOf": [
        {
          "$ref": "#/$defs/InputPort"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "outputs": {
      "default": [],
      "items": {
        "$ref": "#/$defs/PathRef"
      },
      "type": "array"
    },
    "pipeline": {
      "anyOf": [
        {
          "$ref": "#/$defs/Pipeline"
        },
        {
          "type": "null"
        }
      ]
    },
    "secret_bindings": {
      "description": "Credential bindings required by this connector. Declares env-var\nnames and their sources (environment, vault, OAuth, cloud IAM) but\nnever the secret values themselves.",
      "items": {
        "$ref": "#/$defs/SecretBinding"
      },
      "type": "array"
    },
    "status": {
      "$ref": "#/$defs/IntegrationStatus"
    },
    "system": {
      "type": "string"
    },
    "type": {
      "$ref": "#/$defs/IntegrationType"
    },
    "typed_config": {
      "anyOf": [
        {
          "$ref": "#/$defs/ConnectorConfig"
        },
        {
          "type": "null"
        }
      ],
      "description": "Typed connector-specific configuration for the six first-class\nconnectors (see [`ConnectorConfig`]). Canonical alternative to\n`config` for connectors that have earned a typed variant."
    }
  },
  "required": [
    "id",
    "name",
    "system",
    "type",
    "status"
  ],
  "title": "Integration",
  "type": "object"
}