Fix buf lint and add grpc gen (#25)

* fix buf lint and add grpc gen

Signed-off-by: Megrez Lu <lujiajing1126@gmail.com>

* fix

Signed-off-by: Megrez Lu <lujiajing1126@gmail.com>
diff --git a/api/buf.gen.yaml b/api/buf.gen.yaml
index 1fa7ad6..4cfe657 100644
--- a/api/buf.gen.yaml
+++ b/api/buf.gen.yaml
@@ -22,3 +22,6 @@
   - name: go
     out: proto
     opt: paths=source_relative
+  - name: go-grpc
+    out: proto
+    opt: paths=source_relative
diff --git a/api/buf.yaml b/api/buf.yaml
index 8584150..b52b133 100644
--- a/api/buf.yaml
+++ b/api/buf.yaml
@@ -24,9 +24,6 @@
 lint:
   use:
     - DEFAULT
-  except:
-    - RPC_REQUEST_STANDARD_NAME
-    - RPC_RESPONSE_STANDARD_NAME
 breaking:
   use:
     - FILE
\ No newline at end of file
diff --git a/api/proto/banyandb/v1/query.pb.go b/api/proto/banyandb/v1/query.pb.go
index 83b5fda..4fd3288 100644
--- a/api/proto/banyandb/v1/query.pb.go
+++ b/api/proto/banyandb/v1/query.pb.go
@@ -710,8 +710,8 @@
 	return nil
 }
 
-// EntityCriteria is the request contract for query.
-type EntityCriteria struct {
+// QueryRequest is the request contract for query.
+type QueryRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -737,8 +737,8 @@
 	Projection *Projection `protobuf:"bytes,7,opt,name=projection,proto3" json:"projection,omitempty"`
 }
 
-func (x *EntityCriteria) Reset() {
-	*x = EntityCriteria{}
+func (x *QueryRequest) Reset() {
+	*x = QueryRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_banyandb_v1_query_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -746,13 +746,13 @@
 	}
 }
 
-func (x *EntityCriteria) String() string {
+func (x *QueryRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*EntityCriteria) ProtoMessage() {}
+func (*QueryRequest) ProtoMessage() {}
 
-func (x *EntityCriteria) ProtoReflect() protoreflect.Message {
+func (x *QueryRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_banyandb_v1_query_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -764,54 +764,54 @@
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use EntityCriteria.ProtoReflect.Descriptor instead.
-func (*EntityCriteria) Descriptor() ([]byte, []int) {
+// Deprecated: Use QueryRequest.ProtoReflect.Descriptor instead.
+func (*QueryRequest) Descriptor() ([]byte, []int) {
 	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{9}
 }
 
-func (x *EntityCriteria) GetMetadata() *Metadata {
+func (x *QueryRequest) GetMetadata() *Metadata {
 	if x != nil {
 		return x.Metadata
 	}
 	return nil
 }
 
-func (x *EntityCriteria) GetTimeRange() *TimeRange {
+func (x *QueryRequest) GetTimeRange() *TimeRange {
 	if x != nil {
 		return x.TimeRange
 	}
 	return nil
 }
 
-func (x *EntityCriteria) GetOffset() uint32 {
+func (x *QueryRequest) GetOffset() uint32 {
 	if x != nil {
 		return x.Offset
 	}
 	return 0
 }
 
-func (x *EntityCriteria) GetLimit() uint32 {
+func (x *QueryRequest) GetLimit() uint32 {
 	if x != nil {
 		return x.Limit
 	}
 	return 0
 }
 
-func (x *EntityCriteria) GetOrderBy() *QueryOrder {
+func (x *QueryRequest) GetOrderBy() *QueryOrder {
 	if x != nil {
 		return x.OrderBy
 	}
 	return nil
 }
 
-func (x *EntityCriteria) GetFields() []*PairQuery {
+func (x *QueryRequest) GetFields() []*PairQuery {
 	if x != nil {
 		return x.Fields
 	}
 	return nil
 }
 
-func (x *EntityCriteria) GetProjection() *Projection {
+func (x *QueryRequest) GetProjection() *Projection {
 	if x != nil {
 		return x.Projection
 	}
@@ -895,34 +895,34 @@
 	0x70, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18,
 	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xc5, 0x02, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x69, 0x74,
-	0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74,
-	0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
-	0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x0a,
-	0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x16, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x54,
-	0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61,
-	0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x0d, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c,
-	0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69,
-	0x74, 0x12, 0x32, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76,
-	0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x07, 0x6f, 0x72,
-	0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18,
-	0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x06, 0x66,
-	0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x6e, 0x79,
-	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x60,
-	0x0a, 0x1e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79,
-	0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61,
-	0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62,
-	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31,
-	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xc3, 0x02, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
+	0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x69,
+	0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d,
+	0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67,
+	0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0d, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d,
+	0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12,
+	0x32, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e,
+	0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65,
+	0x72, 0x42, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x06, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76,
+	0x31, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65,
+	0x6c, 0x64, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x60, 0x0a, 0x1e,
+	0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61,
+	0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e,
+	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68,
+	0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -951,7 +951,7 @@
 	(*QueryResponse)(nil),         // 8: banyandb.v1.QueryResponse
 	(*Projection)(nil),            // 9: banyandb.v1.Projection
 	(*TimeRange)(nil),             // 10: banyandb.v1.TimeRange
-	(*EntityCriteria)(nil),        // 11: banyandb.v1.EntityCriteria
+	(*QueryRequest)(nil),          // 11: banyandb.v1.QueryRequest
 	(*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp
 	(*Metadata)(nil),              // 13: banyandb.v1.Metadata
 }
@@ -966,11 +966,11 @@
 	7,  // 7: banyandb.v1.QueryResponse.entities:type_name -> banyandb.v1.Entity
 	12, // 8: banyandb.v1.TimeRange.begin:type_name -> google.protobuf.Timestamp
 	12, // 9: banyandb.v1.TimeRange.end:type_name -> google.protobuf.Timestamp
-	13, // 10: banyandb.v1.EntityCriteria.metadata:type_name -> banyandb.v1.Metadata
-	10, // 11: banyandb.v1.EntityCriteria.time_range:type_name -> banyandb.v1.TimeRange
-	6,  // 12: banyandb.v1.EntityCriteria.order_by:type_name -> banyandb.v1.QueryOrder
-	5,  // 13: banyandb.v1.EntityCriteria.fields:type_name -> banyandb.v1.PairQuery
-	9,  // 14: banyandb.v1.EntityCriteria.projection:type_name -> banyandb.v1.Projection
+	13, // 10: banyandb.v1.QueryRequest.metadata:type_name -> banyandb.v1.Metadata
+	10, // 11: banyandb.v1.QueryRequest.time_range:type_name -> banyandb.v1.TimeRange
+	6,  // 12: banyandb.v1.QueryRequest.order_by:type_name -> banyandb.v1.QueryOrder
+	5,  // 13: banyandb.v1.QueryRequest.fields:type_name -> banyandb.v1.PairQuery
+	9,  // 14: banyandb.v1.QueryRequest.projection:type_name -> banyandb.v1.Projection
 	15, // [15:15] is the sub-list for method output_type
 	15, // [15:15] is the sub-list for method input_type
 	15, // [15:15] is the sub-list for extension type_name
@@ -1094,7 +1094,7 @@
 			}
 		}
 		file_banyandb_v1_query_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*EntityCriteria); i {
+			switch v := v.(*QueryRequest); i {
 			case 0:
 				return &v.state
 			case 1:
diff --git a/api/proto/banyandb/v1/query.proto b/api/proto/banyandb/v1/query.proto
index 58768d7..6a64fb6 100644
--- a/api/proto/banyandb/v1/query.proto
+++ b/api/proto/banyandb/v1/query.proto
@@ -123,8 +123,8 @@
   google.protobuf.Timestamp end = 2;
 }
 
-// EntityCriteria is the request contract for query.
-message EntityCriteria {
+// QueryRequest is the request contract for query.
+message QueryRequest {
   // metadata is required
   Metadata metadata = 1;
   // time_range is a range query with begin/end time of entities in the timeunit of nanoseconds.
diff --git a/api/proto/banyandb/v1/rpc.pb.go b/api/proto/banyandb/v1/rpc.pb.go
index 157e4cc..6f7e175 100644
--- a/api/proto/banyandb/v1/rpc.pb.go
+++ b/api/proto/banyandb/v1/rpc.pb.go
@@ -28,7 +28,6 @@
 
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-	emptypb "google.golang.org/protobuf/types/known/emptypb"
 )
 
 const (
@@ -43,40 +42,39 @@
 var file_banyandb_v1_rpc_proto_rawDesc = []byte{
 	0x0a, 0x15, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x70,
 	0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
-	0x62, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x1a, 0x17, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x71,
-	0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x62, 0x61, 0x6e, 0x79,
-	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x32, 0x8f, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1b, 0x2e,
-	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69,
-	0x74, 0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x1a, 0x1a, 0x2e, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12,
-	0x18, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72,
-	0x69, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
-	0x79, 0x28, 0x01, 0x30, 0x01, 0x42, 0x60, 0x0a, 0x1e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61,
-	0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62,
-	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
-	0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61,
-	0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61,
-	0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
-	0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x62, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76,
+	0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x92, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x65,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79,
+	0x12, 0x19, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x51,
+	0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x62, 0x61,
+	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65,
+	0x12, 0x19, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x57,
+	0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x62, 0x61,
+	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x60, 0x0a, 0x1e, 0x6f,
+	0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c,
+	0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e, 0x67,
+	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65,
+	0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var file_banyandb_v1_rpc_proto_goTypes = []interface{}{
-	(*EntityCriteria)(nil), // 0: banyandb.v1.EntityCriteria
-	(*WriteEntity)(nil),    // 1: banyandb.v1.WriteEntity
-	(*QueryResponse)(nil),  // 2: banyandb.v1.QueryResponse
-	(*emptypb.Empty)(nil),  // 3: google.protobuf.Empty
+	(*QueryRequest)(nil),  // 0: banyandb.v1.QueryRequest
+	(*WriteRequest)(nil),  // 1: banyandb.v1.WriteRequest
+	(*QueryResponse)(nil), // 2: banyandb.v1.QueryResponse
+	(*WriteResponse)(nil), // 3: banyandb.v1.WriteResponse
 }
 var file_banyandb_v1_rpc_proto_depIdxs = []int32{
-	0, // 0: banyandb.v1.TraceService.Query:input_type -> banyandb.v1.EntityCriteria
-	1, // 1: banyandb.v1.TraceService.Write:input_type -> banyandb.v1.WriteEntity
+	0, // 0: banyandb.v1.TraceService.Query:input_type -> banyandb.v1.QueryRequest
+	1, // 1: banyandb.v1.TraceService.Write:input_type -> banyandb.v1.WriteRequest
 	2, // 2: banyandb.v1.TraceService.Query:output_type -> banyandb.v1.QueryResponse
-	3, // 3: banyandb.v1.TraceService.Write:output_type -> google.protobuf.Empty
+	3, // 3: banyandb.v1.TraceService.Write:output_type -> banyandb.v1.WriteResponse
 	2, // [2:4] is the sub-list for method output_type
 	0, // [0:2] is the sub-list for method input_type
 	0, // [0:0] is the sub-list for extension type_name
diff --git a/api/proto/banyandb/v1/rpc.proto b/api/proto/banyandb/v1/rpc.proto
index 2b705cf..85fafd8 100644
--- a/api/proto/banyandb/v1/rpc.proto
+++ b/api/proto/banyandb/v1/rpc.proto
@@ -22,11 +22,10 @@
 
 package banyandb.v1;
 
-import "google/protobuf/empty.proto";
 import "banyandb/v1/query.proto";
 import "banyandb/v1/write.proto";
 
 service TraceService {
-  rpc Query(banyandb.v1.EntityCriteria) returns (banyandb.v1.QueryResponse);
-  rpc Write(stream banyandb.v1.WriteEntity) returns (stream google.protobuf.Empty);
+  rpc Query(banyandb.v1.QueryRequest) returns (banyandb.v1.QueryResponse);
+  rpc Write(stream banyandb.v1.WriteRequest) returns (stream banyandb.v1.WriteResponse);
 }
\ No newline at end of file
diff --git a/api/proto/banyandb/v1/rpc_grpc.pb.go b/api/proto/banyandb/v1/rpc_grpc.pb.go
index a5657c0..9fb2551 100644
--- a/api/proto/banyandb/v1/rpc_grpc.pb.go
+++ b/api/proto/banyandb/v1/rpc_grpc.pb.go
@@ -8,7 +8,6 @@
 	grpc "google.golang.org/grpc"
 	codes "google.golang.org/grpc/codes"
 	status "google.golang.org/grpc/status"
-	emptypb "google.golang.org/protobuf/types/known/emptypb"
 )
 
 // This is a compile-time assertion to ensure that this generated file
@@ -16,154 +15,154 @@
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
-// TraceClient is the client API for Trace service.
+// TraceServiceClient is the client API for TraceService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type TraceClient interface {
-	Query(ctx context.Context, in *EntityCriteria, opts ...grpc.CallOption) (*QueryResponse, error)
-	Write(ctx context.Context, opts ...grpc.CallOption) (Trace_WriteClient, error)
+type TraceServiceClient interface {
+	Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResponse, error)
+	Write(ctx context.Context, opts ...grpc.CallOption) (TraceService_WriteClient, error)
 }
 
-type traceClient struct {
+type traceServiceClient struct {
 	cc grpc.ClientConnInterface
 }
 
-func NewTraceClient(cc grpc.ClientConnInterface) TraceClient {
-	return &traceClient{cc}
+func NewTraceServiceClient(cc grpc.ClientConnInterface) TraceServiceClient {
+	return &traceServiceClient{cc}
 }
 
-func (c *traceClient) Query(ctx context.Context, in *EntityCriteria, opts ...grpc.CallOption) (*QueryResponse, error) {
+func (c *traceServiceClient) Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResponse, error) {
 	out := new(QueryResponse)
-	err := c.cc.Invoke(ctx, "/banyandb.v1.Trace/Query", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/banyandb.v1.TraceService/Query", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *traceClient) Write(ctx context.Context, opts ...grpc.CallOption) (Trace_WriteClient, error) {
-	stream, err := c.cc.NewStream(ctx, &Trace_ServiceDesc.Streams[0], "/banyandb.v1.Trace/Write", opts...)
+func (c *traceServiceClient) Write(ctx context.Context, opts ...grpc.CallOption) (TraceService_WriteClient, error) {
+	stream, err := c.cc.NewStream(ctx, &TraceService_ServiceDesc.Streams[0], "/banyandb.v1.TraceService/Write", opts...)
 	if err != nil {
 		return nil, err
 	}
-	x := &traceWriteClient{stream}
+	x := &traceServiceWriteClient{stream}
 	return x, nil
 }
 
-type Trace_WriteClient interface {
-	Send(*WriteEntity) error
-	Recv() (*emptypb.Empty, error)
+type TraceService_WriteClient interface {
+	Send(*WriteRequest) error
+	Recv() (*WriteResponse, error)
 	grpc.ClientStream
 }
 
-type traceWriteClient struct {
+type traceServiceWriteClient struct {
 	grpc.ClientStream
 }
 
-func (x *traceWriteClient) Send(m *WriteEntity) error {
+func (x *traceServiceWriteClient) Send(m *WriteRequest) error {
 	return x.ClientStream.SendMsg(m)
 }
 
-func (x *traceWriteClient) Recv() (*emptypb.Empty, error) {
-	m := new(emptypb.Empty)
+func (x *traceServiceWriteClient) Recv() (*WriteResponse, error) {
+	m := new(WriteResponse)
 	if err := x.ClientStream.RecvMsg(m); err != nil {
 		return nil, err
 	}
 	return m, nil
 }
 
-// TraceServer is the server API for Trace service.
-// All implementations must embed UnimplementedTraceServer
+// TraceServiceServer is the server API for TraceService service.
+// All implementations must embed UnimplementedTraceServiceServer
 // for forward compatibility
-type TraceServer interface {
-	Query(context.Context, *EntityCriteria) (*QueryResponse, error)
-	Write(Trace_WriteServer) error
-	mustEmbedUnimplementedTraceServer()
+type TraceServiceServer interface {
+	Query(context.Context, *QueryRequest) (*QueryResponse, error)
+	Write(TraceService_WriteServer) error
+	mustEmbedUnimplementedTraceServiceServer()
 }
 
-// UnimplementedTraceServer must be embedded to have forward compatible implementations.
-type UnimplementedTraceServer struct {
+// UnimplementedTraceServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedTraceServiceServer struct {
 }
 
-func (UnimplementedTraceServer) Query(context.Context, *EntityCriteria) (*QueryResponse, error) {
+func (UnimplementedTraceServiceServer) Query(context.Context, *QueryRequest) (*QueryResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Query not implemented")
 }
-func (UnimplementedTraceServer) Write(Trace_WriteServer) error {
+func (UnimplementedTraceServiceServer) Write(TraceService_WriteServer) error {
 	return status.Errorf(codes.Unimplemented, "method Write not implemented")
 }
-func (UnimplementedTraceServer) mustEmbedUnimplementedTraceServer() {}
+func (UnimplementedTraceServiceServer) mustEmbedUnimplementedTraceServiceServer() {}
 
-// UnsafeTraceServer may be embedded to opt out of forward compatibility for this service.
-// Use of this interface is not recommended, as added methods to TraceServer will
+// UnsafeTraceServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to TraceServiceServer will
 // result in compilation errors.
-type UnsafeTraceServer interface {
-	mustEmbedUnimplementedTraceServer()
+type UnsafeTraceServiceServer interface {
+	mustEmbedUnimplementedTraceServiceServer()
 }
 
-func RegisterTraceServer(s grpc.ServiceRegistrar, srv TraceServer) {
-	s.RegisterService(&Trace_ServiceDesc, srv)
+func RegisterTraceServiceServer(s grpc.ServiceRegistrar, srv TraceServiceServer) {
+	s.RegisterService(&TraceService_ServiceDesc, srv)
 }
 
-func _Trace_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(EntityCriteria)
+func _TraceService_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(QueryRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(TraceServer).Query(ctx, in)
+		return srv.(TraceServiceServer).Query(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/banyandb.v1.Trace/Query",
+		FullMethod: "/banyandb.v1.TraceService/Query",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(TraceServer).Query(ctx, req.(*EntityCriteria))
+		return srv.(TraceServiceServer).Query(ctx, req.(*QueryRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Trace_Write_Handler(srv interface{}, stream grpc.ServerStream) error {
-	return srv.(TraceServer).Write(&traceWriteServer{stream})
+func _TraceService_Write_Handler(srv interface{}, stream grpc.ServerStream) error {
+	return srv.(TraceServiceServer).Write(&traceServiceWriteServer{stream})
 }
 
-type Trace_WriteServer interface {
-	Send(*emptypb.Empty) error
-	Recv() (*WriteEntity, error)
+type TraceService_WriteServer interface {
+	Send(*WriteResponse) error
+	Recv() (*WriteRequest, error)
 	grpc.ServerStream
 }
 
-type traceWriteServer struct {
+type traceServiceWriteServer struct {
 	grpc.ServerStream
 }
 
-func (x *traceWriteServer) Send(m *emptypb.Empty) error {
+func (x *traceServiceWriteServer) Send(m *WriteResponse) error {
 	return x.ServerStream.SendMsg(m)
 }
 
-func (x *traceWriteServer) Recv() (*WriteEntity, error) {
-	m := new(WriteEntity)
+func (x *traceServiceWriteServer) Recv() (*WriteRequest, error) {
+	m := new(WriteRequest)
 	if err := x.ServerStream.RecvMsg(m); err != nil {
 		return nil, err
 	}
 	return m, nil
 }
 
-// Trace_ServiceDesc is the grpc.ServiceDesc for Trace service.
+// TraceService_ServiceDesc is the grpc.ServiceDesc for TraceService service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
-var Trace_ServiceDesc = grpc.ServiceDesc{
-	ServiceName: "banyandb.v1.Trace",
-	HandlerType: (*TraceServer)(nil),
+var TraceService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "banyandb.v1.TraceService",
+	HandlerType: (*TraceServiceServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
 			MethodName: "Query",
-			Handler:    _Trace_Query_Handler,
+			Handler:    _TraceService_Query_Handler,
 		},
 	},
 	Streams: []grpc.StreamDesc{
 		{
 			StreamName:    "Write",
-			Handler:       _Trace_Write_Handler,
+			Handler:       _TraceService_Write_Handler,
 			ServerStreams: true,
 			ClientStreams: true,
 		},
diff --git a/api/proto/banyandb/v1/write.pb.go b/api/proto/banyandb/v1/write.pb.go
index 74c26da..6808076 100644
--- a/api/proto/banyandb/v1/write.pb.go
+++ b/api/proto/banyandb/v1/write.pb.go
@@ -430,7 +430,7 @@
 	return nil
 }
 
-type WriteEntity struct {
+type WriteRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -441,8 +441,8 @@
 	Entity *EntityValue `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"`
 }
 
-func (x *WriteEntity) Reset() {
-	*x = WriteEntity{}
+func (x *WriteRequest) Reset() {
+	*x = WriteRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_banyandb_v1_write_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -450,13 +450,13 @@
 	}
 }
 
-func (x *WriteEntity) String() string {
+func (x *WriteRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*WriteEntity) ProtoMessage() {}
+func (*WriteRequest) ProtoMessage() {}
 
-func (x *WriteEntity) ProtoReflect() protoreflect.Message {
+func (x *WriteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_banyandb_v1_write_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -468,25 +468,63 @@
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use WriteEntity.ProtoReflect.Descriptor instead.
-func (*WriteEntity) Descriptor() ([]byte, []int) {
+// Deprecated: Use WriteRequest.ProtoReflect.Descriptor instead.
+func (*WriteRequest) Descriptor() ([]byte, []int) {
 	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{6}
 }
 
-func (x *WriteEntity) GetMetadata() *Metadata {
+func (x *WriteRequest) GetMetadata() *Metadata {
 	if x != nil {
 		return x.Metadata
 	}
 	return nil
 }
 
-func (x *WriteEntity) GetEntity() *EntityValue {
+func (x *WriteRequest) GetEntity() *EntityValue {
 	if x != nil {
 		return x.Entity
 	}
 	return nil
 }
 
+type WriteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *WriteResponse) Reset() {
+	*x = WriteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_v1_write_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WriteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WriteResponse) ProtoMessage() {}
+
+func (x *WriteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_v1_write_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use WriteResponse.ProtoReflect.Descriptor instead.
+func (*WriteResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{7}
+}
+
 var File_banyandb_v1_write_proto protoreflect.FileDescriptor
 
 var file_banyandb_v1_write_proto_rawDesc = []byte{
@@ -533,21 +571,22 @@
 	0x61, 0x74, 0x61, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x66, 0x69, 0x65,
 	0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x61, 0x6e, 0x79,
 	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66,
-	0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x72, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x6e,
-	0x74, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
-	0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d,
-	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74,
-	0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x60, 0x0a, 0x1e, 0x6f, 0x72, 0x67,
-	0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69,
-	0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e, 0x67, 0x69, 0x74,
-	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73,
-	0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x73, 0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08,
+	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69,
+	0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, 0x57, 0x72,
+	0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x60, 0x0a, 0x1e, 0x6f,
+	0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c,
+	0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e, 0x67,
+	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65,
+	0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -562,7 +601,7 @@
 	return file_banyandb_v1_write_proto_rawDescData
 }
 
-var file_banyandb_v1_write_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_banyandb_v1_write_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
 var file_banyandb_v1_write_proto_goTypes = []interface{}{
 	(*Str)(nil),                   // 0: banyandb.v1.Str
 	(*Int)(nil),                   // 1: banyandb.v1.Int
@@ -570,26 +609,27 @@
 	(*IntArray)(nil),              // 3: banyandb.v1.IntArray
 	(*Field)(nil),                 // 4: banyandb.v1.Field
 	(*EntityValue)(nil),           // 5: banyandb.v1.EntityValue
-	(*WriteEntity)(nil),           // 6: banyandb.v1.WriteEntity
-	(structpb.NullValue)(0),       // 7: google.protobuf.NullValue
-	(*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp
-	(*Metadata)(nil),              // 9: banyandb.v1.Metadata
+	(*WriteRequest)(nil),          // 6: banyandb.v1.WriteRequest
+	(*WriteResponse)(nil),         // 7: banyandb.v1.WriteResponse
+	(structpb.NullValue)(0),       // 8: google.protobuf.NullValue
+	(*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp
+	(*Metadata)(nil),              // 10: banyandb.v1.Metadata
 }
 var file_banyandb_v1_write_proto_depIdxs = []int32{
-	7, // 0: banyandb.v1.Field.null:type_name -> google.protobuf.NullValue
-	0, // 1: banyandb.v1.Field.str:type_name -> banyandb.v1.Str
-	2, // 2: banyandb.v1.Field.str_array:type_name -> banyandb.v1.StrArray
-	1, // 3: banyandb.v1.Field.int:type_name -> banyandb.v1.Int
-	3, // 4: banyandb.v1.Field.int_array:type_name -> banyandb.v1.IntArray
-	8, // 5: banyandb.v1.EntityValue.timestamp:type_name -> google.protobuf.Timestamp
-	4, // 6: banyandb.v1.EntityValue.fields:type_name -> banyandb.v1.Field
-	9, // 7: banyandb.v1.WriteEntity.metadata:type_name -> banyandb.v1.Metadata
-	5, // 8: banyandb.v1.WriteEntity.entity:type_name -> banyandb.v1.EntityValue
-	9, // [9:9] is the sub-list for method output_type
-	9, // [9:9] is the sub-list for method input_type
-	9, // [9:9] is the sub-list for extension type_name
-	9, // [9:9] is the sub-list for extension extendee
-	0, // [0:9] is the sub-list for field type_name
+	8,  // 0: banyandb.v1.Field.null:type_name -> google.protobuf.NullValue
+	0,  // 1: banyandb.v1.Field.str:type_name -> banyandb.v1.Str
+	2,  // 2: banyandb.v1.Field.str_array:type_name -> banyandb.v1.StrArray
+	1,  // 3: banyandb.v1.Field.int:type_name -> banyandb.v1.Int
+	3,  // 4: banyandb.v1.Field.int_array:type_name -> banyandb.v1.IntArray
+	9,  // 5: banyandb.v1.EntityValue.timestamp:type_name -> google.protobuf.Timestamp
+	4,  // 6: banyandb.v1.EntityValue.fields:type_name -> banyandb.v1.Field
+	10, // 7: banyandb.v1.WriteRequest.metadata:type_name -> banyandb.v1.Metadata
+	5,  // 8: banyandb.v1.WriteRequest.entity:type_name -> banyandb.v1.EntityValue
+	9,  // [9:9] is the sub-list for method output_type
+	9,  // [9:9] is the sub-list for method input_type
+	9,  // [9:9] is the sub-list for extension type_name
+	9,  // [9:9] is the sub-list for extension extendee
+	0,  // [0:9] is the sub-list for field type_name
 }
 
 func init() { file_banyandb_v1_write_proto_init() }
@@ -672,7 +712,19 @@
 			}
 		}
 		file_banyandb_v1_write_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*WriteEntity); i {
+			switch v := v.(*WriteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_v1_write_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WriteResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -697,7 +749,7 @@
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_banyandb_v1_write_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   7,
+			NumMessages:   8,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/api/proto/banyandb/v1/write.proto b/api/proto/banyandb/v1/write.proto
index 7eb4a48..3d7ddc0 100644
--- a/api/proto/banyandb/v1/write.proto
+++ b/api/proto/banyandb/v1/write.proto
@@ -68,9 +68,11 @@
   repeated Field fields = 4;
 }
 
-message WriteEntity {
+message WriteRequest {
   // the metadata is only required in the first write.
   Metadata metadata = 1;
   // the entity is required.
   EntityValue entity = 2;
-}
\ No newline at end of file
+}
+
+message WriteResponse {}
\ No newline at end of file
diff --git a/banyand/liaison/grpc/grpc.go b/banyand/liaison/grpc/grpc.go
index 9288b82..91a75d7 100644
--- a/banyand/liaison/grpc/grpc.go
+++ b/banyand/liaison/grpc/grpc.go
@@ -119,7 +119,7 @@
 
 	s.ser = grpc.NewServer()
 	// TODO: add server implementation here
-	v1.RegisterTraceServer(s.ser, v1.UnimplementedTraceServer{})
+	v1.RegisterTraceServiceServer(s.ser, v1.UnimplementedTraceServiceServer{})
 
 	return s.ser.Serve(lis)
 }
diff --git a/pkg/pb/query.go b/pkg/pb/query.go
index 7834494..f24e99f 100644
--- a/pkg/pb/query.go
+++ b/pkg/pb/query.go
@@ -39,17 +39,17 @@
 	}
 )
 
-type EntityCriteriaBuilder struct {
-	ec *v1.EntityCriteria
+type QueryRequestBuilder struct {
+	ec *v1.QueryRequest
 }
 
-func NewEntityCriteriaBuilder() *EntityCriteriaBuilder {
-	return &EntityCriteriaBuilder{
-		ec: &v1.EntityCriteria{},
+func NewQueryRequestBuilder() *QueryRequestBuilder {
+	return &QueryRequestBuilder{
+		ec: &v1.QueryRequest{},
 	}
 }
 
-func (b *EntityCriteriaBuilder) Metadata(group, name string) *EntityCriteriaBuilder {
+func (b *QueryRequestBuilder) Metadata(group, name string) *QueryRequestBuilder {
 	b.ec.Metadata = &v1.Metadata{
 		Group: group,
 		Name:  name,
@@ -57,17 +57,17 @@
 	return b
 }
 
-func (b *EntityCriteriaBuilder) Limit(limit uint32) *EntityCriteriaBuilder {
+func (b *QueryRequestBuilder) Limit(limit uint32) *QueryRequestBuilder {
 	b.ec.Limit = limit
 	return b
 }
 
-func (b *EntityCriteriaBuilder) Offset(offset uint32) *EntityCriteriaBuilder {
+func (b *QueryRequestBuilder) Offset(offset uint32) *QueryRequestBuilder {
 	b.ec.Offset = offset
 	return b
 }
 
-func (b *EntityCriteriaBuilder) Fields(items ...interface{}) *EntityCriteriaBuilder {
+func (b *QueryRequestBuilder) Fields(items ...interface{}) *QueryRequestBuilder {
 	if len(items)%3 != 0 {
 		panic("expect even number of arguments")
 	}
@@ -199,12 +199,12 @@
 	}
 }
 
-func (b *EntityCriteriaBuilder) Projection(projections ...string) *EntityCriteriaBuilder {
+func (b *QueryRequestBuilder) Projection(projections ...string) *QueryRequestBuilder {
 	b.ec.Projection = &v1.Projection{KeyNames: projections}
 	return b
 }
 
-func (b *EntityCriteriaBuilder) OrderBy(fieldName string, sort v1.QueryOrder_Sort) *EntityCriteriaBuilder {
+func (b *QueryRequestBuilder) OrderBy(fieldName string, sort v1.QueryOrder_Sort) *QueryRequestBuilder {
 	b.ec.OrderBy = &v1.QueryOrder{
 		KeyName: fieldName,
 		Sort:    sort,
@@ -212,7 +212,7 @@
 	return b
 }
 
-func (b *EntityCriteriaBuilder) TimeRange(sT, eT time.Time) *EntityCriteriaBuilder {
+func (b *QueryRequestBuilder) TimeRange(sT, eT time.Time) *QueryRequestBuilder {
 	b.ec.TimeRange = &v1.TimeRange{
 		Begin: timestamppb.New(sT),
 		End:   timestamppb.New(eT),
@@ -220,7 +220,7 @@
 	return b
 }
 
-func (b *EntityCriteriaBuilder) Build() *v1.EntityCriteria {
+func (b *QueryRequestBuilder) Build() *v1.QueryRequest {
 	return b.ec
 }
 
diff --git a/pkg/pb/write.go b/pkg/pb/write.go
index 94ff233..e3b23a8 100644
--- a/pkg/pb/write.go
+++ b/pkg/pb/write.go
@@ -26,15 +26,15 @@
 	"github.com/apache/skywalking-banyandb/pkg/convert"
 )
 
-type WriteEntityBuilder struct {
-	we *v1.WriteEntity
+type WriteRequestBuilder struct {
+	we *v1.WriteRequest
 }
 
-func NewWriteEntityBuilder() *WriteEntityBuilder {
-	return &WriteEntityBuilder{we: &v1.WriteEntity{}}
+func NewWriteEntityBuilder() *WriteRequestBuilder {
+	return &WriteRequestBuilder{we: &v1.WriteRequest{}}
 }
 
-func (web *WriteEntityBuilder) Metadata(group, name string) *WriteEntityBuilder {
+func (web *WriteRequestBuilder) Metadata(group, name string) *WriteRequestBuilder {
 	web.we.Metadata = &v1.Metadata{
 		Group: group,
 		Name:  name,
@@ -42,12 +42,12 @@
 	return web
 }
 
-func (web *WriteEntityBuilder) EntityValue(ev *v1.EntityValue) *WriteEntityBuilder {
+func (web *WriteRequestBuilder) EntityValue(ev *v1.EntityValue) *WriteRequestBuilder {
 	web.we.Entity = ev
 	return web
 }
 
-func (web *WriteEntityBuilder) Build() *v1.WriteEntity {
+func (web *WriteRequestBuilder) Build() *v1.WriteRequest {
 	return web.we
 }
 
diff --git a/pkg/query/logical/analyzer.go b/pkg/query/logical/analyzer.go
index 5d313d9..bb9296f 100644
--- a/pkg/query/logical/analyzer.go
+++ b/pkg/query/logical/analyzer.go
@@ -79,7 +79,7 @@
 	return s, nil
 }
 
-func (a *Analyzer) Analyze(_ context.Context, criteria *apiv1.EntityCriteria, traceMetadata *common.Metadata, s Schema) (Plan, error) {
+func (a *Analyzer) Analyze(_ context.Context, criteria *apiv1.QueryRequest, traceMetadata *common.Metadata, s Schema) (Plan, error) {
 	// parse tableScan
 	timeRange := criteria.GetTimeRange()
 
diff --git a/pkg/query/logical/analyzer_test.go b/pkg/query/logical/analyzer_test.go
index 555f94c..485cf84 100644
--- a/pkg/query/logical/analyzer_test.go
+++ b/pkg/query/logical/analyzer_test.go
@@ -40,7 +40,7 @@
 
 	sT, eT := time.Now().Add(-3*time.Hour), time.Now()
 
-	criteria := pb.NewEntityCriteriaBuilder().
+	criteria := pb.NewQueryRequestBuilder().
 		Limit(0).
 		Offset(0).
 		Metadata("default", "trace").
@@ -76,7 +76,7 @@
 
 	sT, eT := time.Now().Add(-3*time.Hour), time.Now()
 
-	criteria := pb.NewEntityCriteriaBuilder().
+	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
 		Offset(10).
 		OrderBy("service_instance_id", apiv1.QueryOrder_SORT_DESC).
@@ -120,7 +120,7 @@
 
 	ana := logical.DefaultAnalyzer()
 
-	criteria := pb.NewEntityCriteriaBuilder().
+	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
 		Offset(10).
 		Metadata("default", "trace").
@@ -149,7 +149,7 @@
 
 	ana := logical.DefaultAnalyzer()
 
-	criteria := pb.NewEntityCriteriaBuilder().
+	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
 		Offset(10).
 		OrderBy("service_instance_id", apiv1.QueryOrder_SORT_DESC).
@@ -176,7 +176,7 @@
 
 	ana := logical.DefaultAnalyzer()
 
-	criteria := pb.NewEntityCriteriaBuilder().
+	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
 		Offset(10).
 		OrderBy("duration", apiv1.QueryOrder_SORT_DESC).
@@ -202,7 +202,7 @@
 
 	ana := logical.DefaultAnalyzer()
 
-	criteria := pb.NewEntityCriteriaBuilder().
+	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
 		Offset(10).
 		OrderBy("duration", apiv1.QueryOrder_SORT_DESC).
@@ -228,7 +228,7 @@
 
 	ana := logical.DefaultAnalyzer()
 
-	criteria := pb.NewEntityCriteriaBuilder().
+	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
 		Offset(10).
 		Metadata("default", "trace").
diff --git a/pkg/query/logical/common_test.go b/pkg/query/logical/common_test.go
index 33b7493..236897f 100644
--- a/pkg/query/logical/common_test.go
+++ b/pkg/query/logical/common_test.go
@@ -173,7 +173,7 @@
 
 	sT, eT := time.Now().Add(-3*time.Hour), time.Now()
 
-	criteria := pb.NewEntityCriteriaBuilder().
+	criteria := pb.NewQueryRequestBuilder().
 		Limit(0).Offset(0).
 		Metadata("default", "trace").
 		TimeRange(sT, eT).