{
  "swagger": "2.0",
  "info": {
    "title": "TiDB Cloud Dedicated Open API",
    "description": "TiDB Cloud Dedicated Open API",
    "version": "v1beta1"
  },
  "tags": [
    {
      "name": "ChangefeedService"
    }
  ],
  "host": "dedicated.tidbapi.com",
  "schemes": [
    "https"
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "/v1beta1/changefeedRCUs": {
      "get": {
        "summary": "ListChangefeedRCUs",
        "description": "List available changefeed RCUs",
        "operationId": "ListChangefeedRCUs",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/v1beta1ListChangefeedRCUsResponse"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "tags": [
          "ChangefeedService"
        ]
      }
    },
    "/v1beta1/changefeeds": {
      "get": {
        "summary": "ListChangefeeds",
        "description": "List all changefeeds for a given cluster",
        "operationId": "ListChangefeeds",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/v1beta1ListChangefeedsResponse"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "clusterId",
            "description": "The ID of the cluster to list changefeeds for.\nExample: \"1234567890123\"\n(-- api-linter: core::0141::forbidden-types=disabled --)\n\nThe ID of the cluster to list changefeeds for.",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "downstreamType",
            "description": "Filter by downstream type. If not specified, returns all types.\nExample: KAFKA\n\nFilter by downstream type. If not specified, returns all types.\n\n- `\"KAFKA\"`: Apache Kafka\n\n- `\"MYSQL\"`: MySQL-compatible database\n\n- `\"S3\"`: Amazon S3 or S3-compatible storage\n\n- `\"GCS\"`: Google Cloud Storage\n\n- `\"AZURE_BLOB\"`: Azure Blob Storage\n\n - DOWNSTREAM_TYPE_UNSPECIFIED: Default value. Should not be used.\n - KAFKA: Apache Kafka.\n - MYSQL: MySQL-compatible database.\n - S3: Amazon S3 or S3-compatible storage.\n - GCS: Google Cloud Storage.\n - AZURE_BLOB: Azure Blob Storage.",
            "in": "query",
            "required": false,
            "type": "string",
            "enum": [
              "DOWNSTREAM_TYPE_UNSPECIFIED",
              "KAFKA",
              "MYSQL",
              "S3",
              "GCS",
              "AZURE_BLOB"
            ],
            "default": "DOWNSTREAM_TYPE_UNSPECIFIED"
          },
          {
            "name": "pageSize",
            "description": "The maximum number of changefeeds to return. If not specified, 20 items are returned by default.",
            "in": "query",
            "required": false,
            "type": "integer",
            "format": "int32"
          },
          {
            "name": "pageToken",
            "description": "The next_page_token value returned from a previous List request, if any.",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      },
      "post": {
        "summary": "CreateChangefeed",
        "description": "Create a new changefeed",
        "operationId": "CreateChangefeed",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/v1beta1Changefeed"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "description": "CreateChangefeedRequest represents the request for creating a changefeed.",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/v1beta1CreateChangefeedRequest"
            }
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      }
    },
    "/v1beta1/changefeeds/{changefeedId}": {
      "get": {
        "summary": "GetChangefeed",
        "description": "Get a changefeed by its ID",
        "operationId": "GetChangefeed",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/v1beta1Changefeed"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "changefeedId",
            "description": "The ID of the changefeed to retrieve.",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "invalidateCache",
            "description": "Whether to invalidate cache and return realtime checkpoint information.\nExample: true\n\nWhether to bypass cache and return realtime checkpoint information.",
            "in": "query",
            "required": false,
            "type": "boolean"
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      },
      "delete": {
        "summary": "DeleteChangefeed",
        "description": "Delete a changefeed by its ID",
        "operationId": "DeleteChangefeed",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "type": "object",
              "properties": {}
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "changefeedId",
            "description": "The ID of the changefeed to delete.",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      }
    },
    "/v1beta1/changefeeds/{changefeedId}:editDownstreamConfig": {
      "post": {
        "summary": "EditChangefeedDownstreamConfig",
        "description": "Update mutable configuration of an existing changefeed. The changefeed must be in PAUSED state",
        "operationId": "EditChangefeedDownstreamConfig",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/v1beta1Changefeed"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "changefeedId",
            "description": "The ID of the changefeed to update.",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "properties": {
                "dryRun": {
                  "type": "boolean",
                  "example": true,
                  "description": "Whether to run dry-run validation only (parameter + connectivity checks) without applying update.",
                  "title": "Whether to run dry-run validation only (parameter + connectivity checks) without applying update.\nExample: true"
                },
                "tableConfig": {
                  "$ref": "#/definitions/v1beta1TableConfig",
                  "description": "Table filtering and event filter configuration.\nThis field is editable only when the changefeed is in PAUSED state."
                },
                "downstreamType": {
                  "$ref": "#/definitions/v1beta1DownstreamType",
                  "example": "KAFKA",
                  "description": "The downstream type. Must match the existing downstream type (cannot be changed).",
                  "title": "The downstream type. Must match the existing downstream type (cannot be changed).\nExample: KAFKA"
                },
                "kafka": {
                  "$ref": "#/definitions/v1beta1KafkaDownstreamConfig",
                  "description": "Updated Kafka configuration."
                },
                "mysql": {
                  "$ref": "#/definitions/v1beta1MySQLDownstreamConfig",
                  "description": "Updated MySQL configuration."
                },
                "s3": {
                  "$ref": "#/definitions/v1beta1S3DownstreamConfig",
                  "description": "Updated S3 configuration."
                },
                "gcs": {
                  "$ref": "#/definitions/v1beta1GcsDownstreamConfig",
                  "description": "Updated GCS configuration."
                },
                "azureBlob": {
                  "$ref": "#/definitions/v1beta1AzureBlobDownstreamConfig",
                  "description": "Updated Azure Blob configuration."
                }
              },
              "description": "EditChangefeedDownstreamConfigRequest represents the request for updating a changefeed's downstream config.",
              "required": [
                "downstreamType"
              ]
            }
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      }
    },
    "/v1beta1/changefeeds/{changefeedId}:getKernelInfo": {
      "get": {
        "summary": "GetChangefeedKernelInfo",
        "description": "Get the TiCDC kernel version and kernel type of a changefeed. For internal use only.",
        "operationId": "GetChangefeedKernelInfo",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/v1beta1ChangefeedKernelInfo"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "changefeedId",
            "description": "The ID of the changefeed to query.",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      }
    },
    "/v1beta1/changefeeds/{changefeedId}:pause": {
      "post": {
        "summary": "PauseChangefeed",
        "description": "Pause a running changefeed",
        "operationId": "PauseChangefeed",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "type": "object",
              "properties": {}
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "changefeedId",
            "description": "The ID of the changefeed to pause.",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "description": "PauseChangefeedRequest represents the request for pausing a changefeed."
            }
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      }
    },
    "/v1beta1/changefeeds/{changefeedId}:resume": {
      "post": {
        "summary": "ResumeChangefeed",
        "description": "Resume a paused changefeed",
        "operationId": "ResumeChangefeed",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "type": "object",
              "properties": {}
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "changefeedId",
            "description": "The ID of the changefeed to resume.",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "description": "ResumeChangefeedRequest represents the request for resuming a changefeed."
            }
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      }
    },
    "/v1beta1/changefeeds/{changefeedId}:scale": {
      "post": {
        "summary": "ScaleChangefeed",
        "description": "Scale a changefeed to a different instance type",
        "operationId": "ScaleChangefeed",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/v1beta1Changefeed"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "changefeedId",
            "description": "The ID of the changefeed to scale.",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "properties": {
                "replicationCapacity": {
                  "type": "string",
                  "example": "8rcu",
                  "description": "The target replication capacity to scale to.",
                  "title": "The target replication capacity to scale to.\nExample: \"8rcu\""
                }
              },
              "description": "ScaleChangefeedRequest represents the request for scaling a changefeed.",
              "required": [
                "replicationCapacity"
              ]
            }
          }
        ],
        "tags": [
          "ChangefeedService"
        ]
      }
    }
  },
  "definitions": {
    "AuthenticationAuthType": {
      "type": "string",
      "enum": [
        "AUTH_TYPE_UNSPECIFIED",
        "DISABLE",
        "SASL_PLAIN",
        "SASL_SCRAM_SHA_256",
        "SASL_SCRAM_SHA_512"
      ],
      "default": "AUTH_TYPE_UNSPECIFIED",
      "description": "AuthType defines the supported Kafka authentication types.\n\n - DISABLE: No authentication.\n - SASL_PLAIN: SASL/PLAIN authentication.\n - SASL_SCRAM_SHA_256: SASL/SCRAM-SHA-256 authentication.\n - SASL_SCRAM_SHA_512: SASL/SCRAM-SHA-512 authentication."
    },
    "AvroConfigBigintUnsignedHandlingMode": {
      "type": "string",
      "enum": [
        "BIGINT_UNSIGNED_HANDLING_MODE_LONG",
        "BIGINT_UNSIGNED_HANDLING_MODE_STRING"
      ],
      "default": "BIGINT_UNSIGNED_HANDLING_MODE_LONG",
      "description": "BigintUnsignedHandlingMode defines how BIGINT UNSIGNED values are handled.\n\n - BIGINT_UNSIGNED_HANDLING_MODE_LONG: Use 64-bit integer (may overflow for very large values).\n - BIGINT_UNSIGNED_HANDLING_MODE_STRING: Use string representation (safe for all values)."
    },
    "AvroConfigDecimalHandlingMode": {
      "type": "string",
      "enum": [
        "DECIMAL_HANDLING_MODE_UNSPECIFIED",
        "DECIMAL_HANDLING_MODE_PRECISE",
        "DECIMAL_HANDLING_MODE_STRING"
      ],
      "default": "DECIMAL_HANDLING_MODE_UNSPECIFIED",
      "description": "DecimalHandlingMode defines how decimal values are serialized.\n\n - DECIMAL_HANDLING_MODE_PRECISE: Use precise decimal representation.\n - DECIMAL_HANDLING_MODE_STRING: Use string representation."
    },
    "AvroConfigSchemaRegistry": {
      "type": "object",
      "properties": {
        "schemaRegistryEndpoints": {
          "type": "string",
          "example": "http://schema-registry:8081",
          "description": "Comma-separated list of Schema Registry endpoints. Required for Confluent Schema Registry.",
          "title": "Comma-separated list of Schema Registry endpoints.\nRequired for Confluent Schema Registry.\nExample: \"http://schema-registry:8081\""
        },
        "enableBasicAuth": {
          "type": "boolean",
          "title": "Whether to enable HTTP basic authentication for Schema Registry.\nExample: true"
        },
        "basicAuthUsername": {
          "type": "string",
          "title": "Username for Schema Registry authentication.\nExample: \"schema_user\""
        },
        "basicAuthPassword": {
          "type": "string",
          "title": "Password for Schema Registry authentication.\nExample: \"********\""
        }
      },
      "description": "SchemaRegistry defines the Schema Registry connection configuration.\n\n// Schema Registry type: CONFLUENT or AWS_GLUE.\n // Example: CONFLUENT\n SchemaRegistryType type = 1 [\n   (google.api.field_behavior) = REQUIRED,\n   (validate.rules).enum.defined_only = true,\n   (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {\n     description: \"Schema Registry type.\\n\\n- `\\\"SCHEMA_REGISTRY_TYPE_UNSPECIFIED\\\"`: Default value.\\n\\n- `\\\"CONFLUENT\\\"`: Confluent Schema Registry.\\n\\n- `\\\"AWS_GLUE\\\"`: AWS Glue Schema Registry.\"\n     example: \"\\\"CONFLUENT\\\"\"\n   }\n ];"
    },
    "ChangefeedKernelInfoKernelType": {
      "type": "string",
      "enum": [
        "KERNEL_TYPE_UNSPECIFIED",
        "KERNEL_TYPE_CLASSIC",
        "KERNEL_TYPE_NEW"
      ],
      "default": "KERNEL_TYPE_UNSPECIFIED",
      "description": "KernelType defines the TiCDC kernel architecture.\n\n - KERNEL_TYPE_UNSPECIFIED: Default / unknown (e.g. during provisioning).\n - KERNEL_TYPE_CLASSIC: Classic (legacy) TiCDC architecture, based on tiflow.\nSee https://docs.pingcap.com/tidb/stable/ticdc-classic-architecture/\n - KERNEL_TYPE_NEW: New TiCDC architecture (coordinator / maintainer / dispatcher model),\nindependent from the TiDB kernel version.\nSee https://docs.pingcap.com/tidb/stable/ticdc-architecture/"
    },
    "ChangefeedState": {
      "type": "string",
      "enum": [
        "STATE_UNSPECIFIED",
        "RUNNING",
        "FAILED",
        "ERROR",
        "CREATING",
        "PAUSING",
        "PAUSED",
        "DELETING",
        "DELETED",
        "EDITING",
        "WARNING",
        "SCALING"
      ],
      "default": "STATE_UNSPECIFIED",
      "description": "State defines the possible states of a changefeed.\n\n - STATE_UNSPECIFIED: Default value. Should not be used.\n - RUNNING: Changefeed is actively replicating data.\n - FAILED: Changefeed encountered a fatal error and stopped.\n - ERROR: Changefeed encountered an error but may recover.\n - CREATING: Changefeed is being created.\n - PAUSING: Changefeed is in the process of pausing.\n - PAUSED: Changefeed is paused.\n - DELETING: Changefeed is being deleted.\n - DELETED: Changefeed has been deleted.\n - EDITING: Changefeed configuration is being updated.\n - WARNING: Changefeed is running but has warnings.\n - SCALING: Changefeed is being scaled."
    },
    "DataFormatAvroConfig": {
      "type": "object",
      "properties": {
        "decimalHandlingMode": {
          "$ref": "#/definitions/AvroConfigDecimalHandlingMode",
          "example": "DECIMAL_HANDLING_MODE_PRECISE",
          "description": "How to handle decimal values.\n\n- `\"DECIMAL_HANDLING_MODE_UNSPECIFIED\"`: Default value.\n\n- `\"DECIMAL_HANDLING_MODE_PRECISE\"`: Use precise decimal representation.\n\n- `\"DECIMAL_HANDLING_MODE_STRING\"`: Use string representation.",
          "title": "How to handle decimal values.\nExample: DECIMAL_HANDLING_MODE_PRECISE"
        },
        "bigintUnsignedHandlingMode": {
          "$ref": "#/definitions/AvroConfigBigintUnsignedHandlingMode",
          "example": "BIGINT_UNSIGNED_HANDLING_MODE_STRING",
          "description": "How to handle BIGINT UNSIGNED values.\n\n- `\"BIGINT_UNSIGNED_HANDLING_MODE_LONG\"`: Use 64-bit integer (may overflow for very large values).\n\n- `\"BIGINT_UNSIGNED_HANDLING_MODE_STRING\"`: Use string representation (safe for all values).",
          "title": "How to handle BIGINT UNSIGNED values.\nExample: BIGINT_UNSIGNED_HANDLING_MODE_STRING"
        },
        "schemaRegistry": {
          "$ref": "#/definitions/AvroConfigSchemaRegistry",
          "description": "Schema Registry configuration."
        }
      },
      "description": "AvroConfig defines Avro-specific configuration."
    },
    "DataFormatDebeziumConfig": {
      "type": "object",
      "properties": {
        "outputOldValue": {
          "type": "boolean",
          "title": "Whether to include the old value (before update) in the output.\nExample: true"
        },
        "disableSchema": {
          "type": "boolean",
          "title": "Whether to disable schema in the output.\nExample: false"
        }
      },
      "description": "DebeziumConfig defines Debezium-specific configuration."
    },
    "EndpointS3AuthType": {
      "type": "string",
      "enum": [
        "S3_AUTH_TYPE_UNSPECIFIED",
        "S3_AUTH_TYPE_AK_SK",
        "S3_AUTH_TYPE_ASSUME_ROLE"
      ],
      "default": "S3_AUTH_TYPE_UNSPECIFIED",
      "description": "S3AuthType defines the supported S3 authentication types.\n\n - S3_AUTH_TYPE_AK_SK: Access Key / Secret Key authentication.\n - S3_AUTH_TYPE_ASSUME_ROLE: IAM Assume Role authentication."
    },
    "KafkaDownstreamConfigAuthentication": {
      "type": "object",
      "properties": {
        "authType": {
          "$ref": "#/definitions/AuthenticationAuthType",
          "example": "SASL_SCRAM_SHA_256",
          "description": "Authentication type.\n\n- `\"AUTH_TYPE_UNSPECIFIED\"`: Default value.\n\n- `\"DISABLE\"`: No authentication.\n\n- `\"SASL_PLAIN\"`: SASL/PLAIN authentication.\n\n- `\"SASL_SCRAM_SHA_256\"`: SASL/SCRAM-SHA-256 authentication.\n\n- `\"SASL_SCRAM_SHA_512\"`: SASL/SCRAM-SHA-512 authentication.",
          "title": "Authentication type.\nExample: SASL_SCRAM_SHA_256"
        },
        "username": {
          "type": "string",
          "title": "Username for SASL authentication.\nExample: \"kafka_user\""
        },
        "password": {
          "type": "string",
          "title": "Password for SASL authentication.\nExample: \"********\""
        }
      },
      "description": "Authentication defines the Kafka authentication configuration.",
      "required": [
        "authType"
      ]
    },
    "KafkaDownstreamConfigBroker": {
      "type": "object",
      "properties": {
        "version": {
          "$ref": "#/definitions/KafkaDownstreamConfigKafkaVersion",
          "example": "KAFKA_VERSION_3XX",
          "description": "Kafka broker version.\n\n- `\"KAFKA_VERSION_UNSPECIFIED\"`: Default value.\n\n- `\"KAFKA_VERSION_0XX\"`: Kafka 0.x\n\n- `\"KAFKA_VERSION_1XX\"`: Kafka 1.x\n\n- `\"KAFKA_VERSION_2XX\"`: Kafka 2.x\n\n- `\"KAFKA_VERSION_3XX\"`: Kafka 3.x",
          "title": "Kafka broker version.\nExample: KAFKA_VERSION_3XX"
        },
        "brokerEndpoints": {
          "type": "string",
          "example": "broker1:9092,broker2:9092,broker3:9092",
          "description": "Comma-separated list of broker addresses. Required for PUBLIC and VPC_PEERING network types. Not required for PRIVATE_LINK.",
          "title": "Comma-separated list of broker addresses.\nRequired for PUBLIC and VPC_PEERING network types.\nNot required for PRIVATE_LINK, where broker endpoints are assembled\nserver-side from sink_endpoint_id + ports.\nExample: \"broker1:9092,broker2:9092,broker3:9092\""
        },
        "useTls": {
          "type": "boolean",
          "title": "Whether to enable TLS for the connection.\nExample: true"
        },
        "insecureSkipVerify": {
          "type": "boolean",
          "title": "Whether to skip TLS certificate verification.\nWARNING: Only use for testing with self-signed certificates.\nExample: false"
        },
        "compression": {
          "$ref": "#/definitions/KafkaDownstreamConfigCompressionType",
          "example": "LZ4",
          "description": "Compression type for messages.\n\n- `\"COMPRESSION_TYPE_UNSPECIFIED\"`: Default value.\n\n- `\"NONE\"`: No compression.\n\n- `\"GZIP\"`: GZIP compression.\n\n- `\"SNAPPY\"`: Snappy compression.\n\n- `\"LZ4\"`: LZ4 compression.\n\n- `\"ZSTD\"`: ZSTD compression.",
          "title": "Compression type for messages.\nExample: LZ4"
        },
        "kafkaClientId": {
          "type": "string",
          "example": "my-changefeed-client",
          "description": "Optional Kafka client ID. When left empty the TiCDC kernel keeps its own default; when set it is forwarded to the kernel.",
          "title": "Optional Kafka client ID. When left empty it is not passed to the TiCDC\nkernel and the kernel keeps its own default. When set, it is forwarded to\nthe kernel via the sink URI `kafka-client-id` parameter.\nExample: \"my-changefeed-client\""
        }
      },
      "description": "Broker defines the Kafka broker connection configuration.",
      "required": [
        "version"
      ]
    },
    "KafkaDownstreamConfigColumnSelector": {
      "type": "object",
      "properties": {
        "matcher": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "Table name patterns to match.\nExample: [\"mydb.orders\", \"mydb.user_*\"]"
        },
        "columns": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "Columns to include in the output.\nExample: [\"id\", \"name\", \"status\"]"
        }
      },
      "description": "ColumnSelector defines column filtering for specific tables."
    },
    "KafkaDownstreamConfigCompressionType": {
      "type": "string",
      "enum": [
        "COMPRESSION_TYPE_UNSPECIFIED",
        "NONE",
        "GZIP",
        "SNAPPY",
        "LZ4",
        "ZSTD"
      ],
      "default": "COMPRESSION_TYPE_UNSPECIFIED",
      "description": "CompressionType defines the compression types for Kafka messages.\n\n - NONE: No compression.\n - GZIP: GZIP compression.\n - SNAPPY: Snappy compression.\n - LZ4: LZ4 compression.\n - ZSTD: ZSTD compression."
    },
    "KafkaDownstreamConfigDataFormat": {
      "type": "object",
      "properties": {
        "protocol": {
          "$ref": "#/definitions/KafkaDownstreamConfigDataFormatProtocol",
          "example": "PROTOCOL_CANAL_JSON",
          "description": "Output protocol for changefeed messages.\n\n- `\"PROTOCOL_UNSPECIFIED\"`: Default value.\n\n- `\"PROTOCOL_CANAL_JSON\"`: Canal JSON format. Recommended for most use cases.\n\n- `\"PROTOCOL_OPEN_PROTOCOL\"`: Open Protocol (TiDB native format). Encodes multiple events into one message.\n\n- `\"PROTOCOL_AVRO\"`: Apache Avro format. Supports Confluent Schema Registry and AWS Glue Schema Registry.\n\n- `\"PROTOCOL_MAXWELL\"`: Maxwell format.\n\n- `\"PROTOCOL_DEBEZIUM\"`: Debezium format.\n\n- `\"PROTOCOL_SIMPLE\"`: Simple format.",
          "title": "Output protocol for changefeed messages.\nExample: PROTOCOL_CANAL_JSON"
        },
        "debeziumConfig": {
          "$ref": "#/definitions/DataFormatDebeziumConfig",
          "description": "Debezium-specific configuration."
        },
        "avroConfig": {
          "$ref": "#/definitions/DataFormatAvroConfig",
          "description": "Avro-specific configuration."
        },
        "enableTidbExtension": {
          "type": "boolean",
          "title": "Whether to include TiDB extension fields in the output.\nExample: true"
        },
        "outputRawChangeEvent": {
          "type": "boolean",
          "title": "Whether to output raw change events without transformation.\nExample: false"
        }
      },
      "description": "DataFormat defines the message format and serialization configuration.",
      "required": [
        "protocol"
      ]
    },
    "KafkaDownstreamConfigDataFormatProtocol": {
      "type": "string",
      "enum": [
        "PROTOCOL_UNSPECIFIED",
        "PROTOCOL_CANAL_JSON",
        "PROTOCOL_OPEN_PROTOCOL",
        "PROTOCOL_AVRO",
        "PROTOCOL_DEBEZIUM"
      ],
      "default": "PROTOCOL_UNSPECIFIED",
      "description": "Protocol defines the supported output protocols.\n\n - PROTOCOL_CANAL_JSON: Canal JSON format. Recommended for most use cases.\n - PROTOCOL_OPEN_PROTOCOL: Open Protocol (TiDB native format). Encodes multiple events into one message.\n - PROTOCOL_AVRO: Apache Avro format. Supports Confluent Schema Registry and AWS Glue Schema Registry.\n - PROTOCOL_DEBEZIUM: Debezium format."
    },
    "KafkaDownstreamConfigKafkaVersion": {
      "type": "string",
      "enum": [
        "KAFKA_VERSION_UNSPECIFIED",
        "KAFKA_VERSION_0XX",
        "KAFKA_VERSION_1XX",
        "KAFKA_VERSION_2XX",
        "KAFKA_VERSION_3XX"
      ],
      "default": "KAFKA_VERSION_UNSPECIFIED",
      "description": "KafkaVersion defines supported Kafka broker versions.\n\n - KAFKA_VERSION_0XX: Kafka 0.x\n - KAFKA_VERSION_1XX: Kafka 1.x\n - KAFKA_VERSION_2XX: Kafka 2.x\n - KAFKA_VERSION_3XX: Kafka 3.x"
    },
    "KafkaDownstreamConfigTopicPartitionConfig": {
      "type": "object",
      "properties": {
        "dispatchType": {
          "$ref": "#/definitions/TopicPartitionConfigDispatchType",
          "example": "DISPATCH_TYPE_BY_TABLE",
          "description": "How to dispatch messages to topics.\n\n- `\"DISPATCH_TYPE_UNSPECIFIED\"`: Default value.\n\n- `\"DISPATCH_TYPE_ONE_TOPIC\"`: All messages go to a single topic.\n\n- `\"DISPATCH_TYPE_BY_TABLE\"`: Each table gets its own topic.\n\n- `\"DISPATCH_TYPE_BY_DATABASE\"`: Each database gets its own topic.",
          "title": "How to dispatch messages to topics.\nExample: DISPATCH_TYPE_BY_TABLE"
        },
        "defaultTopic": {
          "type": "string",
          "title": "Default topic name (used with DISPATCH_TYPE_ONE_TOPIC).\nExample: \"cdc-events\""
        },
        "topicPrefix": {
          "type": "string",
          "title": "Topic prefix (used with DISPATCH_TYPE_BY_TABLE or DISPATCH_TYPE_BY_DATABASE).\nExample: \"cdc-\""
        },
        "separator": {
          "type": "string",
          "title": "Separator between prefix and table/database name.\nExample: \".\""
        },
        "topicSuffix": {
          "type": "string",
          "title": "Topic suffix.\nExample: \"-v1\""
        },
        "replicationFactor": {
          "type": "integer",
          "format": "int64",
          "example": 3,
          "description": "Replication factor for auto-created topics.",
          "title": "Replication factor for auto-created topics.\nExample: 3",
          "minimum": 1
        },
        "partitionNum": {
          "type": "integer",
          "format": "int64",
          "example": 6,
          "description": "Number of partitions for auto-created topics.",
          "title": "Number of partitions for auto-created topics.\nExample: 6",
          "minimum": 1
        },
        "partitionDispatchers": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/TopicPartitionConfigPartitionDispatcherConfig"
          },
          "description": "Custom partition dispatcher configurations."
        }
      },
      "description": "TopicPartitionConfig defines topic and partition configuration.",
      "required": [
        "dispatchType",
        "replicationFactor",
        "partitionNum"
      ]
    },
    "NetworkInfoNetworkType": {
      "type": "string",
      "enum": [
        "NETWORK_TYPE_UNSPECIFIED",
        "NETWORK_TYPE_PUBLIC",
        "NETWORK_TYPE_VPC_PEERING",
        "NETWORK_TYPE_PRIVATE_LINK"
      ],
      "default": "NETWORK_TYPE_UNSPECIFIED",
      "description": "NetworkType defines the possible network types.\n\n - NETWORK_TYPE_UNSPECIFIED: Default value.\n - NETWORK_TYPE_PUBLIC: Public internet access.\n - NETWORK_TYPE_VPC_PEERING: AWS VPC Peering.\n - NETWORK_TYPE_PRIVATE_LINK: Private endpoint connectivity managed by TiDB Cloud."
    },
    "S3DataFormatBinaryEncodingMethod": {
      "type": "string",
      "enum": [
        "BINARY_ENCODING_METHOD_UNSPECIFIED",
        "BASE64",
        "HEX"
      ],
      "default": "BINARY_ENCODING_METHOD_UNSPECIFIED",
      "description": "BinaryEncodingMethod defines how binary values are encoded.\n\n - BASE64: Base64 encoding.\n - HEX: Hexadecimal encoding."
    },
    "S3DataFormatDateSeparator": {
      "type": "string",
      "enum": [
        "DATE_SEPARATOR_UNSPECIFIED",
        "NONE",
        "YEAR",
        "MONTH",
        "DAY"
      ],
      "default": "DATE_SEPARATOR_UNSPECIFIED",
      "description": "DateSeparator defines the date separator options for directory structure.\n\n - NONE: No date separator.\n - YEAR: Separate by year.\n - MONTH: Separate by month.\n - DAY: Separate by day."
    },
    "TopicPartitionConfigDispatchType": {
      "type": "string",
      "enum": [
        "DISPATCH_TYPE_UNSPECIFIED",
        "DISPATCH_TYPE_ONE_TOPIC",
        "DISPATCH_TYPE_BY_TABLE",
        "DISPATCH_TYPE_BY_DATABASE"
      ],
      "default": "DISPATCH_TYPE_UNSPECIFIED",
      "description": "DispatchType defines how messages are dispatched to topics.\n\n - DISPATCH_TYPE_ONE_TOPIC: All messages go to a single topic.\n - DISPATCH_TYPE_BY_TABLE: Each table gets its own topic.\n - DISPATCH_TYPE_BY_DATABASE: Each database gets its own topic."
    },
    "TopicPartitionConfigPartitionDispatcher": {
      "type": "string",
      "enum": [
        "PARTITION_DISPATCHER_UNSPECIFIED",
        "TABLE",
        "INDEX_VALUE",
        "Timestamp",
        "COLUMNS"
      ],
      "default": "PARTITION_DISPATCHER_UNSPECIFIED",
      "description": "PartitionDispatcher defines the partition dispatch strategies.\n\n - TABLE: Dispatch by table name.\n - INDEX_VALUE: Dispatch by index value.\n - Timestamp: Dispatch by timestamp.\n - COLUMNS: Dispatch by column values."
    },
    "TopicPartitionConfigPartitionDispatcherConfig": {
      "type": "object",
      "properties": {
        "partitionType": {
          "$ref": "#/definitions/TopicPartitionConfigPartitionDispatcher",
          "example": "TABLE",
          "description": "The partition dispatch strategy.\n\n- `\"PARTITION_DISPATCHER_UNSPECIFIED\"`: Default value.\n\n- `\"TABLE\"`: Dispatch by table name.\n\n- `\"INDEX_VALUE\"`: Dispatch by index value.\n\n- `\"Timestamp\"`: Dispatch by timestamp.\n\n- `\"COLUMNS\"`: Dispatch by column values.",
          "title": "The partition dispatch strategy.\nExample: TABLE"
        },
        "matcher": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "Table matchers for this dispatcher.\nExample: [\"mydb.orders\"]"
        },
        "indexName": {
          "type": "string",
          "title": "Index name (used with INDEX_VALUE dispatcher).\nExample: \"primary\""
        },
        "columns": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "Column names (used with COLUMNS dispatcher).\nExample: [\"user_id\", \"order_id\"]"
        }
      },
      "description": "PartitionDispatcherConfig defines a custom partition dispatcher configuration.",
      "required": [
        "partitionType"
      ]
    },
    "protobufAny": {
      "type": "object",
      "properties": {
        "@type": {
          "type": "string"
        }
      },
      "additionalProperties": {}
    },
    "rpcStatus": {
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "format": "int32"
        },
        "message": {
          "type": "string"
        },
        "details": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/protobufAny"
          }
        }
      }
    },
    "v1beta1AzureBlobDownstreamConfig": {
      "type": "object",
      "properties": {
        "endpoint": {
          "$ref": "#/definitions/v1beta1AzureBlobDownstreamConfigEndpoint",
          "description": "Azure Blob endpoint configuration."
        },
        "dataFormat": {
          "$ref": "#/definitions/v1beta1S3DataFormat",
          "description": "Data format configuration (reuses S3 data format)."
        },
        "storageFlushConfig": {
          "$ref": "#/definitions/v1beta1StorageFlushConfig",
          "description": "Storage flush configuration."
        }
      },
      "description": "AzureBlobDownstreamConfig defines the Azure Blob downstream configuration.",
      "required": [
        "endpoint",
        "dataFormat"
      ]
    },
    "v1beta1AzureBlobDownstreamConfigEndpoint": {
      "type": "object",
      "properties": {
        "blobUri": {
          "type": "string",
          "example": "https://myaccount.blob.core.windows.net/mycontainer/cdc-data",
          "description": "Azure Blob container URI.",
          "title": "Azure Blob container URI.\nExample: \"https://myaccount.blob.core.windows.net/mycontainer/cdc-data\""
        },
        "sasToken": {
          "type": "string",
          "example": "sv=2022-11-02\u0026ss=b\u0026srt=sco\u0026sp=rwdlaciytfx\u0026se=2026-06-09T00:00:00Z\u0026st=2026-06-08T00:00:00Z\u0026spr=https\u0026sig=...",
          "description": "SAS token for authentication. This field is input-only and not returned in responses.",
          "title": "SAS token for authentication.\nExample: \"sv=2022-11-02\u0026ss=b\u0026srt=sco\u0026sp=rwdlaciytfx\u0026se=2026-06-09T00:00:00Z\u0026st=2026-06-08T00:00:00Z\u0026spr=https\u0026sig=...\""
        }
      },
      "description": "Endpoint defines the Azure Blob connection endpoint configuration.",
      "required": [
        "blobUri",
        "sasToken"
      ]
    },
    "v1beta1Changefeed": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "example": "67890",
          "description": "Unique identifier of the changefeed (generated by the system).",
          "title": "Unique identifier of the changefeed (generated by the system).\nExample: \"67890\"\n(-- api-linter: core::0203::resource-name-identifier=disabled)\n(-- api-linter: core::0148::use-uid=disabled --)\n(-- api-linter: core::0141::forbidden-types=disabled --)",
          "readOnly": true
        },
        "clusterId": {
          "type": "string",
          "example": "1234567890123",
          "description": "The ID of the source TiDB cluster.",
          "title": "The ID of the source TiDB cluster.\nExample: \"1234567890123\""
        },
        "name": {
          "type": "string",
          "example": "my-kafka-changefeed",
          "description": "User-defined name for the changefeed. Must be unique within the cluster.",
          "title": "User-defined name for the changefeed.\nExample: \"my-kafka-changefeed\"\n(-- api-linter: core::0203::resource-name-identifier=disabled)"
        },
        "networkInfo": {
          "$ref": "#/definitions/v1beta1NetworkInfo",
          "description": "Network configuration for connecting to the downstream.\nRequired for Kafka, MySQL, and Pulsar downstream types."
        },
        "state": {
          "$ref": "#/definitions/ChangefeedState",
          "example": "RUNNING",
          "description": "Current state of the changefeed.\n\n- `\"STATE_UNSPECIFIED\"`: Default value.\n\n- `\"RUNNING\"`: Changefeed is actively replicating data.\n\n- `\"FAILED\"`: Changefeed encountered a fatal error and stopped.\n\n- `\"ERROR\"`: Changefeed encountered an error but may recover.\n\n- `\"CREATING\"`: Changefeed is being created.\n\n- `\"PAUSING\"`: Changefeed is in the process of pausing.\n\n- `\"PAUSED\"`: Changefeed is paused.\n\n- `\"DELETING\"`: Changefeed is being deleted.\n\n- `\"DELETED\"`: Changefeed has been deleted.\n\n- `\"EDITING\"`: Changefeed configuration is being updated.\n\n- `\"WARNING\"`: Changefeed is running but has warnings.\n\n- `\"SCALING\"`: Changefeed is being scaled.",
          "title": "Current state of the changefeed.\nExample: RUNNING",
          "readOnly": true
        },
        "createTime": {
          "type": "string",
          "format": "date-time",
          "title": "Timestamp when the changefeed was created.\nExample: \"2026-06-08T10:30:00Z\"",
          "readOnly": true
        },
        "checkpointTso": {
          "type": "string",
          "format": "uint64",
          "title": "The TSO (Timestamp Oracle) of the changefeed's current checkpoint.\nRepresents the last successfully replicated timestamp.\nExample: 452348901234567890\n(-- api-linter: core::0141::forbidden-types=disabled --)",
          "readOnly": true
        },
        "checkpointTs": {
          "type": "string",
          "format": "date-time",
          "title": "Human-readable timestamp of the changefeed's current checkpoint.\nExample: \"2026-06-08T10:35:00Z\"",
          "readOnly": true
        },
        "replicationCapacity": {
          "type": "string",
          "example": "4rcu",
          "description": "The replication capacity (RCU size) for the changefeed.",
          "title": "The replication capacity (RCU size) for the changefeed.\nExample: \"4rcu\""
        },
        "downstreamType": {
          "$ref": "#/definitions/v1beta1DownstreamType",
          "example": "KAFKA",
          "description": "The downstream type. Cannot be changed after creation.\n\n- `\"KAFKA\"`: Apache Kafka\n\n- `\"MYSQL\"`: MySQL-compatible database\n\n- `\"S3\"`: Amazon S3 or S3-compatible storage\n\n- `\"GCS\"`: Google Cloud Storage\n\n- `\"AZURE_BLOB\"`: Azure Blob Storage",
          "title": "The downstream type. Cannot be changed after creation.\nExample: KAFKA"
        },
        "tableConfig": {
          "$ref": "#/definitions/v1beta1TableConfig",
          "description": "Table filtering and event filter configuration.\nThis field is editable only when the changefeed is in PAUSED state."
        },
        "startPosition": {
          "$ref": "#/definitions/v1beta1StartPosition",
          "description": "Start position configuration.\nThis field can only be set during creation and cannot be modified afterward."
        },
        "kafka": {
          "$ref": "#/definitions/v1beta1KafkaDownstreamConfig",
          "description": "Kafka downstream configuration."
        },
        "mysql": {
          "$ref": "#/definitions/v1beta1MySQLDownstreamConfig",
          "description": "MySQL downstream configuration."
        },
        "s3": {
          "$ref": "#/definitions/v1beta1S3DownstreamConfig",
          "description": "S3 downstream configuration."
        },
        "gcs": {
          "$ref": "#/definitions/v1beta1GcsDownstreamConfig",
          "description": "GCS downstream configuration."
        },
        "azureBlob": {
          "$ref": "#/definitions/v1beta1AzureBlobDownstreamConfig",
          "description": "Azure Blob downstream configuration."
        },
        "error": {
          "type": "string",
          "example": "kafka: broker not available",
          "description": "Error message if state is FAILED or ERROR. Empty otherwise.",
          "title": "Error message if state is FAILED or ERROR. Empty otherwise.\nExample: \"kafka: broker not available\"",
          "readOnly": true
        }
      },
      "description": "Changefeed represents a changefeed instance.\nA changefeed captures row-level changes from TiDB and replicates them to a downstream system.",
      "required": [
        "clusterId",
        "name",
        "replicationCapacity",
        "downstreamType",
        "tableConfig",
        "startPosition"
      ]
    },
    "v1beta1ChangefeedKernelInfo": {
      "type": "object",
      "properties": {
        "changefeedId": {
          "type": "string",
          "example": "2068955910051614720",
          "description": "The changefeed identifier echoed back for correlation. Matches the id field of v1beta1Changefeed.",
          "title": "The changefeed identifier echoed back for correlation.\nMatches the id field of v1beta1Changefeed.\nExample: \"2068955910051614720\"",
          "readOnly": true
        },
        "ticdcVersion": {
          "type": "string",
          "example": "v8.5.4",
          "description": "The TiCDC component version that the changefeed is currently running on (e.g. `\"v8.5.4\"`, `\"v7.5.6\"`). Corresponds to the `--version` output of the TiCDC binary.",
          "title": "The TiCDC component version that the changefeed is currently running on.\nExample: \"v8.5.4\"",
          "readOnly": true
        },
        "imageTag": {
          "type": "string",
          "example": "v8.5.4-release.1",
          "description": "The effective image tag of the TiCDC component the changefeed runs on.",
          "title": "The effective image tag of the TiCDC component the changefeed runs on.\nExample: \"v8.5.4-release.1\"",
          "readOnly": true
        },
        "kernelType": {
          "$ref": "#/definitions/ChangefeedKernelInfoKernelType",
          "description": "The TiCDC kernel type that the changefeed is running on.",
          "readOnly": true
        }
      },
      "description": "ChangefeedKernelInfo represents the TiCDC kernel runtime info of a changefeed."
    },
    "v1beta1ChangefeedRCU": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "4rcu",
          "description": "The identifier of the RCU option.",
          "title": "The identifier of the RCU option.\nExample: \"4rcu\"",
          "readOnly": true
        },
        "displayName": {
          "type": "string",
          "example": "4 RCU - Small",
          "description": "Human-readable display name.",
          "title": "Human-readable display name.\nExample: \"4 RCU - Small\"",
          "readOnly": true
        },
        "rcuNum": {
          "type": "integer",
          "format": "int64",
          "example": 4,
          "description": "The number of RCU (Resource Capacity Units) allocated.",
          "title": "The number of RCU (Resource Capacity Units) allocated.\nExample: 4",
          "readOnly": true
        },
        "rpsLimit": {
          "type": "integer",
          "format": "int64",
          "example": 5000,
          "description": "The maximum rows per second this RCU option can process.",
          "title": "The maximum rows per second this instance type can process.\nExample: 5000",
          "readOnly": true
        }
      },
      "description": "ChangefeedRCU represents a changefeed RCU option."
    },
    "v1beta1Connection": {
      "type": "object",
      "properties": {
        "endpoint": {
          "type": "string",
          "example": "mysql.example.com:3306",
          "description": "Endpoint address (host:port). Required for PUBLIC/VPC_PEERING networks. Optional for PRIVATE_LINK, where the endpoint can be assembled server-side from sink endpoint and ports.",
          "title": "Endpoint address (host:port).\nRequired for PUBLIC/VPC_PEERING networks.\nOptional for PRIVATE_LINK, where the endpoint can be assembled server-side\nfrom sink endpoint and ports.\nExample: \"mysql.example.com:3306\""
        },
        "username": {
          "type": "string",
          "example": "cdc_user",
          "description": "Username for authentication.",
          "title": "Username for authentication.\nExample: \"cdc_user\""
        },
        "password": {
          "type": "string",
          "example": "********",
          "description": "Password for authentication. This field is input-only and not returned in responses."
        }
      },
      "description": "Connection defines the connection configuration for MySQL downstream.",
      "required": [
        "username"
      ]
    },
    "v1beta1CreateChangefeedRequest": {
      "type": "object",
      "properties": {
        "changefeed": {
          "$ref": "#/definitions/v1beta1Changefeed",
          "description": "The changefeed to create. All required fields must be set."
        },
        "dryRun": {
          "type": "boolean",
          "example": true,
          "description": "Whether to run dry-run validation only (parameter + connectivity checks) without creating a changefeed.",
          "title": "Whether to run dry-run validation only (parameter + connectivity checks) without creating a changefeed.\nExample: true"
        }
      },
      "description": "CreateChangefeedRequest represents the request for creating a changefeed.",
      "required": [
        "changefeed"
      ]
    },
    "v1beta1DownstreamType": {
      "type": "string",
      "enum": [
        "DOWNSTREAM_TYPE_UNSPECIFIED",
        "KAFKA",
        "MYSQL",
        "S3",
        "GCS",
        "AZURE_BLOB"
      ],
      "default": "DOWNSTREAM_TYPE_UNSPECIFIED",
      "description": "DownstreamType defines the possible downstream types for a changefeed.\n\n - DOWNSTREAM_TYPE_UNSPECIFIED: Default value. Should not be used.\n - KAFKA: Apache Kafka.\n - MYSQL: MySQL-compatible database.\n - S3: Amazon S3 or S3-compatible storage.\n - GCS: Google Cloud Storage.\n - AZURE_BLOB: Azure Blob Storage."
    },
    "v1beta1EventFilter": {
      "type": "object",
      "properties": {
        "tableMatchers": {
          "type": "array",
          "example": [
            "mydb.orders",
            "mydb.user_*"
          ],
          "items": {
            "type": "string"
          },
          "description": "Table name patterns to match (allow list). Uses the same syntax as TiCDC table filter. Supports wildcards like `*` and `?`. Matches database name, so database-level DDLs (e.g., DROP DATABASE) will also be matched.",
          "title": "Table name patterns to match (allow list). Uses the same syntax as TiCDC table filter.\nSupports wildcards. Matches database name, so be careful with database-level DDLs.\nExample: [\"mydb.orders\", \"mydb.user_*\", \"test.*\"]"
        },
        "ignoredEvents": {
          "type": "array",
          "example": [
            "insert",
            "delete",
            "alter table"
          ],
          "items": {
            "type": "string"
          },
          "description": "Event types to ignore. DML events: `insert`, `update`, `delete`, `all dml`. DDL events: `create schema`, `drop schema`, `create table`, `drop table`, `rename table`, `truncate table`, `alter table`, `add table partition`, `drop table partition`, `truncate table partition`, `create view`, `drop view`, `modify schema charset and collate`, `recover table`, `rebase auto id`, `modify table comment`, `modify table charset and collate`, `exchange table partition`, `reorganize table partition`, `alter table partitioning`, `remove table partitioning`, `add column`, `drop column`, `modify column`, `set default value`, `add primary key`, `drop primary key`, `rename index`, `alter index visibility`, `alter ttl info`, `alter ttl remove`, `multi schema change`."
        },
        "ignoredSqlStatements": {
          "type": "array",
          "example": [
            "^drop",
            "add column"
          ],
          "items": {
            "type": "string"
          },
          "description": "SQL statement patterns to ignore (DDL only). Supports regular expressions. Only applies to DDL events.",
          "title": "SQL statement patterns to ignore (DDL only). Supports regular expressions.\nExample: [\"^drop\", \"add column\"]"
        },
        "ignoredInsertValueExpression": {
          "type": "string",
          "example": "status = 'deleted'",
          "description": "SQL expression to filter INSERT DML events by column value. Uses SQL expressions in default SQL mode. All tables matched by `table_matchers` must contain all columns referenced in this expression.",
          "title": "Expression to filter INSERT events by column value.\nUses SQL expressions in default SQL mode.\nAll tables matched by `table_matchers` must contain all columns referenced.\nExample: \"status = 'deleted'\""
        },
        "ignoredUpdateOldValueExpression": {
          "type": "string",
          "example": "status = 'archived'",
          "description": "SQL expression to filter UPDATE DML events by old column value (before update). Uses SQL expressions in default SQL mode. All tables matched by `table_matchers` must contain all columns referenced in this expression.",
          "title": "Expression to filter UPDATE events by old column value (before update).\nUses SQL expressions in default SQL mode.\nAll tables matched by `table_matchers` must contain all columns referenced.\nExample: \"status = 'archived'\""
        },
        "ignoredUpdateNewValueExpression": {
          "type": "string",
          "example": "status = 'deleted'",
          "description": "SQL expression to filter UPDATE DML events by new column value (after update). Uses SQL expressions in default SQL mode. All tables matched by `table_matchers` must contain all columns referenced in this expression.",
          "title": "Expression to filter UPDATE events by new column value (after update).\nUses SQL expressions in default SQL mode.\nAll tables matched by `table_matchers` must contain all columns referenced.\nExample: \"status = 'deleted'\""
        },
        "ignoredDeleteValueExpression": {
          "type": "string",
          "example": "soft_delete = true",
          "description": "SQL expression to filter DELETE DML events by column value. Uses SQL expressions in default SQL mode. All tables matched by `table_matchers` must contain all columns referenced in this expression.",
          "title": "Expression to filter DELETE events by column value.\nUses SQL expressions in default SQL mode.\nAll tables matched by `table_matchers` must contain all columns referenced.\nExample: \"soft_delete = true\""
        }
      },
      "description": "EventFilter defines rules for filtering specific events in a changefeed.\nUsed to skip or modify certain DML and DDL operations during replication.\n\nReference: https://docs.pingcap.com/tidb/stable/ticdc-filter/#event-filter-rules\n\nMultiple event filters can be configured simultaneously. Each filter rule can:\n- Match specific tables using `table_matchers` (supports wildcards)\n- Ignore specific event types (DML/DDL) via `ignored_events`\n- Ignore DDL statements matching regex patterns via `ignored_sql_statements`\n- Filter DML events by column value expressions\n\nImportant caveats:\n- When TiDB updates a clustered index column, UPDATE is split into DELETE + INSERT.\n  TiCDC cannot identify these as UPDATE events, so update-specific filters may not apply.\n- All tables matched by `table_matchers` must contain all columns referenced in\n  value expressions. Schema changes that remove required columns will cause the\n  replication task to fail."
    },
    "v1beta1GcsDownstreamConfig": {
      "type": "object",
      "properties": {
        "endpoint": {
          "$ref": "#/definitions/v1beta1GcsDownstreamConfigEndpoint",
          "description": "GCS endpoint configuration."
        },
        "dataFormat": {
          "$ref": "#/definitions/v1beta1S3DataFormat",
          "description": "Data format configuration (reuses S3 data format)."
        },
        "storageFlushConfig": {
          "$ref": "#/definitions/v1beta1StorageFlushConfig",
          "description": "Storage flush configuration."
        }
      },
      "description": "GcsDownstreamConfig defines the GCS downstream configuration.",
      "required": [
        "endpoint",
        "dataFormat"
      ]
    },
    "v1beta1GcsDownstreamConfigEndpoint": {
      "type": "object",
      "properties": {
        "gcsUri": {
          "type": "string",
          "example": "gs://my-bucket/cdc-data",
          "description": "GCS bucket URI.",
          "title": "GCS bucket URI.\nExample: \"gs://my-bucket/cdc-data\""
        }
      },
      "description": "Endpoint defines the GCS connection endpoint configuration.",
      "required": [
        "gcsUri"
      ]
    },
    "v1beta1KafkaDownstreamConfig": {
      "type": "object",
      "properties": {
        "broker": {
          "$ref": "#/definitions/KafkaDownstreamConfigBroker",
          "description": "Broker connection configuration."
        },
        "authentication": {
          "$ref": "#/definitions/KafkaDownstreamConfigAuthentication",
          "description": "Authentication configuration."
        },
        "dataFormat": {
          "$ref": "#/definitions/KafkaDownstreamConfigDataFormat",
          "description": "Data format and serialization configuration."
        },
        "topicPartitionConfig": {
          "$ref": "#/definitions/KafkaDownstreamConfigTopicPartitionConfig",
          "description": "Topic and partition configuration."
        },
        "columnSelectors": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/KafkaDownstreamConfigColumnSelector"
          },
          "description": "Column selector for filtering specific columns."
        }
      },
      "description": "KafkaDownstreamConfig defines the Kafka downstream configuration.",
      "required": [
        "broker",
        "authentication",
        "dataFormat",
        "topicPartitionConfig"
      ]
    },
    "v1beta1ListChangefeedRCUsResponse": {
      "type": "object",
      "properties": {
        "rcus": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/v1beta1ChangefeedRCU"
          },
          "description": "The list of available RCU options.",
          "readOnly": true
        }
      },
      "description": "ListChangefeedRCUsResponse represents the response for listing RCU options."
    },
    "v1beta1ListChangefeedsResponse": {
      "type": "object",
      "properties": {
        "changefeeds": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/v1beta1Changefeed"
          },
          "description": "The list of changefeeds matching the query.",
          "readOnly": true
        },
        "totalSize": {
          "type": "integer",
          "format": "int32",
          "example": 42,
          "description": "Total number of changefeeds across all pages.",
          "title": "Total number of changefeeds across all pages.\nExample: 42",
          "readOnly": true
        },
        "nextPageToken": {
          "type": "string",
          "example": "eyJpZCI6Njc4OTB9",
          "description": "Token for retrieving the next page. Empty if no more pages.",
          "title": "Token for retrieving the next page. Empty if no more pages.\nExample: \"eyJpZCI6Njc4OTB9\"",
          "readOnly": true
        }
      },
      "title": "ListChangefeedsResponse represents the response for listing changefeeds\n(-- api-linter: core::0158::response-page-size-field=disabled --)\n(-- api-linter: core::0158::response-next-page-token-field=disabled --)"
    },
    "v1beta1MySQLDownstreamConfig": {
      "type": "object",
      "properties": {
        "connection": {
          "$ref": "#/definitions/v1beta1Connection",
          "description": "Connection configuration."
        }
      },
      "description": "MySQLDownstreamConfig defines the MySQL downstream configuration.",
      "required": [
        "connection"
      ]
    },
    "v1beta1NetworkInfo": {
      "type": "object",
      "properties": {
        "networkType": {
          "$ref": "#/definitions/NetworkInfoNetworkType",
          "example": "NETWORK_TYPE_PUBLIC",
          "description": "The network type to use.\n\n- `\"NETWORK_TYPE_UNSPECIFIED\"`: Default value.\n\n- `\"NETWORK_TYPE_PUBLIC\"`: Public internet access.\n\n- `\"NETWORK_TYPE_VPC_PEERING\"`: AWS VPC Peering.\n\n- `\"NETWORK_TYPE_PRIVATE_LINK\"`: Private endpoint connectivity managed by TiDB Cloud, including AWS PrivateLink, Azure Private Link, and GCP Private Service Connect.",
          "title": "The network type to use.\nExample: NETWORK_TYPE_PUBLIC"
        },
        "sinkEndpointId": {
          "type": "string",
          "format": "uint64",
          "title": "The sink endpoint ID for VPC Peering or Private Link.\nRequired when network_type is VPC_PEERING or PRIVATE_LINK.\nExample: 12345"
        },
        "ports": {
          "type": "array",
          "items": {
            "type": "integer",
            "format": "int64"
          },
          "title": "The ports for private endpoint connectivity.\nRequired when network_type is PRIVATE_LINK.\nThe server uses these ports to construct broker endpoints as \u003csink_endpoint_address\u003e:\u003cport\u003e.\nExample: [9092]"
        }
      },
      "description": "NetworkInfo defines the network configuration for connecting to downstream.",
      "required": [
        "networkType"
      ]
    },
    "v1beta1S3DataFormat": {
      "type": "object",
      "properties": {
        "protocol": {
          "$ref": "#/definitions/v1beta1S3DataFormatProtocol",
          "example": "PROTOCOL_CANAL_JSON",
          "description": "Output protocol.\n\n- `\"PROTOCOL_UNSPECIFIED\"`: Default value.\n\n- `\"PROTOCOL_CSV\"`: CSV format.\n\n- `\"PROTOCOL_CANAL_JSON\"`: Canal JSON format.\n\n- `\"PROTOCOL_PARQUET\"`: Apache Parquet format.",
          "title": "Output protocol.\nExample: PROTOCOL_CANAL_JSON"
        },
        "terminator": {
          "type": "string",
          "title": "Line terminator character.\nExample: \"\\n\""
        },
        "dateSeparator": {
          "$ref": "#/definitions/S3DataFormatDateSeparator",
          "example": "DAY",
          "description": "Date separator for directory structure.\n\n- `\"DATE_SEPARATOR_UNSPECIFIED\"`: Default value.\n\n- `\"NONE\"`: No date separator.\n\n- `\"YEAR\"`: Separate by year.\n\n- `\"MONTH\"`: Separate by month.\n\n- `\"DAY\"`: Separate by day.",
          "title": "Date separator for directory structure.\n- NONE: No date separator (default).\n- YEAR: Separate by year.\n- MONTH: Separate by month.\n- DAY: Separate by day.\nExample: DAY"
        },
        "enableTidbExtension": {
          "type": "boolean",
          "title": "Whether to include TiDB extension fields.\nExample: true"
        },
        "delimiter": {
          "type": "string",
          "title": "CSV delimiter character.\nExample: \",\""
        },
        "quote": {
          "type": "string",
          "title": "CSV quote character.\nExample: \"\\\"\""
        },
        "null": {
          "type": "string",
          "title": "CSV null value representation.\nExample: \"NULL\""
        },
        "includeCommitTs": {
          "type": "boolean",
          "title": "Whether to include commit timestamp in the output.\nExample: true"
        },
        "binaryEncodingMethod": {
          "$ref": "#/definitions/S3DataFormatBinaryEncodingMethod",
          "example": "BASE64",
          "description": "Binary encoding method.\n\n- `\"BINARY_ENCODING_METHOD_UNSPECIFIED\"`: Default value.\n\n- `\"BASE64\"`: Base64 encoding.\n\n- `\"HEX\"`: Hexadecimal encoding.",
          "title": "Binary encoding method.\nExample: BASE64"
        },
        "outputRawChangeEvent": {
          "type": "boolean",
          "title": "Whether to output raw change events.\nExample: false"
        },
        "outputFieldHeader": {
          "type": "boolean",
          "title": "Whether to output field headers.\nExample: true"
        }
      },
      "description": "S3DataFormat defines the data format configuration for S3-compatible storage.",
      "required": [
        "protocol"
      ]
    },
    "v1beta1S3DataFormatProtocol": {
      "type": "string",
      "enum": [
        "PROTOCOL_UNSPECIFIED",
        "PROTOCOL_CSV",
        "PROTOCOL_CANAL_JSON",
        "PROTOCOL_PARQUET"
      ],
      "default": "PROTOCOL_UNSPECIFIED",
      "description": "Protocol defines the supported output protocols for cloud storage sinks.\n\n - PROTOCOL_CSV: CSV format.\n - PROTOCOL_CANAL_JSON: Canal JSON format.\n - PROTOCOL_PARQUET: Apache Parquet format."
    },
    "v1beta1S3DownstreamConfig": {
      "type": "object",
      "properties": {
        "endpoint": {
          "$ref": "#/definitions/v1beta1S3DownstreamConfigEndpoint",
          "description": "S3 endpoint configuration."
        },
        "dataFormat": {
          "$ref": "#/definitions/v1beta1S3DataFormat",
          "description": "Data format configuration."
        },
        "storageFlushConfig": {
          "$ref": "#/definitions/v1beta1StorageFlushConfig",
          "description": "Storage flush configuration."
        }
      },
      "description": "S3DownstreamConfig defines the S3 downstream configuration.",
      "required": [
        "endpoint",
        "dataFormat"
      ]
    },
    "v1beta1S3DownstreamConfigEndpoint": {
      "type": "object",
      "properties": {
        "s3Uri": {
          "type": "string",
          "example": "s3://my-bucket/cdc-data",
          "description": "S3 bucket URI.",
          "title": "S3 bucket URI.\nExample: \"s3://my-bucket/cdc-data\""
        },
        "authType": {
          "$ref": "#/definitions/EndpointS3AuthType",
          "example": "S3_AUTH_TYPE_AK_SK",
          "description": "Authentication type.\n\n- `\"S3_AUTH_TYPE_UNSPECIFIED\"`: Default value.\n\n- `\"S3_AUTH_TYPE_AK_SK\"`: Access Key / Secret Key authentication.\n\n- `\"S3_AUTH_TYPE_ASSUME_ROLE\"`: IAM Assume Role authentication.",
          "title": "Authentication type.\nExample: S3_AUTH_TYPE_AK_SK"
        },
        "accessKey": {
          "type": "string",
          "title": "Access key ID. Required for AK/SK authentication.\nExample: \"AKIAIOSFODNN7EXAMPLE\""
        },
        "secretKey": {
          "type": "string",
          "title": "Secret access key. Required for AK/SK authentication.\nExample: \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\""
        },
        "iamAssumedRoleArn": {
          "type": "string",
          "title": "IAM assumed role ARN. Required for Assume Role authentication.\nExample: \"arn:aws:iam::123456789012:role/CDCS3AccessRole\""
        }
      },
      "description": "Endpoint defines the S3 connection endpoint configuration.",
      "required": [
        "s3Uri",
        "authType"
      ]
    },
    "v1beta1StartPosition": {
      "type": "object",
      "properties": {
        "mode": {
          "$ref": "#/definitions/v1beta1StartPositionMode",
          "example": "FROM_NOW",
          "description": "The start position mode.\n\n- `\"MODE_UNSPECIFIED\"`: Default value.\n\n- `\"FROM_NOW\"`: Start from the current time.\n\n- `\"FROM_TSO\"`: Start from a specific TSO.\n\n- `\"FROM_UTC\"`: Start from a specific UTC timestamp.",
          "title": "The start position mode.\nExample: FROM_NOW"
        },
        "startTso": {
          "type": "string",
          "format": "uint64",
          "title": "Start from a specific TSO. Used with FROM_TSO mode.\nExample: 452348901234567890\n(-- api-linter: core::0141::forbidden-types=disabled --)"
        },
        "startTimestamp": {
          "type": "string",
          "title": "Start from a specific timestamp (RFC3339 format). Used with FROM_UTC mode.\nExample: \"2026-01-01T00:00:00Z\""
        }
      },
      "description": "StartPosition defines where the changefeed starts reading changes.",
      "required": [
        "mode"
      ]
    },
    "v1beta1StartPositionMode": {
      "type": "string",
      "enum": [
        "MODE_UNSPECIFIED",
        "FROM_NOW",
        "FROM_TSO",
        "FROM_UTC"
      ],
      "default": "MODE_UNSPECIFIED",
      "description": "Mode defines the start position mode.\n\n - MODE_UNSPECIFIED: Default value.\n - FROM_NOW: Start from the current time.\n - FROM_TSO: Start from a specific TSO.\n - FROM_UTC: Start from a specific UTC timestamp."
    },
    "v1beta1StorageFlushConfig": {
      "type": "object",
      "properties": {
        "interval": {
          "type": "string",
          "example": "1m",
          "description": "Flush interval. Range: 2s to 10m. Default: \"1m\". Files are flushed when either interval or file_size threshold is met.",
          "title": "Flush interval (duration string).\nRange: 2s to 10m. Default: \"1m\".\nExample: \"1m\""
        },
        "fileSize": {
          "type": "string",
          "format": "uint64",
          "example": 67108864,
          "description": "File size threshold in bytes. Range: 1MB to 512MB. Default: 64MB. Files are flushed when either interval or file_size threshold is met.",
          "title": "File size threshold in bytes. Data is flushed when this size is reached.\nRange: 1048576 (1MB) to 536870912 (512MB). Default: 67108864 (64MB).\nExample: 67108864",
          "maximum": 536870912,
          "minimum": 1048576
        }
      },
      "description": "StorageFlushConfig defines the storage flush configuration.\nControls when data is flushed to the storage backend.\nFiles are flushed when either interval or file_size threshold is met."
    },
    "v1beta1TableConfig": {
      "type": "object",
      "properties": {
        "filterRules": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "Filter rules for tables. Supports wildcards.\nExample: [\"mydb.orders\", \"mydb.user_*\", \"!mydb.secret_*\"]"
        },
        "mode": {
          "$ref": "#/definitions/v1beta1TableConfigMode",
          "example": "IGNORE_NOT_SUPPORT_TABLE",
          "description": "Mode for handling unsupported tables.\n\n- `\"MODE_UNSPECIFIED\"`: Default value.\n\n- `\"IGNORE_NOT_SUPPORT_TABLE\"`: Skip unsupported tables silently.\n\n- `\"FORCE_SYNC\"`: Force sync all tables (may fail on unsupported tables).",
          "title": "Mode for handling unsupported tables.\nExample: IGNORE_NOT_SUPPORT_TABLE"
        },
        "caseSensitive": {
          "type": "boolean",
          "title": "Whether filter rules are case-sensitive.\nDefault: false.\nExample: true"
        },
        "eventFilters": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/v1beta1EventFilter"
          },
          "description": "Event filter rules for fine-grained control."
        }
      },
      "description": "TableConfig defines table filtering and event filter configuration."
    },
    "v1beta1TableConfigMode": {
      "type": "string",
      "enum": [
        "MODE_UNSPECIFIED",
        "IGNORE_NOT_SUPPORT_TABLE",
        "FORCE_SYNC"
      ],
      "default": "MODE_UNSPECIFIED",
      "description": "Mode defines how to handle tables that are not supported by the changefeed.\n\n - MODE_UNSPECIFIED: Default value.\n - IGNORE_NOT_SUPPORT_TABLE: Skip unsupported tables silently.\n - FORCE_SYNC: Force sync all tables (may fail on unsupported tables)."
    }
  }
}
