{
  "repo": "tidbcloud/dataflow-service",
  "binary": "dataflow-ng",
  "binary_path": "dataflow-service-ng/cmd/dataflow/main.go",
  "surface_kind": "mixed_service",
  "type": "mixed_service",
  "services": [
    {
      "name": "ChangefeedService",
      "package": "consoleapi",
      "methods": [
        {"name": "ListChangefeeds", "name_key": "ChangefeedService.ListChangefeeds", "input": "ChangefeedListReq", "output": "Changefeeds", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds"},
        {"name": "GetChangefeed", "name_key": "ChangefeedService.GetChangefeed", "input": "ChangefeedID", "output": "Changefeed", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/{changefeed_id}"},
        {"name": "DescribeSchemaTable", "name_key": "ChangefeedService.DescribeSchemaTable", "input": "DescribeSchemaTableReq", "output": "DescribeSchemaTableResp", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/describeSchemaTable"},
        {"name": "GetAdminProfile", "name_key": "ChangefeedService.GetAdminProfile", "input": "ClusterIdReq", "output": "AdminProfile", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/adminProfile"},
        {"name": "ScaleChangefeed", "name_key": "ChangefeedService.ScaleChangefeed", "input": "ChangefeedScaleReq", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/{changefeed_id}:scale"},
        {"name": "CalChangefeedFee", "name_key": "ChangefeedService.CalChangefeedFee", "input": "CalChangefeedFeeReq", "output": "CalChangefeedFeeResp", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/calChangefeedFee"},
        {"name": "ResumeChangefeed", "name_key": "ChangefeedService.ResumeChangefeed", "input": "ChangefeedID", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/{changefeed_id}:resume"},
        {"name": "PauseChangefeed", "name_key": "ChangefeedService.PauseChangefeed", "input": "ChangefeedID", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/{changefeed_id}:pause"},
        {"name": "CreateChangefeed", "name_key": "ChangefeedService.CreateChangefeed", "input": "ChangefeedCreateReq", "output": "ChangefeedID", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds"},
        {"name": "EditChangefeed", "name_key": "ChangefeedService.EditChangefeed", "input": "ChangefeedEditReq", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/{changefeed_id}:edit"},
        {"name": "DeleteChangefeed", "name_key": "ChangefeedService.DeleteChangefeed", "input": "ChangefeedID", "output": "google.protobuf.Empty", "http_method": "DELETE", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/{changefeed_id}"},
        {"name": "TestChangefeed", "name_key": "ChangefeedService.TestChangefeed", "input": "ChangefeedCreateReq", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/test"},
        {"name": "GetChangefeedDetail", "name_key": "ChangefeedService.GetChangefeedDetail", "input": "ChangefeedID", "output": "google.protobuf.Struct", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/{changefeed_id}/detail"},
        {"name": "GetTiCDCCluster", "name_key": "ChangefeedService.GetTiCDCCluster", "input": "ChangefeedID", "output": "google.protobuf.Struct", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeeds/{changefeed_id}/ticdc_cluster"},
        {"name": "ListTiCDCClusters", "name_key": "ChangefeedService.ListTiCDCClusters", "input": "ClusterIdReq", "output": "google.protobuf.Struct", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/ticdc_clusters"}
      ]
    },
    {
      "name": "ChangefeedSpecService",
      "package": "consoleapi",
      "methods": [
        {"name": "List", "name_key": "ChangefeedSpecService.List", "input": "ChangefeedSpecListReq", "output": "ChangefeedSpecs", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/changefeedSpecifications"}
      ]
    },
    {
      "name": "OpsInternalService",
      "package": "consoleapi",
      "methods": [
        {"name": "ApplyConfigChanges", "name_key": "OpsInternalService.ApplyConfigChanges", "input": "ApplyConfigChangesReq", "output": "ApplyConfigChangesResp", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/config/apply"},
        {"name": "UpdateTiCDCClusterStorage", "name_key": "OpsInternalService.UpdateTiCDCClusterStorage", "input": "UpdateTiCDCClusterStorageReq", "output": "UpdateTiCDCClusterStorageResp", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/storage/apply"},
        {"name": "ListInternalChangefeeds", "name_key": "OpsInternalService.ListInternalChangefeeds", "input": "ListInternalChangefeedsRequest", "output": "ListInternalChangefeedsResponse", "http_method": "GET", "http_path": "/api/v1beta2/dataflow/ops/internalChangefeeds"},
        {"name": "GetInternalChangefeed", "name_key": "OpsInternalService.GetInternalChangefeed", "input": "GetInternalChangefeedRequest", "output": "InternalChangefeed", "http_method": "GET", "http_path": "/api/v1beta2/dataflow/ops/internalChangefeeds/{changefeed_id}"},
        {"name": "RestartChangefeed", "name_key": "OpsInternalService.RestartChangefeed", "input": "RestartChangefeedRequest", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/internalChangefeeds/{changefeed_id}:restart"},
        {"name": "PauseChangefeed", "name_key": "OpsInternalService.PauseChangefeed", "input": "PauseChangefeedRequest", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/internalChangefeeds/{changefeed_id}:pause"},
        {"name": "ResumeChangefeed", "name_key": "OpsInternalService.ResumeChangefeed", "input": "ResumeChangefeedRequest", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/internalChangefeeds/{changefeed_id}:resume"},
        {"name": "GetInternalTiCDCCluster", "name_key": "OpsInternalService.GetInternalTiCDCCluster", "input": "GetInternalTiCDCClusterRequest", "output": "InternalTiCDCCluster", "http_method": "GET", "http_path": "/api/v1beta2/dataflow/ops/internalTiCDCClusters/{ticdc_cluster_id}"},
        {"name": "RestartTiCDCCluster", "name_key": "OpsInternalService.RestartTiCDCCluster", "input": "RestartTiCDCClusterRequest", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/internalTiCDCClusters/{ticdc_cluster_id}:restart"},
        {"name": "PauseClusterChangefeeds", "name_key": "OpsInternalService.PauseClusterChangefeeds", "input": "PauseClusterChangefeedsRequest", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/cluster/{cluster_id}:pauseChangefeeds"},
        {"name": "ResumeClusterChangefeeds", "name_key": "OpsInternalService.ResumeClusterChangefeeds", "input": "ResumeClusterChangefeedsRequest", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/cluster/{cluster_id}:resumeChangefeeds"},
        {"name": "UpdateTableFilterOfClusterChangefeeds", "name_key": "OpsInternalService.UpdateTableFilterOfClusterChangefeeds", "input": "UpdateTableFilterOfClusterChangefeedsRequest", "output": "google.protobuf.Empty", "http_method": "POST", "http_path": "/api/v1beta2/dataflow/ops/cluster/{cluster_id}:updateTableFilters"}
      ]
    },
    {
      "name": "SinkEndpointService",
      "package": "consoleapi",
      "methods": [
        {"name": "CreateSinkEndpoint", "name_key": "SinkEndpointService.CreateSinkEndpoint", "input": "CreateSinkEndpointRequest", "output": "SinkEndpoint", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/sinkEndpoints"},
        {"name": "ListSinkEndpoints", "name_key": "SinkEndpointService.ListSinkEndpoints", "input": "ListSinkEndpointsRequest", "output": "ListSinkEndpointsResponse", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/sinkEndpoints"},
        {"name": "GetSinkEndpoint", "name_key": "SinkEndpointService.GetSinkEndpoint", "input": "GetSinkEndpointRequest", "output": "SinkEndpoint", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/sinkEndpoints/{sink_endpoint_id}"},
        {"name": "DeleteSinkEndpoint", "name_key": "SinkEndpointService.DeleteSinkEndpoint", "input": "DeleteSinkEndpointRequest", "output": "google.protobuf.Empty", "http_method": "DELETE", "http_path": "/api/v1beta2/tidbs/{cluster_id}/sinkEndpoints/{sink_endpoint_id}"},
        {"name": "ListSinkAvailabilityZones", "name_key": "SinkEndpointService.ListSinkAvailabilityZones", "input": "ListSinkAvailabilityZonesRequest", "output": "ListSinkAvailabilityZonesResponse", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/sinkEndpoints/availabilityZones"},
        {"name": "GenerateSinkAdvertisedListener", "name_key": "SinkEndpointService.GenerateSinkAdvertisedListener", "input": "GenerateSinkAdvertisedListenerRequest", "output": "GenerateSinkAdvertisedListenerResponse", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/sinkEndpoints/generateAdvertisedListener"},
        {"name": "ValidateSinkAdvertisedListenerDomain", "name_key": "SinkEndpointService.ValidateSinkAdvertisedListenerDomain", "input": "ValidateSinkAdvertisedListenerDomainRequest", "output": "ValidateSinkAdvertisedListenerDomainResponse", "http_method": "POST", "http_path": "/api/v1beta2/tidbs/{cluster_id}/sinkEndpoints/validateAdvertisedListenerDomain"},
        {"name": "GetSinkEndpointAuthInfo", "name_key": "SinkEndpointService.GetSinkEndpointAuthInfo", "input": "GetSinkEndpointAuthInfoRequest", "output": "GetSinkEndpointAuthInfoResponse", "http_method": "GET", "http_path": "/api/v1beta2/tidbs/{cluster_id}/sinkEndpoints/authInfo"}
      ]
    }
  ],
  "extensions": {
    "notes": [
      "The HTTP command starts a local gRPC server, a public grpc-gateway, an inner ops-only gateway, and a separate metrics server; the business methods above are the server-registered gRPC methods backed by concrete controllers.",
      "DPFeatureService has a generated grpc-gateway handler for GET /api/v1beta2/tidbs/{cluster_id}/enabledDPFeatures, but the binary never calls RegisterDPFeatureServiceServer, so it is intentionally excluded from this interface list.",
      "The grpc-only command registers a smaller subset: ChangefeedService and OpsInternalService."
    ]
  }
}
