diff --git a/pkg/action/action_test.go b/pkg/action/action_test.go
index 0783344048fba0439fff85d6ad508024553e4220..2988744f4b88b734c4085b5aa20ceb95fe0657da 100644
--- a/pkg/action/action_test.go
+++ b/pkg/action/action_test.go
@@ -19,19 +19,7 @@ func TestActionURL_New(t *testing.T) {
 		{
 			name: "Without action",
 			want: &URL{
-				URL: &url.URL{
-					Scheme:      "",
-					Opaque:      "",
-					User:        nil,
-					Host:        "",
-					Path:        "",
-					RawPath:     "",
-					OmitHost:    false,
-					ForceQuery:  false,
-					RawQuery:    "",
-					Fragment:    "",
-					RawFragment: "",
-				},
+				URL: &url.URL{},
 			},
 			wantErr: assert.NoError,
 		},
@@ -40,17 +28,7 @@ func TestActionURL_New(t *testing.T) {
 			action: "build-site",
 			want: &URL{
 				URL: &url.URL{
-					Scheme:      "",
-					Opaque:      "",
-					User:        nil,
-					Host:        "",
-					Path:        "build-site",
-					RawPath:     "",
-					OmitHost:    false,
-					ForceQuery:  false,
-					RawQuery:    "",
-					Fragment:    "",
-					RawFragment: "",
+					Path: "build-site",
 				},
 			},
 			url:     "build-site",
@@ -61,17 +39,8 @@ func TestActionURL_New(t *testing.T) {
 			action: "grpc:///perxisweb/build-site",
 			want: &URL{
 				URL: &url.URL{
-					Scheme:      "grpc",
-					Opaque:      "",
-					User:        nil,
-					Host:        "",
-					Path:        "/perxisweb/build-site",
-					RawPath:     "",
-					OmitHost:    false,
-					ForceQuery:  false,
-					RawQuery:    "",
-					Fragment:    "",
-					RawFragment: "",
+					Scheme: "grpc",
+					Path:   "/perxisweb/build-site",
 				},
 			},
 			url:     "grpc:///perxisweb/build-site",
@@ -82,17 +51,8 @@ func TestActionURL_New(t *testing.T) {
 			action: "ui:///space/env/coll",
 			want: &URL{
 				URL: &url.URL{
-					Scheme:      "ui",
-					Opaque:      "",
-					User:        nil,
-					Host:        "",
-					Path:        "/space/env/coll",
-					RawPath:     "",
-					OmitHost:    false,
-					ForceQuery:  false,
-					RawQuery:    "",
-					Fragment:    "",
-					RawFragment: "",
+					Scheme: "ui",
+					Path:   "/space/env/coll",
 				},
 			},
 			url:     "ui:///space/env/coll",
@@ -103,17 +63,8 @@ func TestActionURL_New(t *testing.T) {
 			action: "https://perx.ru",
 			want: &URL{
 				URL: &url.URL{
-					Scheme:      "https",
-					Opaque:      "",
-					User:        nil,
-					Host:        "perx.ru",
-					Path:        "",
-					RawPath:     "",
-					OmitHost:    false,
-					ForceQuery:  false,
-					RawQuery:    "",
-					Fragment:    "",
-					RawFragment: "",
+					Scheme: "https",
+					Host:   "perx.ru",
 				},
 			},
 			url:     "https://perx.ru",
@@ -130,17 +81,8 @@ func TestActionURL_New(t *testing.T) {
 			action: "grpc:///perxisweb",
 			want: &URL{
 				URL: &url.URL{
-					Scheme:      "grpc",
-					Opaque:      "",
-					User:        nil,
-					Host:        "",
-					Path:        "/perxisweb",
-					RawPath:     "",
-					OmitHost:    false,
-					ForceQuery:  false,
-					RawQuery:    "",
-					Fragment:    "",
-					RawFragment: "",
+					Scheme: "grpc",
+					Path:   "/perxisweb",
 				},
 			},
 			wantErr: assert.NoError,
@@ -166,33 +108,28 @@ func TestActionURL_String(t *testing.T) {
 		{
 			name: "GRPC action",
 			url:  "grpc:///perxisweb/build-site",
-			want: "grpc:///perxisweb/build-site",
 		},
 		{
 			name: "UI action #1",
 			url:  "ui:///space/env/coll",
-			want: "ui:///space/env/coll",
 		},
 		{
 			name: "UI action deprecated call #2",
 			url:  "space/env/coll",
-			want: "space/env/coll",
 		},
 		{
 			name: "Https action",
 			url:  "https://perx.ru",
-			want: "https://perx.ru",
 		},
 		{
 			name: "With action deprecated call",
 			url:  "extension-id",
-			want: "extension-id",
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			p, _ := NewURL(tt.url)
-			assert.Equalf(t, tt.want, p.String(), "String()")
+			assert.Equalf(t, tt.url, p.String(), "String()")
 		})
 	}
 }
diff --git a/pkg/extension/server.go b/pkg/extension/server.go
index 6f2c24425222c687f4a39513893028ffe8475dd8..f9b603f50ffb6109f89551a7e3b92b5c355761d4 100644
--- a/pkg/extension/server.go
+++ b/pkg/extension/server.go
@@ -86,9 +86,12 @@ func (srv *Server) Action(ctx context.Context, in *pb.ActionRequest) (*pb.Action
 		return nil, err
 	}
 	ext := actionURL.Extension()
-	if ext == "" && in.Extension != "" {
+	if ext == "" {
 		ext = in.Extension
 	}
+	if ext == "" {
+		return nil, errors.New("extension ID required")
+	}
 
 	svc, ok := srv.services[ext]
 	if !ok {
diff --git a/pkg/extension/server_test.go b/pkg/extension/server_test.go
index 9e8b8f4c71bbdcfc8fa46bcf5651c9e4e0fe81a5..3f8e408b21a25159cb94ea7527d899150354f278 100644
--- a/pkg/extension/server_test.go
+++ b/pkg/extension/server_test.go
@@ -168,6 +168,16 @@ func TestServer_Action(t *testing.T) {
 			want:    nil,
 			wantErr: assert.Error,
 		},
+		{
+			name:     "Error (deprecated call, no action and extension)",
+			services: map[string]Extension{"test-extension": getDummyExtension("test-extension")},
+			in: &ActionRequest{
+				SpaceId: "sp",
+				EnvId:   "env",
+			},
+			want:    nil,
+			wantErr: assert.Error,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/pkg/extension/service/extension.go b/pkg/extension/service/extension.go
index 8b9aefd3db639a5ab400c6ed32f8ee607485dd6c..6d9608ab6877acdc94bfcad0bd62e5fa21eef181 100644
--- a/pkg/extension/service/extension.go
+++ b/pkg/extension/service/extension.go
@@ -161,9 +161,12 @@ func (s *Extension) Action(ctx context.Context, in *extension.ActionRequest) (*e
 		return nil, err
 	}
 	ext := actionURL.Extension()
-	if ext == "" && in.Extension != "" {
+	if ext == "" {
 		ext = in.Extension
 	}
+	if ext == "" {
+		return nil, errors.New("extension ID required")
+	}
 	ok, err := extension.CheckInstalled(ctx, s.Content, in.SpaceId, in.EnvId, ext)
 	if err != nil {
 		return nil, errors.Wrap(err, "check extension installed")