{
  "repo": "tidbcloud/account",
  "binary": "openapi",
  "binary_path": "central/cmd/openapi/main.go",
  "surface_kind": "mixed_service",
  "type": "mixed_service",
  "extensions": {
    "notes": [
      "central/cmd/openapi starts two transport stacks: the original Project plus HTTP routers on server.NewServer, and a second local gRPC plus grpc-gateway runtime in server.StartOpenApiGrpcGateway.",
      "The grpc-gateway transport methods above are aliases into the local openapi.v1beta1 gRPC server; they are runtime surfaces, not independent business implementations.",
      "internel/controllers/openapi/user_controller.go still contains GetUser, but the current openapi/v1beta1 service.proto does not register that RPC, so it is intentionally excluded from the runtime interface."
    ]
  },
  "services": [
    {
      "name": "HealthCheck",
      "type": "http",
      "methods": [
        {
          "name": "Healthz",
          "name_key": "HealthCheck.Healthz",
          "method": "ANY",
          "path": "/healthz",
          "description": "Health check endpoint"
        }
      ]
    },
    {
      "name": "ProjectService",
      "package": "openapi/cbp",
      "type": "grpc",
      "methods": [
        {
          "name": "CreateProject",
          "name_key": "ProjectService.CreateProject",
          "input": "CreateProjectReq",
          "output": "CreateProjectResp",
          "description": "Create a new project via gRPC"
        },
        {
          "name": "ListProjects",
          "name_key": "ProjectService.ListProjects",
          "input": "ListProjectsReq",
          "output": "ListProjectsResp",
          "description": "List projects via gRPC"
        }
      ]
    },
    {
      "name": "ProjectAPI",
      "type": "http",
      "base_path": "/v1beta1/projects",
      "methods": [
        {
          "name": "ListProjectHandler",
          "name_key": "ProjectAPI.ListProjectHandler",
          "method": "GET",
          "path": "/v1beta1/projects",
          "description": "Get list of org projects",
          "auth": "access_token or api_key"
        },
        {
          "name": "CreateProjectHandler",
          "name_key": "ProjectAPI.CreateProjectHandler",
          "method": "POST",
          "path": "/v1beta1/projects",
          "description": "Create a new project",
          "auth": "access_token or api_key"
        }
      ]
    },
    {
      "name": "UserAPI",
      "type": "http",
      "base_path": "/v1beta1/user",
      "methods": [
        {
          "name": "UserInfoHandler",
          "name_key": "UserAPI.UserInfoHandler",
          "method": "GET",
          "path": "/v1beta1/user/userinfo",
          "description": "Get user information",
          "auth": "access_token"
        }
      ]
    },
    {
      "name": "ApiKeyAPI",
      "type": "http",
      "base_path": "/v1beta1/apikeys",
      "methods": [
        {
          "name": "CreateApiKeyHandler",
          "name_key": "ApiKeyAPI.CreateApiKeyHandler",
          "method": "POST",
          "path": "/v1beta1/apikeys",
          "description": "Create a new API key",
          "auth": "api_key"
        },
        {
          "name": "GetApiKeyHandler",
          "name_key": "ApiKeyAPI.GetApiKeyHandler",
          "method": "GET",
          "path": "/v1beta1/apikeys/:accessKey",
          "description": "Get a single API key",
          "auth": "api_key"
        },
        {
          "name": "ListApiKeysHandler",
          "name_key": "ApiKeyAPI.ListApiKeysHandler",
          "method": "GET",
          "path": "/v1beta1/apikeys",
          "description": "Get a list of API keys",
          "auth": "api_key"
        },
        {
          "name": "PatchApiKeyHandler",
          "name_key": "ApiKeyAPI.PatchApiKeyHandler",
          "method": "PATCH",
          "path": "/v1beta1/apikeys/:accessKey",
          "description": "Update an API key",
          "auth": "api_key"
        },
        {
          "name": "DeleteApiKeyHandler",
          "name_key": "ApiKeyAPI.DeleteApiKeyHandler",
          "method": "DELETE",
          "path": "/v1beta1/apikeys/:accessKey",
          "description": "Delete an API key",
          "auth": "api_key"
        },
        {
          "name": "ListApiKeyRolesHandler",
          "name_key": "ApiKeyAPI.ListApiKeyRolesHandler",
          "method": "GET",
          "path": "/v1beta1/apikeys/roles",
          "description": "Get a list of API key support roles",
          "auth": "api_key"
        },
        {
          "name": "UpdateApiKeyRoleHandler",
          "name_key": "ApiKeyAPI.UpdateApiKeyRoleHandler",
          "method": "PUT",
          "path": "/v1beta1/apikeys/:accessKey/roles",
          "description": "Update API key roles (internal QA use)",
          "auth": "api_key"
        }
      ]
    },
    {
      "name": "SqlUserAPI",
      "type": "http",
      "base_path": "/v1beta1/clusters/:clusterId/sqlUsers",
      "methods": [
        {
          "name": "ListSqlUserHandler",
          "name_key": "SqlUserAPI.ListSqlUserHandler",
          "method": "GET",
          "path": "/v1beta1/clusters/:clusterId/sqlUsers",
          "description": "Get all SQL users in cluster",
          "auth": "access_token or api_key"
        },
        {
          "name": "CreateSqlUserHandler",
          "name_key": "SqlUserAPI.CreateSqlUserHandler",
          "method": "POST",
          "path": "/v1beta1/clusters/:clusterId/sqlUsers",
          "description": "Create a SQL user in cluster",
          "auth": "access_token or api_key"
        },
        {
          "name": "QuerySqlUserHandler",
          "name_key": "SqlUserAPI.QuerySqlUserHandler",
          "method": "GET",
          "path": "/v1beta1/clusters/:clusterId/sqlUsers/:userName",
          "description": "Get a SQL user by name",
          "auth": "access_token or api_key"
        },
        {
          "name": "UpdateSqlUserHandler",
          "name_key": "SqlUserAPI.UpdateSqlUserHandler",
          "method": "PATCH",
          "path": "/v1beta1/clusters/:clusterId/sqlUsers/:userName",
          "description": "Update a SQL user",
          "auth": "access_token or api_key"
        },
        {
          "name": "DeleteSqlUserHandler",
          "name_key": "SqlUserAPI.DeleteSqlUserHandler",
          "method": "DELETE",
          "path": "/v1beta1/clusters/:clusterId/sqlUsers/:userName",
          "description": "Delete a SQL user",
          "auth": "access_token or api_key"
        }
      ]
    },
    {
      "name": "DbUserAPI",
      "type": "http",
      "base_path": "/v1beta1/clusters/:clusterId/dbuser",
      "methods": [
        {
          "name": "GetDbuserHandler",
          "name_key": "DbUserAPI.GetDbuserHandler",
          "method": "GET",
          "path": "/v1beta1/clusters/:clusterId/dbuser",
          "description": "Get DB user JWT token",
          "auth": "access_token or api_key"
        }
      ]
    },
    {
      "name": "MspCustomerAPI",
      "type": "http",
      "base_path": "/v1beta1/msp",
      "methods": [
        {
          "name": "GetMspCustomerHandler",
          "name_key": "MspCustomerAPI.GetMspCustomerHandler",
          "method": "GET",
          "path": "/v1beta1/msp/mspCustomers/:customerOrgId",
          "description": "Retrieve a single MSP customer",
          "auth": "api_key (msp org only)"
        },
        {
          "name": "ListMspCustomersHandler",
          "name_key": "MspCustomerAPI.ListMspCustomersHandler",
          "method": "GET",
          "path": "/v1beta1/msp/mspCustomers",
          "description": "Get a list of MSP customers",
          "auth": "api_key (msp org only)"
        },
        {
          "name": "CreateMspCustomerSignupUrlHandler",
          "name_key": "MspCustomerAPI.CreateMspCustomerSignupUrlHandler",
          "method": "POST",
          "path": "/v1beta1/msp/customerSignupUrl",
          "description": "Create a signup URL for MSP customer",
          "auth": "api_key (msp org only)"
        }
      ]
    },
    {
      "name": "ScimAPI",
      "type": "http",
      "base_path": "/orgs/:org_id/scim/v2",
      "methods": [
        {
          "name": "ServiceProviderConfigHandler",
          "name_key": "ScimAPI.ServiceProviderConfigHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/ServiceProviderConfig",
          "description": "Get SCIM service provider config"
        },
        {
          "name": "SchemasHandler",
          "name_key": "ScimAPI.SchemasHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/Schemas",
          "description": "Get SCIM schemas"
        },
        {
          "name": "SchemaByIdHandler",
          "name_key": "ScimAPI.SchemaByIdHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/Schemas/:id",
          "description": "Get SCIM schema by ID"
        },
        {
          "name": "ResourceTypesHandler",
          "name_key": "ScimAPI.ResourceTypesHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/ResourceTypes",
          "description": "Get SCIM resource types"
        },
        {
          "name": "ResourceTypeByIdHandler",
          "name_key": "ScimAPI.ResourceTypeByIdHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/ResourceTypes/:id",
          "description": "Get SCIM resource type by ID"
        },
        {
          "name": "SearchUsersHandler",
          "name_key": "ScimAPI.SearchUsersHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/Users",
          "description": "Search SCIM users",
          "auth": "bearer_token"
        },
        {
          "name": "GetUserHandler",
          "name_key": "ScimAPI.GetUserHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/Users/:id",
          "description": "Get SCIM user by ID",
          "auth": "bearer_token"
        },
        {
          "name": "CreateUserHandler",
          "name_key": "ScimAPI.CreateUserHandler",
          "method": "POST",
          "path": "/orgs/:org_id/scim/v2/Users",
          "description": "Create SCIM user",
          "auth": "bearer_token"
        },
        {
          "name": "ReplaceUserHandler",
          "name_key": "ScimAPI.ReplaceUserHandler",
          "method": "PUT",
          "path": "/orgs/:org_id/scim/v2/Users/:id",
          "description": "Replace SCIM user",
          "auth": "bearer_token"
        },
        {
          "name": "PatchUserHandler",
          "name_key": "ScimAPI.PatchUserHandler",
          "method": "PATCH",
          "path": "/orgs/:org_id/scim/v2/Users/:id",
          "description": "Patch SCIM user",
          "auth": "bearer_token"
        },
        {
          "name": "DeleteUserHandler",
          "name_key": "ScimAPI.DeleteUserHandler",
          "method": "DELETE",
          "path": "/orgs/:org_id/scim/v2/Users/:id",
          "description": "Delete SCIM user",
          "auth": "bearer_token"
        },
        {
          "name": "SearchGroupsHandler",
          "name_key": "ScimAPI.SearchGroupsHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/Groups",
          "description": "Search SCIM groups",
          "auth": "bearer_token"
        },
        {
          "name": "GetGroupHandler",
          "name_key": "ScimAPI.GetGroupHandler",
          "method": "GET",
          "path": "/orgs/:org_id/scim/v2/Groups/:id",
          "description": "Get SCIM group by ID",
          "auth": "bearer_token"
        },
        {
          "name": "CreateGroupHandler",
          "name_key": "ScimAPI.CreateGroupHandler",
          "method": "POST",
          "path": "/orgs/:org_id/scim/v2/Groups",
          "description": "Create SCIM group",
          "auth": "bearer_token"
        },
        {
          "name": "ReplaceGroupHandler",
          "name_key": "ScimAPI.ReplaceGroupHandler",
          "method": "PUT",
          "path": "/orgs/:org_id/scim/v2/Groups/:id",
          "description": "Replace SCIM group",
          "auth": "bearer_token"
        },
        {
          "name": "PatchGroupHandler",
          "name_key": "ScimAPI.PatchGroupHandler",
          "method": "PATCH",
          "path": "/orgs/:org_id/scim/v2/Groups/:id",
          "description": "Patch SCIM group",
          "auth": "bearer_token"
        },
        {
          "name": "DeleteGroupHandler",
          "name_key": "ScimAPI.DeleteGroupHandler",
          "method": "DELETE",
          "path": "/orgs/:org_id/scim/v2/Groups/:id",
          "description": "Delete SCIM group",
          "auth": "bearer_token"
        }
      ]
    },
    {
      "name": "OpenApiApiKeyService",
      "package": "openapi/v1beta1",
      "type": "grpc",
      "methods": [
        {
          "name": "CreateApiKey",
          "name_key": "OpenApiApiKeyService.CreateApiKey",
          "input": "CreateApiKeyRequest",
          "output": "ApiKey",
          "description": "Create an org-scoped OpenAPI API key over the secondary gRPC runtime"
        },
        {
          "name": "GetApiKey",
          "name_key": "OpenApiApiKeyService.GetApiKey",
          "input": "GetApiKeyRequest",
          "output": "ApiKey",
          "description": "Fetch an org-scoped OpenAPI API key over the secondary gRPC runtime"
        },
        {
          "name": "ListApiKeys",
          "name_key": "OpenApiApiKeyService.ListApiKeys",
          "input": "ListApiKeysRequest",
          "output": "ListApiKeysResponse",
          "description": "List org-scoped OpenAPI API keys over the secondary gRPC runtime"
        },
        {
          "name": "ListApiKeyRoles",
          "name_key": "OpenApiApiKeyService.ListApiKeyRoles",
          "input": "google.protobuf.Empty",
          "output": "ListApiKeyRolesResponse",
          "description": "List valid org-level API key roles over the secondary gRPC runtime"
        },
        {
          "name": "DeleteApiKey",
          "name_key": "OpenApiApiKeyService.DeleteApiKey",
          "input": "DeleteApiKeyRequest",
          "output": "google.protobuf.Empty",
          "description": "Delete an org-scoped OpenAPI API key over the secondary gRPC runtime"
        }
      ]
    },
    {
      "name": "OpenApiOrgService",
      "package": "openapi/v1beta1",
      "type": "grpc",
      "methods": [
        {
          "name": "GetOrg",
          "name_key": "OpenApiOrgService.GetOrg",
          "input": "GetOrgRequest",
          "output": "Org",
          "description": "Get the authenticated org over the secondary gRPC runtime"
        },
        {
          "name": "ListPartnerOrgs",
          "name_key": "OpenApiOrgService.ListPartnerOrgs",
          "input": "ListPartnerOrgsRequest",
          "output": "ListPartnerOrgsResponse",
          "description": "List partner orgs reachable by the caller over the secondary gRPC runtime"
        }
      ]
    },
    {
      "name": "OpenApiUserService",
      "package": "openapi/v1beta1",
      "type": "grpc",
      "methods": [
        {
          "name": "GetCurrentUser",
          "name_key": "OpenApiUserService.GetCurrentUser",
          "input": "google.protobuf.Empty",
          "output": "User",
          "description": "Get the current user over the secondary gRPC runtime"
        },
        {
          "name": "UpdateCurrentUser",
          "name_key": "OpenApiUserService.UpdateCurrentUser",
          "input": "UpdateUserRequest",
          "output": "User",
          "description": "Update the current user over the secondary gRPC runtime"
        },
        {
          "name": "DeleteOrgUser",
          "name_key": "OpenApiUserService.DeleteOrgUser",
          "input": "DeleteOrgUserRequest",
          "output": "google.protobuf.Empty",
          "description": "Remove a user from the authenticated org over the secondary gRPC runtime"
        },
        {
          "name": "DeleteProjectUser",
          "name_key": "OpenApiUserService.DeleteProjectUser",
          "input": "DeleteProjectUserRequest",
          "output": "google.protobuf.Empty",
          "description": "Remove a user from a project over the secondary gRPC runtime"
        },
        {
          "name": "ListUsers",
          "name_key": "OpenApiUserService.ListUsers",
          "input": "ListUsersRequest",
          "output": "ListUsersResponse",
          "description": "List users visible to the authenticated org over the secondary gRPC runtime"
        }
      ]
    },
    {
      "name": "OpenApiInvitationService",
      "package": "openapi/v1beta1",
      "type": "grpc",
      "methods": [
        {
          "name": "CreateOrgInvitation",
          "name_key": "OpenApiInvitationService.CreateOrgInvitation",
          "input": "CreateOrgInvitationRequest",
          "output": "CreateInvitationResponse",
          "description": "Invite users to the authenticated org over the secondary gRPC runtime"
        },
        {
          "name": "CreateProjectInvitation",
          "name_key": "OpenApiInvitationService.CreateProjectInvitation",
          "input": "CreateProjectInvitationRequest",
          "output": "CreateInvitationResponse",
          "description": "Invite users to a project over the secondary gRPC runtime"
        }
      ]
    },
    {
      "name": "OpenApiPartnerService",
      "package": "openapi/v1beta1",
      "type": "grpc",
      "methods": [
        {
          "name": "CreateSignupUrl",
          "name_key": "OpenApiPartnerService.CreateSignupUrl",
          "input": "CreateSignupUrlRequest",
          "output": "CreateSignupUrlResponse",
          "description": "Create an MSP or resale signup URL over the secondary gRPC runtime"
        },
        {
          "name": "ListCustomers",
          "name_key": "OpenApiPartnerService.ListCustomers",
          "input": "ListCustomersRequest",
          "output": "ListCustomersResponse",
          "description": "List partner customers over the secondary gRPC runtime"
        },
        {
          "name": "GetPartnerProfile",
          "name_key": "OpenApiPartnerService.GetPartnerProfile",
          "input": "GetPartnerProfileRequest",
          "output": "PartnerProfile",
          "description": "Fetch partner branding profile over the secondary gRPC runtime"
        },
        {
          "name": "UpdatePartnerProfile",
          "name_key": "OpenApiPartnerService.UpdatePartnerProfile",
          "input": "UpdatePartnerProfileRequest",
          "output": "PartnerProfile",
          "description": "Update partner branding profile over the secondary gRPC runtime"
        }
      ]
    },
    {
      "name": "OpenApiFileUploadService",
      "package": "openapi/v1beta1",
      "type": "grpc",
      "methods": [
        {
          "name": "UploadLogo",
          "name_key": "OpenApiFileUploadService.UploadLogo",
          "input": "UploadLogoRequest",
          "output": "UploadLogoResponse",
          "description": "Upload a partner logo over the secondary gRPC runtime"
        }
      ]
    },
    {
      "name": "OpenApiGatewayTransport",
      "type": "http",
      "base_path": "/v1beta1",
      "methods": [
        {
          "name": "ApiKeysCollectionGateway",
          "name_key": "Runtime OpenApiGatewayTransport.ApiKeysCollection",
          "method": "ANY",
          "path": "/v1beta1/apiKeys",
          "description": "grpc-gateway transport entrypoint for ApiKeyService",
          "auth": "grpc-gateway auth + permission interceptors"
        },
        {
          "name": "ApiKeysItemGateway",
          "name_key": "Runtime OpenApiGatewayTransport.ApiKeysItem",
          "method": "ANY",
          "path": "/v1beta1/apiKeys/*any",
          "description": "grpc-gateway transport entrypoint for ApiKeyService item routes",
          "auth": "grpc-gateway auth + permission interceptors"
        },
        {
          "name": "OrgGateway",
          "name_key": "Runtime OpenApiGatewayTransport.Org",
          "method": "ANY",
          "path": "/v1beta1/org",
          "description": "grpc-gateway transport entrypoint for OrgService",
          "auth": "grpc-gateway auth + permission interceptors"
        },
        {
          "name": "UsersCollectionGateway",
          "name_key": "Runtime OpenApiGatewayTransport.UsersCollection",
          "method": "ANY",
          "path": "/v1beta1/users",
          "description": "grpc-gateway transport entrypoint for UserService and InvitationService",
          "auth": "grpc-gateway auth + permission interceptors"
        },
        {
          "name": "UsersItemGateway",
          "name_key": "Runtime OpenApiGatewayTransport.UsersItem",
          "method": "ANY",
          "path": "/v1beta1/users/*any",
          "description": "grpc-gateway transport entrypoint for UserService item routes",
          "auth": "grpc-gateway auth + permission interceptors"
        },
        {
          "name": "UsersInviteGateway",
          "name_key": "Runtime OpenApiGatewayTransport.UsersInvite",
          "method": "ANY",
          "path": "/v1beta1/users:invite",
          "description": "grpc-gateway transport entrypoint for InvitationService org invite route",
          "auth": "grpc-gateway auth + permission interceptors"
        },
        {
          "name": "ProjectUsersAndInvitesGateway",
          "name_key": "Runtime OpenApiGatewayTransport.ProjectUsersAndInvites",
          "method": "ANY",
          "path": "/v1beta1/projects/:project_id/*any",
          "description": "grpc-gateway transport entrypoint for project invitation routes",
          "auth": "grpc-gateway auth + permission interceptors"
        },
        {
          "name": "PartnersGateway",
          "name_key": "Runtime OpenApiGatewayTransport.Partners",
          "method": "ANY",
          "path": "/v1beta1/partners/*any",
          "description": "grpc-gateway transport entrypoint for PartnerService and FileUploadService",
          "auth": "grpc-gateway auth + permission interceptors"
        }
      ]
    }
  ]
}
